summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/Sema.cpp9
-rw-r--r--clang/lib/Sema/SemaDecl.cpp8
-rw-r--r--clang/test/SemaCXX/warn-unused-filescoped.cpp9
3 files changed, 18 insertions, 8 deletions
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index fbff9499d53..91f6d5f7c21 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -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();
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 5dbfa105e13..9c93e113125 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -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;
diff --git a/clang/test/SemaCXX/warn-unused-filescoped.cpp b/clang/test/SemaCXX/warn-unused-filescoped.cpp
index aa2b2e5103c..65f10e6695a 100644
--- a/clang/test/SemaCXX/warn-unused-filescoped.cpp
+++ b/clang/test/SemaCXX/warn-unused-filescoped.cpp
@@ -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
OpenPOWER on IntegriCloud