From 59a8e49f01ee7ef465deced6f86ef6d0ee9b9319 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sun, 28 Oct 2012 07:39:29 +0000 Subject: [PATCH] Revert functional part of r166896 and just suppress -Wunneeded-internal-declaration for reference types for now. This needs more work; the cases we currently miss are a bit random. llvm-svn: 166899 --- clang/lib/Sema/SemaDecl.cpp | 15 +++++++-------- clang/test/SemaCXX/warn-unused-filescoped.cpp | 5 +++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6eef427..0eb1231 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1204,18 +1204,17 @@ bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const { Context.DeclMustBeEmitted(FD)) return false; } else if (const VarDecl *VD = dyn_cast(D)) { + // Don't warn on variables of const-qualified or reference type, since their + // values can be used even if though they're not odr-used, and because const + // qualified variables can appear in headers in contexts where they're not + // intended to be used. + // FIXME: Use more principled rules for these exemptions. if (!VD->isFileVarDecl() || + VD->getType().isConstQualified() || + VD->getType()->isReferenceType() || 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; diff --git a/clang/test/SemaCXX/warn-unused-filescoped.cpp b/clang/test/SemaCXX/warn-unused-filescoped.cpp index 328d8bb..ad896b5 100644 --- a/clang/test/SemaCXX/warn-unused-filescoped.cpp +++ b/clang/test/SemaCXX/warn-unused-filescoped.cpp @@ -95,8 +95,9 @@ namespace test5 { int f(int &); int k = f(r); - static const int m = n; // expected-warning {{not needed and will not be emitted}} + // FIXME: We should produce warnings for both of these. + static const int m = n; int x = sizeof(m); - static const double d = 0.0; // expected-warning {{not needed and will not be emitted}} + static const double d = 0.0; int y = sizeof(d); } -- 2.7.4