Author: aaronballman Date: Sat Mar 3 13:02:09 2018 New Revision: 326665 URL: http://llvm.org/viewvc/llvm-project?rev=326665&view=rev Log: Create a subject list for the `used` attribute rather than use custom checking logic.
This changes the diagnostic wording somewhat, but otherwise intends no functional change to the attribute. Modified: cfe/trunk/include/clang/Basic/Attr.td cfe/trunk/lib/Sema/SemaDeclAttr.cpp cfe/trunk/test/Sema/attr-used.c Modified: cfe/trunk/include/clang/Basic/Attr.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=326665&r1=326664&r2=326665&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/Attr.td (original) +++ cfe/trunk/include/clang/Basic/Attr.td Sat Mar 3 13:02:09 2018 @@ -83,6 +83,9 @@ def LocalVar : SubsetSubject<Var, def NonParmVar : SubsetSubject<Var, [{S->getKind() != Decl::ParmVar}], "variables">; +def NonLocalVar : SubsetSubject<Var, + [{!S->hasLocalStorage()}], + "variables with non-local storage">; def NonBitField : SubsetSubject<Field, [{!S->isBitField()}], "non-bit-field non-static data members">; @@ -2007,6 +2010,7 @@ def Unused : InheritableAttr { def Used : InheritableAttr { let Spellings = [GCC<"used">]; + let Subjects = SubjectList<[Function, ObjCMethod, NonLocalVar]>; let Documentation = [Undocumented]; } Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=326665&r1=326664&r2=326665&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Sat Mar 3 13:02:09 2018 @@ -2086,23 +2086,6 @@ static void handleDisableTailCallsAttr(S AL.getRange(), S.Context, AL.getAttributeSpellingListIndex())); } -static void handleUsedAttr(Sema &S, Decl *D, const AttributeList &AL) { - if (const auto *VD = dyn_cast<VarDecl>(D)) { - if (VD->hasLocalStorage()) { - S.Diag(AL.getLoc(), diag::warn_attribute_ignored) << AL.getName(); - return; - } - } else if (!isFunctionOrMethod(D)) { - S.Diag(AL.getLoc(), diag::warn_attribute_wrong_decl_type) - << AL.getName() << ExpectedVariableOrFunction; - return; - } - - D->addAttr(::new (S.Context) - UsedAttr(AL.getRange(), S.Context, - AL.getAttributeSpellingListIndex())); -} - static void handleUnusedAttr(Sema &S, Decl *D, const AttributeList &AL) { bool IsCXX17Attr = AL.isCXX11Attribute() && !AL.getScopeName(); @@ -6248,7 +6231,7 @@ static void ProcessDeclAttribute(Sema &S handleDisableTailCallsAttr(S, D, AL); break; case AttributeList::AT_Used: - handleUsedAttr(S, D, AL); + handleSimpleAttribute<UsedAttr>(S, D, AL); break; case AttributeList::AT_Visibility: handleVisibilityAttr(S, D, AL, false); Modified: cfe/trunk/test/Sema/attr-used.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-used.c?rev=326665&r1=326664&r2=326665&view=diff ============================================================================== --- cfe/trunk/test/Sema/attr-used.c (original) +++ cfe/trunk/test/Sema/attr-used.c Sat Mar 3 13:02:09 2018 @@ -3,7 +3,7 @@ extern int l0 __attribute__((used)); // expected-warning {{'used' attribute ignored}} __private_extern__ int l1 __attribute__((used)); // expected-warning {{'used' attribute ignored}} -struct __attribute__((used)) s { // expected-warning {{'used' attribute only applies to variables and functions}} +struct __attribute__((used)) s { // expected-warning {{'used' attribute only applies to functions, Objective-C methods, and variables with non-local storage}} int x; }; @@ -14,7 +14,7 @@ static void __attribute__((used)) f0(voi void f1() { static int a __attribute__((used)); - int b __attribute__((used)); // expected-warning {{'used' attribute ignored}} + int b __attribute__((used)); // expected-warning {{'used' attribute only applies to functions, Objective-C methods, and variables with non-local storage}} } static void __attribute__((used)) f0(void); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits