]> granicus.if.org Git - clang/commitdiff
Fix regression from r190382.
authorEli Friedman <eli.friedman@gmail.com>
Tue, 10 Sep 2013 21:10:25 +0000 (21:10 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 10 Sep 2013 21:10:25 +0000 (21:10 +0000)
Make sure we perform the correct "referenced-but-not-used" check for
static member constants.

Fixes bug reported on cfe-commits by Alexey Samsonov.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190437 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.cpp
lib/Sema/SemaDecl.cpp
test/SemaCXX/warn-unused-filescoped.cpp

index fbff9499d53a37b13fe8155011dbd3bbd36a943a..91f6d5f7c21346e12d3ff2e635a0b2daee4c3ba9 100644 (file)
@@ -358,6 +358,15 @@ static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
   }
 
   if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
+    // If a variable usable in constant expressions is referenced,
+    // don't warn if it isn't used: if the value of a variable is required
+    // for the computation of a constant expression, it doesn't make sense to
+    // warn even if the variable isn't odr-used.  (isReferenced doesn't
+    // precisely reflect that, but it's a decent approximation.)
+    if (VD->isReferenced() &&
+        VD->isUsableInConstantExpressions(SemaRef->Context))
+      return true;
+
     // UnusedFileScopedDecls stores the first declaration.
     // The declaration may have become definition so check again.
     const VarDecl *DeclToCheck = VD->getDefinition();
index 5dbfa105e13c7208489f59e71d4cdfcef66087ed..9c93e113125c7ecc7503e6109dccb3f7f8c7ec3f 100644 (file)
@@ -1220,14 +1220,6 @@ bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
     if (!isMainFileLoc(*this, VD->getLocation()))
       return false;
 
-    // If a variable usable in constant expressions is referenced,
-    // don't warn if it isn't used: if the value of a variable is required
-    // for the computation of a constant expression, it doesn't make sense to
-    // warn even if the variable isn't odr-used.  (isReferenced doesn't
-    // precisely reflect that, but it's a decent approximation.)
-    if (VD->isReferenced() && VD->isUsableInConstantExpressions(Context))
-      return false;
-
     if (Context.DeclMustBeEmitted(VD))
       return false;
 
index aa2b2e5103cb6e92f55c8a68ab79e834acefaf6d..65f10e6695aa4c7e0b2b68aa446eef7408deeb88 100644 (file)
@@ -178,4 +178,13 @@ namespace pr14776 {
   auto b = X(); // expected-warning {{unused variable 'b'}}
 }
 
+namespace UndefinedInternalStaticMember {
+  namespace {
+    struct X {
+      static const unsigned x = 3;
+      int y[x];
+    };
+  }
+}
+
 #endif