Good suggestion -- I've switched the order in r326676. ~Aaron
On Sat, Mar 3, 2018 at 6:16 PM, Nico Weber <tha...@chromium.org> wrote: > Is it easy to mention variables first in the diag? That's probably the most > common subject for this attribute. (If it's not easy, nevermind -- > definitely a polish thing.) > > On Sat, Mar 3, 2018, 4:04 PM Aaron Ballman via cfe-commits > <cfe-commits@lists.llvm.org> wrote: >> >> 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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits