r188588 - Don't reject attribute used in an "extern const" variable definition.

Rafael Espindola rafael.espindola at gmail.com
Fri Aug 16 16:18:50 PDT 2013


Author: rafael
Date: Fri Aug 16 18:18:50 2013
New Revision: 188588

URL: http://llvm.org/viewvc/llvm-project?rev=188588&view=rev
Log:
Don't reject attribute used in an "extern const" variable definition.

Before this patch we would warn and drop the attribute in
extern const char test3[] __attribute__((used)) = "";

Added:
    cfe/trunk/test/SemaCXX/attr-used.cpp
Modified:
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/lib/Sema/SemaDeclAttr.cpp

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=188588&r1=188587&r2=188588&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Aug 16 18:18:50 2013
@@ -8795,6 +8795,13 @@ Sema::FinalizeDeclaration(Decl *ThisDecl
   if (!VD)
     return;
 
+  if (UsedAttr *Attr = VD->getAttr<UsedAttr>()) {
+    if (!Attr->isInherited() && !VD->isThisDeclarationADefinition()) {
+      Diag(Attr->getLocation(), diag::warn_attribute_ignored) << "used";
+      VD->dropAttr<UsedAttr>();
+    }
+  }
+
   const DeclContext *DC = VD->getDeclContext();
   // If there's a #pragma GCC visibility in scope, and this isn't a class
   // member, set the visibility of this variable.

Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=188588&r1=188587&r2=188588&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Aug 16 18:18:50 2013
@@ -1944,7 +1944,7 @@ static void handleUsedAttr(Sema &S, Decl
   }
 
   if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
-    if (VD->hasLocalStorage() || VD->hasExternalStorage()) {
+    if (VD->hasLocalStorage()) {
       S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << "used";
       return;
     }

Added: cfe/trunk/test/SemaCXX/attr-used.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-used.cpp?rev=188588&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/attr-used.cpp (added)
+++ cfe/trunk/test/SemaCXX/attr-used.cpp Fri Aug 16 18:18:50 2013
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+extern char test1[] __attribute__((used)); // expected-warning {{used attribute ignored}}
+extern const char test2[] __attribute__((used)); // expected-warning {{used attribute ignored}}
+extern const char test3[] __attribute__((used)) = "";





More information about the cfe-commits mailing list