]> granicus.if.org Git - clang/commitdiff
Change Sema's UnusedStaticFuncs to UnusedFileScopedDecls to allow also keeping track...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 13 Aug 2010 18:42:17 +0000 (18:42 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 13 Aug 2010 18:42:17 +0000 (18:42 +0000)
    This is only preparation, currently only static function definitions are tracked, as before.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111025 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/PCHBitCodes.h
include/clang/Frontend/PCHReader.h
include/clang/Sema/Sema.h
lib/Frontend/PCHReader.cpp
lib/Frontend/PCHWriter.cpp
lib/Sema/Sema.cpp
lib/Sema/SemaDecl.cpp

index bce5c287e77aea055d21010201f4a979d1ac4cfc..0b7cb211f4cc871b947447d8236afb796a6e5c3a 100644 (file)
@@ -221,8 +221,8 @@ namespace clang {
       /// information of the compiler used to build this PCH file.
       VERSION_CONTROL_BRANCH_REVISION = 21,
       
-      /// \brief Record code for the array of unused static functions.
-      UNUSED_STATIC_FUNCS = 22,
+      /// \brief Record code for the array of unused file scoped decls.
+      UNUSED_FILESCOPED_DECLS = 22,
       
       /// \brief Record code for the table of offsets to macro definition
       /// entries in the preprocessing record.
index 906e3e1b2216390c9c25a7d82ca1c0b044b3aaef..5aa90b717faf660b9109f2f79e16de94cef408fc 100644 (file)
@@ -381,9 +381,8 @@ private:
   /// file.
   llvm::SmallVector<uint64_t, 16> TentativeDefinitions;
       
-  /// \brief The set of unused static functions stored in the the PCH
-  /// file.
-  llvm::SmallVector<uint64_t, 16> UnusedStaticFuncs;
+  /// \brief The set of unused file scoped decls stored in the the PCH file.
+  llvm::SmallVector<uint64_t, 16> UnusedFileScopedDecls;
   
   /// \brief The set of weak undeclared identifiers stored in the the PCH file.
   llvm::SmallVector<uint64_t, 64> WeakUndeclaredIdentifiers;
index fdf91db8f54dd8d2f69aab9eea3608b1051ef87c..d2b89824a79f9af68893461fb810dce6550de9e2 100644 (file)
@@ -348,8 +348,9 @@ public:
   /// \brief All the tentative definitions encountered in the TU.
   std::vector<VarDecl *> TentativeDefinitions;
 
-  /// \brief The set of static functions seen so far that have not been used.
-  std::vector<FunctionDecl*> UnusedStaticFuncs;
+  /// \brief The set of file scoped decls seen so far that have not been used
+  /// and must warn if not used.
+  std::vector<const DeclaratorDecl*> UnusedFileScopedDecls;
 
   class AccessedEntity {
   public:
@@ -1876,6 +1877,8 @@ public:
                                             MultiStmtArg Handlers);
   void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock);
 
+  void MarkUnusedFileScopedDecl(const DeclaratorDecl *D);
+
   /// DiagnoseUnusedExprResult - If the statement passed in is an expression
   /// whose result is unused, warn.
   void DiagnoseUnusedExprResult(const Stmt *S);
index 137c2d768ea8936dbab2be5fc18e939f83af924b..949177079757c69dc311ecb96dfe5d8819fa88eb 100644 (file)
@@ -1637,13 +1637,13 @@ PCHReader::ReadPCHBlock(PerFileData &F) {
                                     Record.begin(), Record.end());
       break;
 
-    case pch::UNUSED_STATIC_FUNCS:
+    case pch::UNUSED_FILESCOPED_DECLS:
       // Optimization for the first block.
-      if (UnusedStaticFuncs.empty())
-        UnusedStaticFuncs.swap(Record);
+      if (UnusedFileScopedDecls.empty())
+        UnusedFileScopedDecls.swap(Record);
       else
-        UnusedStaticFuncs.insert(UnusedStaticFuncs.end(),
-                                 Record.begin(), Record.end());
+        UnusedFileScopedDecls.insert(UnusedFileScopedDecls.end(),
+                                     Record.begin(), Record.end());
       break;
 
     case pch::WEAK_UNDECLARED_IDENTIFIERS:
@@ -3150,11 +3150,11 @@ void PCHReader::InitializeSema(Sema &S) {
     SemaObj->TentativeDefinitions.push_back(Var);
   }
 
