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