diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index fd8372bab5..143b6ceb45 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -1936,7 +1936,8 @@ def ObjCRequiresPropertyDefs : InheritableAttr { } def Unused : InheritableAttr { - let Spellings = [CXX11<"", "maybe_unused", 201603>, GCC<"unused">]; + let Spellings = [CXX11<"", "maybe_unused", 201603>, GCC<"unused">, + C2x<"", "maybe_unused">]; let Subjects = SubjectList<[Var, ObjCIvar, Type, Enum, EnumConstant, Label, Field, ObjCMethod, FunctionLike], WarnDiag, "ExpectedForMaybeUnused">; diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 5e7ed2d59e..c92d0aa8f9 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -79,7 +79,8 @@ static void DiagnoseUnusedOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc) { if (const auto *A = D->getAttr()) { // [[maybe_unused]] should not diagnose uses, but __attribute__((unused)) // should diagnose them. - if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused) { + if (A->getSemanticSpelling() != UnusedAttr::CXX11_maybe_unused && + A->getSemanticSpelling() != UnusedAttr::C2x_maybe_unused) { const Decl *DC = cast_or_null(S.getCurObjCLexicalContext()); if (DC && !DC->hasAttr()) S.Diag(Loc, diag::warn_used_but_marked_unused) << D->getDeclName(); diff --git a/test/Sema/c2x-maybe_unused-errors.c b/test/Sema/c2x-maybe_unused-errors.c new file mode 100644 index 0000000000..68150dded9 --- /dev/null +++ b/test/Sema/c2x-maybe_unused-errors.c @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -fsyntax-only -Wunused -fdouble-square-bracket-attributes -verify %s + +struct [[maybe_unused]] S1 { // ok + int a [[maybe_unused]]; +}; +struct [[maybe_unused maybe_unused]] S2 { // expected-error {{attribute 'maybe_unused' cannot appear multiple times in an attribute specifier}} + int a; +}; +struct [[maybe_unused("Wrong")]] S3 { // expected-error {{'maybe_unused' cannot have an argument list}} + int a; +}; + diff --git a/test/Sema/c2x-maybe_unused.c b/test/Sema/c2x-maybe_unused.c new file mode 100644 index 0000000000..816cf7835f --- /dev/null +++ b/test/Sema/c2x-maybe_unused.c @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -fsyntax-only -Wunused -fdouble-square-bracket-attributes -verify %s + +struct [[maybe_unused]] S1 { // ok + int a [[maybe_unused]]; +}; + +enum [[maybe_unused]] E1 { + EnumVal [[maybe_unused]] +}; + +[[maybe_unused]] void unused_func([[maybe_unused]] int parm) { + typedef int maybe_unused_int [[maybe_unused]]; + [[maybe_unused]] int I; +} + +void f1(void) { + int x; // expected-warning {{unused variable}} + typedef int I; // expected-warning {{unused typedef 'I'}} + + // Should not warn about these due to not being used. + [[maybe_unused]] int y; + typedef int maybe_unused_int [[maybe_unused]]; + + // Should not warn about these uses. + struct S1 s; + maybe_unused_int test; + y = 12; +} + +void f2(void); +[[maybe_unused]] void f2(void); + +void f2(void) { +} +