]> granicus.if.org Git - clang/commitdiff
Revert 111026 & 111027, build breakage.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 13 Aug 2010 20:13:06 +0000 (20:13 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 13 Aug 2010 20:13:06 +0000 (20:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111036 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Sema/Sema.h
lib/Sema/Sema.cpp
lib/Sema/SemaDecl.cpp
lib/Sema/SemaTemplateInstantiateDecl.cpp
test/Sema/warn-unused-function.c
test/SemaCXX/warn-unused-filescoped.cpp [deleted file]

index 561fc5f03e4c0232a12cbde26f49415d8b6bae5b..d2b89824a79f9af68893461fb810dce6550de9e2 100644 (file)
@@ -349,7 +349,7 @@ public:
   std::vector<VarDecl *> TentativeDefinitions;
 
   /// \brief The set of file scoped decls seen so far that have not been used
-  /// and must warn if not used. Only contains the first declaration.
+  /// and must warn if not used.
   std::vector<const DeclaratorDecl*> UnusedFileScopedDecls;
 
   class AccessedEntity {
@@ -1877,7 +1877,6 @@ public:
                                             MultiStmtArg Handlers);
   void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock);
 
-  bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const;
   void MarkUnusedFileScopedDecl(const DeclaratorDecl *D);
 
   /// DiagnoseUnusedExprResult - If the statement passed in is an expression
index df9bb07cf94063c3eb84b0b2899478e447f39685..f5c85ad99cd5e80662c5b59e9f002c7771310e10 100644 (file)
@@ -235,42 +235,6 @@ void Sema::DeleteExpr(ExprTy *E) {
 void Sema::DeleteStmt(StmtTy *S) {
 }
 
-/// \brief Used to prune the decls of Sema's UnusedFileScopedDecls vector.
-static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) {
-  if (D->isUsed())
-    return true;
-
-  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
-    // UnusedFileScopedDecls stores the first declaration.
-    // The declaration may have become definition so check again.
-    const FunctionDecl *DeclToCheck;
-    if (FD->hasBody(DeclToCheck))
-      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
-
-    // Later redecls may add new information resulting in not having to warn,
-    // so check again.
-    DeclToCheck = FD->getMostRecentDeclaration();
-    if (DeclToCheck != FD)
-      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
-  }
-
-  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
-    // UnusedFileScopedDecls stores the first declaration.
-    // The declaration may have become definition so check again.
-    const VarDecl *DeclToCheck = VD->getDefinition(); 
-    if (DeclToCheck)
-      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
-
-    // Later redecls may add new information resulting in not having to warn,
-    // so check again.
-    DeclToCheck = VD->getMostRecentDeclaration();
-    if (DeclToCheck != VD)
-      return !SemaRef->ShouldWarnIfUnusedFileScopedDecl(DeclToCheck);
-  }
-
-  return false;
-}
-
 /// ActOnEndOfTranslationUnit - This is called at the very end of the
 /// translation unit when EOF is reached and all but the top-level scope is
 /// popped.
@@ -299,10 +263,10 @@ void Sema::ActOnEndOfTranslationUnit() {
     }
   
   // Remove file scoped decls that turned out to be used.
-  UnusedFileScopedDecls.erase(std::remove_if(UnusedFileScopedDecls.begin(),
-                                             UnusedFileScopedDecls.end(),
-                              std::bind1st(std::ptr_fun(ShouldRemoveFromUnused),
-                                           this)),
+  UnusedFileScopedDecls.erase(std::remove_if(UnusedFileScopedDecls.begin(), 
+                                             UnusedFileScopedDecls.end(), 
+                             std::bind2nd(std::mem_fun(&DeclaratorDecl::isUsed),
+                                          true)), 
                               UnusedFileScopedDecls.end());
 
   if (!CompleteTranslationUnit)
@@ -370,19 +334,11 @@ void Sema::ActOnEndOfTranslationUnit() {
   for (std::vector<const DeclaratorDecl*>::iterator
          I = UnusedFileScopedDecls.begin(),
          E = UnusedFileScopedDecls.end(); I != E; ++I) {
-    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
-      const FunctionDecl *DiagD;
-      if (!FD->hasBody(DiagD))
-        DiagD = FD;
-      Diag(DiagD->getLocation(), diag::warn_unused_function)
-            << DiagD->getDeclName();
-    } else {
-      const VarDecl *DiagD = cast<VarDecl>(*I)->getDefinition();
-      if (!DiagD)
-        DiagD = cast<VarDecl>(*I);
-      Diag(DiagD->getLocation(), diag::warn_unused_variable)
-            << DiagD->getDeclName();
-    }
+    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I))
+      Diag(FD->getLocation(), diag::warn_unused_function) << FD->getDeclName();
+    else
+      Diag((*I)->getLocation(), diag::warn_unused_variable)
+            << cast<VarDecl>(*I)->getDeclName();
   }
 }
 
