/// \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
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;
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:
// RUN: %clang_cc1 -fsyntax-only -Wunused-function -verify %s
-// XFAIL: *
void foo() {}
static void f2() {}
// 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) {}