summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/Sema.cpp
diff options
context:
space:
mode:
authorVassil Vassilev <v.g.vassilev@gmail.com>2017-04-11 10:13:54 +0000
committerVassil Vassilev <v.g.vassilev@gmail.com>2017-04-11 10:13:54 +0000
commite63a39d6cb5dac53b30e0dbda1af979f01a81158 (patch)
treecc18ca7eeea126b822b3718bac0e6e60f2b41423 /clang/lib/Sema/Sema.cpp
parent64ad85f8ba93a932a95872b0800b81e54c2e1452 (diff)
downloadbcm5719-llvm-e63a39d6cb5dac53b30e0dbda1af979f01a81158.tar.gz
bcm5719-llvm-e63a39d6cb5dac53b30e0dbda1af979f01a81158.zip
Warn about unused static file scope function template declarations.
Reviewed by Richard Smith (D29877)! llvm-svn: 299930
Diffstat (limited to 'clang/lib/Sema/Sema.cpp')
-rw-r--r--clang/lib/Sema/Sema.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 294b56059b3..f943ab56507 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -470,6 +470,13 @@ static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
return true;
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+ // If this is a function template and none of its specializations is used,
+ // we should warn.
+ if (FunctionTemplateDecl *Template = FD->getDescribedFunctionTemplate())
+ for (const auto *Spec : Template->specializations())
+ if (ShouldRemoveFromUnused(SemaRef, Spec))
+ return true;
+
// UnusedFileScopedDecls stores the first declaration.
// The declaration may have become definition so check again.
const FunctionDecl *DeclToCheck;
@@ -493,6 +500,13 @@ static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
VD->isUsableInConstantExpressions(SemaRef->Context))
return true;
+ if (VarTemplateDecl *Template = VD->getDescribedVarTemplate())
+ // If this is a variable template and none of its specializations is used,
+ // we should warn.
+ for (const auto *Spec : Template->specializations())
+ if (ShouldRemoveFromUnused(SemaRef, Spec))
+ return true;
+
// UnusedFileScopedDecls stores the first declaration.
// The declaration may have become definition so check again.
const VarDecl *DeclToCheck = VD->getDefinition();
OpenPOWER on IntegriCloud