summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-10-28 04:47:21 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-10-28 04:47:21 +0000
commit27501e787c945e1f344072468d6b695d2b8827a9 (patch)
tree8ca5dc47d8a3ab7a5a8e248a7f20264dfa63cc59 /clang/lib/Sema/SemaDecl.cpp
parent44938a738a6cfd1b566186a6a2a0e5ab5250dfba (diff)
downloadbcm5719-llvm-27501e787c945e1f344072468d6b695d2b8827a9.tar.gz
bcm5719-llvm-27501e787c945e1f344072468d6b695d2b8827a9.zip
In -Wunneeded-internal-declaration, suppress the warning for variables which
might have been used in constant expressions, rather than suppressing it for variables which are const. The important thing here is that such variables can have their values used without actually being marked as 'used'. llvm-svn: 166896
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index e8d017c0982..35761903106 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1205,10 +1205,17 @@ bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
return false;
} else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
if (!VD->isFileVarDecl() ||
- VD->getType().isConstant(Context) ||
Context.DeclMustBeEmitted(VD))
return false;
+ // If a variable is usable in constant expressions and it's not odr-used,
+ // its value may still have been used. Conservatively suppress the warning
+ // in this case.
+ const VarDecl *VDWithInit = 0;
+ if (VD->isUsableInConstantExpressions(Context) &&
+ VD->getAnyInitializer(VDWithInit) && VDWithInit->checkInitIsICE())
+ return false;
+
if (VD->isStaticDataMember() &&
VD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation)
return false;
OpenPOWER on IntegriCloud