Revert 111026 & 111027, build breakage.
llvm-svn: 111036
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index a37d25a..e1f9c82 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -521,52 +521,25 @@
F.done();
}
-bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
- assert(D);
-
- if (D->isInvalidDecl() || D->isUsed() || D->hasAttr<UnusedAttr>())
- return false;
-
- // Ignore class templates.
- if (D->getDeclContext()->isDependentContext())
- return false;
-
- // We warn for unused decls internal to the translation unit.
- if (D->getLinkage() == ExternalLinkage)
- return false;
-
+static bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) {
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
- if (FD->isThisDeclarationADefinition())
- return !Context.DeclMustBeEmitted(FD);
- return true;
- }
-
- if (const VarDecl *VD = dyn_cast<VarDecl>(D))
- if (VD->isFileVarDecl())
- return !Context.DeclMustBeEmitted(VD);
-
- return false;
- }
-
- void Sema::MarkUnusedFileScopedDecl(const DeclaratorDecl *D) {
- if (!D)
- return;
-
- if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
- const FunctionDecl *First = FD->getFirstDeclaration();
- if (FD != First && ShouldWarnIfUnusedFileScopedDecl(First))
- return; // First should already be in the vector.
+ // Warn for static, non-inlined function definitions that
+ // have not been used.
+ // FIXME: Also include static functions declared but not defined.
+ return (!FD->isInvalidDecl()
+ && !FD->isInlined() && FD->getLinkage() == InternalLinkage
+ && !FD->isUsed() && !FD->hasAttr<UnusedAttr>()
+ && !FD->hasAttr<ConstructorAttr>()
+ && !FD->hasAttr<DestructorAttr>());
}
+
+ return false;
+}
- if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
- const VarDecl *First = VD->getFirstDeclaration();
- if (VD != First && ShouldWarnIfUnusedFileScopedDecl(First))
- return; // First should already be in the vector.
- }
-
- if (ShouldWarnIfUnusedFileScopedDecl(D))
- UnusedFileScopedDecls.push_back(D);
- }
+void Sema::MarkUnusedFileScopedDecl(const DeclaratorDecl *D) {
+ if (ShouldWarnIfUnusedFileScopedDecl(D))
+ UnusedFileScopedDecls.push_back(D);
+}
static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) {
if (D->isInvalidDecl())
@@ -2770,8 +2743,6 @@
if (NewVD->getLinkage() == ExternalLinkage && !DC->isRecord())
AddPushedVisibilityAttribute(NewVD);
- MarkUnusedFileScopedDecl(NewVD);
-
return NewVD;
}
@@ -3667,7 +3638,8 @@
if (FunctionTemplate)
return FunctionTemplate;
- MarkUnusedFileScopedDecl(NewFD);
+ if (IsFunctionDefinition)
+ MarkUnusedFileScopedDecl(NewFD);
return NewFD;
}