From: Tanya Lattner Date: Wed, 17 Feb 2010 02:17:21 +0000 (+0000) Subject: Fix unused function warning to handle used attributes and redeclarations. Update... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=12ead498c4bc279472b21d446bfccec0f654779e;p=clang Fix unused function warning to handle used attributes and redeclarations. Update test case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96444 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index a407a16277..8195fcb253 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -279,7 +279,8 @@ public: /// \brief Whether this declaration was used, meaning that a definition /// is required. - bool isUsed() const { return Used; } + bool isUsed() const; + void setUsed(bool U = true) { Used = U; } /// \brief Retrieve the level of precompiled header from which this diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index a37177ba34..e2912ea351 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -88,10 +88,8 @@ def warn_decl_in_param_list : Warning< def err_array_star_in_function_definition : Error< "variable length array must be bound in function definition">; def warn_unused_function : Warning<"unused function %0">, -// FIXME: Temporarily disabled pending PR6321. -// InGroup, DefaultIgnore; - DefaultIgnore; - + InGroup, DefaultIgnore; + def warn_implicit_function_decl : Warning< "implicit declaration of function %0">, InGroup, DefaultIgnore; diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 863a1cbd03..222adcb28e 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -194,6 +194,24 @@ ASTContext &Decl::getASTContext() const { return getTranslationUnitDecl()->getASTContext(); } +bool Decl::isUsed() const { + if (Used) + return true; + + // Check for used attribute. + if (hasAttr()) + return true; + + // Check redeclarations for used attribute. + for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { + if (I->hasAttr() || I->Used) + return true; + } + + return false; +} + + unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) { switch (DeclKind) { case Function: diff --git a/test/Sema/warn-unused-function.c b/test/Sema/warn-unused-function.c index 81ea82dd16..1a2a50e1aa 100644 --- a/test/Sema/warn-unused-function.c +++ b/test/Sema/warn-unused-function.c @@ -1,5 +1,4 @@ // RUN: %clang_cc1 -fsyntax-only -Wunused-function -verify %s -// XFAIL: * void foo() {} static void f2() {} @@ -14,4 +13,14 @@ extern void f3() { } // expected-warning{{unused}} // FIXME: This will trigger a warning when it should not. // Update once PR6281 is fixed. //inline static void f4(); -//void f4() { } +//void f4() { } + +static void __attribute__((used)) f5() {} +static void f6(); +static void __attribute__((used)) f6(); +static void f6() {}; + +static void f7(void); +void f8(void(*a0)(void)); +void f9(void) { f8(f7); } +static void f7(void) {}