From: Rafael Espindola Date: Wed, 26 Dec 2012 04:38:44 +0000 (+0000) Subject: Fix a regression from the previous commit. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=137d6625eb61a41e776d89b39f3cb958d4a21140;p=clang Fix a regression from the previous commit. Template instantiation can set the canonical decl to used after subsequent decls have been chained, so we have to check that too. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171088 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index e444f3c357..4b82069a62 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -328,7 +328,11 @@ CastKind Sema::ScalarTypeToBooleanCastKind(QualType ScalarTy) { /// \brief Used to prune the decls of Sema's UnusedFileScopedDecls vector. static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) { - if (D->getMostRecentDecl()->isUsed()) + // Template instantiation can happen at the end of the translation unit + // and it sets the canonical (first) decl to used. Normal uses set the last + // decl at the time to used and subsequent decl inherit the flag. The net + // result is that we need to check both ends of the decl chain. + if (D->isUsed() || D->getMostRecentDecl()->isUsed()) return true; if (const FunctionDecl *FD = dyn_cast(D)) { diff --git a/test/SemaCXX/warn-func-not-needed.cpp b/test/SemaCXX/warn-func-not-needed.cpp index 437a428664..0cc639fdd2 100644 --- a/test/SemaCXX/warn-func-not-needed.cpp +++ b/test/SemaCXX/warn-func-not-needed.cpp @@ -15,3 +15,16 @@ namespace test2 { static void g() { f(); } void h() { g(); } } + +namespace test3 { + static void f(); + template + static void g() { + f(); + } + static void f() { + } + void h() { + g(); + } +}