diff options
-rw-r--r-- | clang/include/clang/AST/DeclBase.h | 3 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 6 | ||||
-rw-r--r-- | clang/lib/AST/DeclBase.cpp | 18 | ||||
-rw-r--r-- | clang/test/Sema/warn-unused-function.c | 13 |
4 files changed, 33 insertions, 7 deletions
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index a407a162774..8195fcb253c 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/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/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index a37177ba344..e2912ea3517 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/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<UnusedFunction>, DefaultIgnore; - DefaultIgnore; - + InGroup<UnusedFunction>, DefaultIgnore; + def warn_implicit_function_decl : Warning< "implicit declaration of function %0">, InGroup<ImplicitFunctionDeclare>, DefaultIgnore; diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index 863a1cbd03c..222adcb28e4 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/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<UsedAttr>()) + return true; + + // Check redeclarations for used attribute. + for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { + if (I->hasAttr<UsedAttr>() || I->Used) + return true; + } + + return false; +} + + unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) { switch (DeclKind) { case Function: diff --git a/clang/test/Sema/warn-unused-function.c b/clang/test/Sema/warn-unused-function.c index 81ea82dd163..1a2a50e1aa0 100644 --- a/clang/test/Sema/warn-unused-function.c +++ b/clang/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) {} |