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;
 }