[cfe-commits] r111036 - in /cfe/trunk: 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
Argyrios Kyrtzidis
akyrtzi at gmail.com
Fri Aug 13 13:13:07 PDT 2010
Author: akirtzidis
Date: Fri Aug 13 15:13:06 2010
New Revision: 111036
URL: http://llvm.org/viewvc/llvm-project?rev=111036&view=rev
Log:
Revert 111026 & 111027, build breakage.
Removed:
cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp
Modified:
cfe/trunk/include/clang/Sema/Sema.h
cfe/trunk/lib/Sema/Sema.cpp
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
cfe/trunk/test/Sema/warn-unused-function.c
Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=111036&r1=111035&r2=111036&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Fri Aug 13 15:13:06 2010
@@ -349,7 +349,7 @@
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 @@
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
Modified: cfe/trunk/lib/Sema/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=111036&r1=111035&r2=111036&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.cpp (original)
+++ cfe/trunk/lib/Sema/Sema.cpp Fri Aug 13 15:13:06 2010
@@ -235,42 +235,6 @@
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 @@
}
// 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 @@
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();
}
}
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=111036&r1=111035&r2=111036&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Aug 13 15:13:06 2010
@@ -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;
-
- 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 @@
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;
}
Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=111036&r1=111035&r2=111036&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Fri Aug 13 15:13:06 2010
@@ -449,9 +449,7 @@
// Diagnose unused local variables.
if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed())
SemaRef.DiagnoseUnusedDecl(Var);
-
- SemaRef.MarkUnusedFileScopedDecl(Var);
-
+
return Var;
}
@@ -1206,8 +1204,6 @@
PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
PrincipalDecl->setNonMemberOperator();
- SemaRef.MarkUnusedFileScopedDecl(Function);
-
return Function;
}
@@ -1419,8 +1415,6 @@
else
Owner->addDecl(DeclToAdd);
}
-
- SemaRef.MarkUnusedFileScopedDecl(Method);
return Method;
}
Modified: cfe/trunk/test/Sema/warn-unused-function.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-unused-function.c?rev=111036&r1=111035&r2=111036&view=diff
==============================================================================
--- cfe/trunk/test/Sema/warn-unused-function.c (original)
+++ cfe/trunk/test/Sema/warn-unused-function.c Fri Aug 13 15:13:06 2010
@@ -35,12 +35,3 @@
__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);
Removed: cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp?rev=111035&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp (removed)
@@ -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}}
-}
More information about the cfe-commits
mailing list