diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-06-21 23:42:09 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-06-21 23:42:09 +0000 |
commit | 2602a683e09c84ec4e28314abb60c6e2a900ef0e (patch) | |
tree | 785be00529f1278236e6d3eb08d0d07201d4f9c0 /clang | |
parent | cf5f43ce1fdd4bbade729dc478ea77efc6d807b5 (diff) | |
download | bcm5719-llvm-2602a683e09c84ec4e28314abb60c6e2a900ef0e.tar.gz bcm5719-llvm-2602a683e09c84ec4e28314abb60c6e2a900ef0e.zip |
Fix PR10168: don't warn for unused non-dependent variables in both the template definition and each instantiation.
llvm-svn: 133580
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/for-range-unused.cpp | 5 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-unused-variables.cpp | 26 |
3 files changed, 32 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index e78aa2991e7..cc66ec67593 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -415,8 +415,10 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) { !Var->isCXXForRangeDecl()) SemaRef.ActOnUninitializedDecl(Var, false); - // Diagnose unused local variables. - if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed()) + // Diagnose unused local variables with dependent types, where the diagnostic + // will have been deferred. + if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed() && + D->getType()->isDependentType()) SemaRef.DiagnoseUnusedDecl(Var); return Var; diff --git a/clang/test/SemaCXX/for-range-unused.cpp b/clang/test/SemaCXX/for-range-unused.cpp index 7e26c786ed1..7b7d84d3f9c 100644 --- a/clang/test/SemaCXX/for-range-unused.cpp +++ b/clang/test/SemaCXX/for-range-unused.cpp @@ -5,8 +5,7 @@ template <typename T> struct Vector { void doIt() { - // FIXME: PR10168: Only warn once for this! - int a; // expected-warning 2{{unused variable 'a'}} + int a; // expected-warning {{unused variable 'a'}} for (auto& e : elements) ; @@ -18,5 +17,5 @@ template <typename T> int main(int, char**) { Vector<int> vector; - vector.doIt(); // expected-note {{requested here}} + vector.doIt(); } diff --git a/clang/test/SemaCXX/warn-unused-variables.cpp b/clang/test/SemaCXX/warn-unused-variables.cpp index 81f22a796a0..5ba1f2a5f34 100644 --- a/clang/test/SemaCXX/warn-unused-variables.cpp +++ b/clang/test/SemaCXX/warn-unused-variables.cpp @@ -54,3 +54,29 @@ void unused_local_static() { static int y = 0; // expected-warning{{unused variable 'y'}} #pragma unused(x) } + +// PR10168 +namespace PR10168 { + // We expect a warning in the definition only for non-dependent variables, and + // a warning in the instantiation only for dependent variables. + template<typename T> + struct S { + void f() { + int a; // expected-warning {{unused variable 'a'}} + T b; // expected-warning 2{{unused variable 'b'}} + } + }; + + template<typename T> + void f() { + int a; // expected-warning {{unused variable 'a'}} + T b; // expected-warning 2{{unused variable 'b'}} + } + + void g() { + S<int>().f(); // expected-note {{here}} + S<char>().f(); // expected-note {{here}} + f<int>(); // expected-note {{here}} + f<char>(); // expected-note {{here}} + } +} |