r326665 - Create a subject list for the `used` attribute rather than use custom checking logic.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Sat Mar 3 15:16:49 PST 2018


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 at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180303/41202f77/attachment-0001.html>


More information about the cfe-commits mailing list