index a37d25a1436a93be3efe794fa06f0790511300ac..e1f9c82fecad4a3aeb27b72922314ba84f966095 100644 (file)
@@ -521,52 +521,25 @@ static void RemoveUsingDecls(LookupResult &R) {
   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;
-
-  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;
-
+static bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) {
   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.
-  }
-
-  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.
+    // 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 (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 @@ Sema::ActOnVariableDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   if (NewVD->getLinkage() == ExternalLinkage && !DC->isRecord())
     AddPushedVisibilityAttribute(NewVD);
 
-  MarkUnusedFileScopedDecl(NewVD);
-
   return NewVD;
 }
 
@@ -3667,7 +3638,8 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   if (FunctionTemplate)
     return FunctionTemplate;
 
-  MarkUnusedFileScopedDecl(NewFD);
+  if (IsFunctionDefinition)
+    MarkUnusedFileScopedDecl(NewFD);
 
   return NewFD;
 }
index 115eefbe5eefbea73dca6550339affa0967a65f7..fd630f2ef3e291ab97b06e08bc0e62039ecdda0d 100644 (file)
@@ -449,9 +449,7 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {
   // Diagnose unused local variables.
   if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed())
     SemaRef.DiagnoseUnusedDecl(Var);
-
-  SemaRef.MarkUnusedFileScopedDecl(Var);
-
+  
   return Var;
 }
 
@@ -1206,8 +1204,6 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
       PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
     PrincipalDecl->setNonMemberOperator();
 
-  SemaRef.MarkUnusedFileScopedDecl(Function);
-
   return Function;
 }
 
@@ -1419,8 +1415,6 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D,
     else
       Owner->addDecl(DeclToAdd);
   }
-  
-  SemaRef.MarkUnusedFileScopedDecl(Method);
 
   return Method;
 }
index 5ae0cce0798d3c17b7ec6f882d6cefb1c91b0287..d5e676b1160332ea6d34b704d71e0d8e0f6d0ed5 100644 (file)
@@ -35,12 +35,3 @@ void bar2(void) { }
 
 __attribute__((destructor)) static void bar3(void);
 void bar3(void) { }
-
-static void f10(void); // expected-warning{{unused}}
-static void f10(void);
-
-static void f11(void);
-static void f11(void) { }  // expected-warning{{unused}}
-
-static void f12(void) { }  // expected-warning{{unused}}
-static void f12(void);
diff --git a/test/SemaCXX/warn-unused-filescoped.cpp b/test/SemaCXX/warn-unused-filescoped.cpp
deleted file mode 100644 (file)
index 9b4f9ae..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -Wunused %s
-
-static void f1(); // expected-warning{{unused}}
-
-namespace {
-  void f2();  // expected-warning{{unused}}
-
-  void f3() { }  // expected-warning{{unused}}
-
-  struct S {
-    void m1() { }  // expected-warning{{unused}}
-    void m2();  // expected-warning{{unused}}
-    void m3();
-  };
-
-  template <typename T>
-  struct TS {
-    void m();
-  };
-  template <> void TS<int>::m() { }  // expected-warning{{unused}}
-
-  template <typename T>
-  void tf() { }
-  template <> void tf<int>() { }  // expected-warning{{unused}}
-}
-
-void S::m3() { }  // expected-warning{{unused}}
-
-static int x1;  // expected-warning{{unused}}
-
-namespace {
-  int x2;  // expected-warning{{unused}}
-  
-  struct S2 {
-    static int x;  // expected-warning{{unused}}
-  };
-
-  template <typename T>
-  struct TS2 {
-    static int x;
-  };
-  template <> int TS2<int>::x;  // expected-warning{{unused}}
-}