-  // If there were any unused static functions, deserialize them and add to
-  // Sema's list of unused static functions.
-  for (unsigned I = 0, N = UnusedStaticFuncs.size(); I != N; ++I) {
-    FunctionDecl *FD = cast<FunctionDecl>(GetDecl(UnusedStaticFuncs[I]));
-    SemaObj->UnusedStaticFuncs.push_back(FD);
+  // If there were any unused file scoped decls, deserialize them and add to
+  // Sema's list of unused file scoped decls.
+  for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
+    DeclaratorDecl *D = cast<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I]));
+    SemaObj->UnusedFileScopedDecls.push_back(D);
   }
 
   // If there were any weak undeclared identifiers, deserialize them and add to
index a86bdb9278dec8c6a1aa0883dc426229056146c8..76fd5528dc8f578cf67c60dab471871f21c2e7a2 100644 (file)
@@ -626,7 +626,7 @@ void PCHWriter::WriteBlockInfoBlock() {
   RECORD(SPECIAL_TYPES);
   RECORD(STATISTICS);
   RECORD(TENTATIVE_DEFINITIONS);
-  RECORD(UNUSED_STATIC_FUNCS);
+  RECORD(UNUSED_FILESCOPED_DECLS);
   RECORD(LOCALLY_SCOPED_EXTERNAL_DECLS);
   RECORD(SELECTOR_OFFSETS);
   RECORD(METHOD_POOL);
@@ -636,7 +636,6 @@ void PCHWriter::WriteBlockInfoBlock() {
   RECORD(STAT_CACHE);
   RECORD(EXT_VECTOR_DECLS);
   RECORD(VERSION_CONTROL_BRANCH_REVISION);
-  RECORD(UNUSED_STATIC_FUNCS);
   RECORD(MACRO_DEFINITION_OFFSETS);
   RECORD(CHAINED_METADATA);
   RECORD(REFERENCED_SELECTOR_POOL);
@@ -2204,10 +2203,10 @@ void PCHWriter::WritePCHCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
     AddDeclRef(SemaRef.TentativeDefinitions[i], TentativeDefinitions);
   }
 
-  // Build a record containing all of the static unused functions in this file.
-  RecordData UnusedStaticFuncs;
-  for (unsigned i=0, e = SemaRef.UnusedStaticFuncs.size(); i !=e; ++i)
-    AddDeclRef(SemaRef.UnusedStaticFuncs[i], UnusedStaticFuncs);
+  // Build a record containing all of the file scoped decls in this file.
+  RecordData UnusedFileScopedDecls;
+  for (unsigned i=0, e = SemaRef.UnusedFileScopedDecls.size(); i !=e; ++i)
+    AddDeclRef(SemaRef.UnusedFileScopedDecls[i], UnusedFileScopedDecls);
 
   RecordData WeakUndeclaredIdentifiers;
   if (!SemaRef.WeakUndeclaredIdentifiers.empty()) {
@@ -2333,9 +2332,9 @@ void PCHWriter::WritePCHCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
   if (!TentativeDefinitions.empty())
     Stream.EmitRecord(pch::TENTATIVE_DEFINITIONS, TentativeDefinitions);
 
-  // Write the record containing unused static functions.
-  if (!UnusedStaticFuncs.empty())
-    Stream.EmitRecord(pch::UNUSED_STATIC_FUNCS, UnusedStaticFuncs);
+  // Write the record containing unused file scoped decls.
+  if (!UnusedFileScopedDecls.empty())
+    Stream.EmitRecord(pch::UNUSED_FILESCOPED_DECLS, UnusedFileScopedDecls);
 
   // Write the record containing weak undeclared identifiers.
   if (!WeakUndeclaredIdentifiers.empty())
@@ -2436,11 +2435,11 @@ void PCHWriter::WritePCHChain(Sema &SemaRef, MemorizeStatCalls *StatCalls,
       AddDeclRef(SemaRef.TentativeDefinitions[i], TentativeDefinitions);
   }
 
-  // Build a record containing all of the static unused functions in this file.
-  RecordData UnusedStaticFuncs;
-  for (unsigned i=0, e = SemaRef.UnusedStaticFuncs.size(); i !=e; ++i) {
-    if (SemaRef.UnusedStaticFuncs[i]->getPCHLevel() == 0)
-      AddDeclRef(SemaRef.UnusedStaticFuncs[i], UnusedStaticFuncs);
+  // Build a record containing all of the file scoped decls in this file.
+  RecordData UnusedFileScopedDecls;
+  for (unsigned i=0, e = SemaRef.UnusedFileScopedDecls.size(); i !=e; ++i) {
+    if (SemaRef.UnusedFileScopedDecls[i]->getPCHLevel() == 0)
+      AddDeclRef(SemaRef.UnusedFileScopedDecls[i], UnusedFileScopedDecls);
   }
 
   // We write the entire table, overwriting the tables from the chain.
@@ -2558,9 +2557,9 @@ void PCHWriter::WritePCHChain(Sema &SemaRef, MemorizeStatCalls *StatCalls,
   if (!TentativeDefinitions.empty())
     Stream.EmitRecord(pch::TENTATIVE_DEFINITIONS, TentativeDefinitions);
 
-  // Write the record containing unused static functions.
-  if (!UnusedStaticFuncs.empty())
-    Stream.EmitRecord(pch::UNUSED_STATIC_FUNCS, UnusedStaticFuncs);
+  // Write the record containing unused file scoped decls.
+  if (!UnusedFileScopedDecls.empty())
+    Stream.EmitRecord(pch::UNUSED_FILESCOPED_DECLS, UnusedFileScopedDecls);
 
   // Write the record containing weak undeclared identifiers.
   if (!WeakUndeclaredIdentifiers.empty())
index 778bf8c98a2e1fbb4cd10c8269dc2669ab26fe78..f5c85ad99cd5e80662c5b59e9f002c7771310e10 100644 (file)
@@ -262,12 +262,12 @@ void Sema::ActOnEndOfTranslationUnit() {
         break;
     }
   
-  // Remove functions that turned out to be used.
-  UnusedStaticFuncs.erase(std::remove_if(UnusedStaticFuncs.begin(), 
-                                         UnusedStaticFuncs.end(), 
-                             std::bind2nd(std::mem_fun(&FunctionDecl::isUsed),
+  // Remove file scoped decls that turned out to be used.
+  UnusedFileScopedDecls.erase(std::remove_if(UnusedFileScopedDecls.begin(), 
+                                             UnusedFileScopedDecls.end(), 
+                             std::bind2nd(std::mem_fun(&DeclaratorDecl::isUsed),
                                           true)), 
-                          UnusedStaticFuncs.end());
+                              UnusedFileScopedDecls.end());
 
   if (!CompleteTranslationUnit)
     return;
@@ -330,14 +330,16 @@ void Sema::ActOnEndOfTranslationUnit() {
 
   }
   
-  // Output warning for unused functions.
-  for (std::vector<FunctionDecl*>::iterator
-       F = UnusedStaticFuncs.begin(),
-       FEnd = UnusedStaticFuncs.end();
-       F != FEnd;
-       ++F)
-    Diag((*F)->getLocation(), diag::warn_unused_function) << (*F)->getDeclName();
-  
+  // Output warning for unused file scoped decls.
+  for (std::vector<const DeclaratorDecl*>::iterator
+         I = UnusedFileScopedDecls.begin(),
+         E = UnusedFileScopedDecls.end(); I != E; ++I) {
+    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 ea1cfa8f8a40784d58254991efa2dd9b7d84ca79..e1f9c82fecad4a3aeb27b72922314ba84f966095 100644 (file)
@@ -521,6 +521,26 @@ static void RemoveUsingDecls(LookupResult &R) {
   F.done();
 }
 
+static bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) {
+  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+    // 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;
+}
+
+void Sema::MarkUnusedFileScopedDecl(const DeclaratorDecl *D) {
+  if (ShouldWarnIfUnusedFileScopedDecl(D))
+    UnusedFileScopedDecls.push_back(D);
+}
+
 static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) {
   if (D->isInvalidDecl())
     return false;
@@ -3618,17 +3638,9 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   if (FunctionTemplate)
     return FunctionTemplate;
 
-  
-  // Keep track of static, non-inlined function definitions that
-  // have not been used. We will warn later.
-  // FIXME: Also include static functions declared but not defined.
-  if (!NewFD->isInvalidDecl() && IsFunctionDefinition 
-      && !NewFD->isInlined() && NewFD->getLinkage() == InternalLinkage
-      && !NewFD->isUsed() && !NewFD->hasAttr<UnusedAttr>()
-      && !NewFD->hasAttr<ConstructorAttr>()
-      && !NewFD->hasAttr<DestructorAttr>())
-    UnusedStaticFuncs.push_back(NewFD);
-  
+  if (IsFunctionDefinition)
+    MarkUnusedFileScopedDecl(NewFD);
+
   return NewFD;
 }
 
@@ -4891,7 +4903,7 @@ Sema::DeclPtrTy Sema::ActOnFinishFunctionBody(DeclPtrTy D, StmtArg BodyArg,
   // deletion in some later function.
   if (getDiagnostics().hasErrorOccurred())
     ExprTemporaries.clear();
-  
+
   return D;
 }