forked from OSchip/llvm-project
c: make __attribute__((unused)) transitive.
Don't warn if annotated decl is used inside another unused. // rdar://12233989 llvm-svn: 163329
This commit is contained in:
parent
83859e7728
commit
66c93f443d
|
@ -66,6 +66,18 @@ bool Sema::CanUseDecl(NamedDecl *D) {
|
|||
return true;
|
||||
}
|
||||
|
||||
static void DiagnoseUnusedOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc) {
|
||||
// Warn if this is used but marked unused.
|
||||
if (D->hasAttr<UnusedAttr>()) {
|
||||
const Decl *DC = cast<Decl>(S.getCurLexicalContext());
|
||||
// A category implicitly has the availability of the interface.
|
||||
if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(DC))
|
||||
DC = CatD->getClassInterface();
|
||||
if (!DC->hasAttr<UnusedAttr>())
|
||||
S.Diag(Loc, diag::warn_used_but_marked_unused) << D->getDeclName();
|
||||
}
|
||||
}
|
||||
|
||||
static AvailabilityResult DiagnoseAvailabilityOfDecl(Sema &S,
|
||||
NamedDecl *D, SourceLocation Loc,
|
||||
const ObjCInterfaceDecl *UnknownObjCClass) {
|
||||
|
@ -250,9 +262,7 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
|
|||
}
|
||||
DiagnoseAvailabilityOfDecl(*this, D, Loc, UnknownObjCClass);
|
||||
|
||||
// Warn if this is used but marked unused.
|
||||
if (D->hasAttr<UnusedAttr>())
|
||||
Diag(Loc, diag::warn_used_but_marked_unused) << D->getDeclName();
|
||||
DiagnoseUnusedOfDecl(*this, D, Loc);
|
||||
|
||||
diagnoseUseOfInternalDeclInInlineFunction(*this, D, Loc);
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -Wunused-function -Wunneeded-internal-declaration -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wused-but-marked-unused -Wunused-function -Wunneeded-internal-declaration -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -Wunused %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -Wall %s
|
||||
|
||||
|
@ -54,3 +54,15 @@ void f13(void) {
|
|||
char * const __attribute__((cleanup(cleanupMalloc))) a;
|
||||
(void)a;
|
||||
}
|
||||
|
||||
// rdar://12233989
|
||||
extern void a(void) __attribute__((unused));
|
||||
extern void b(void) __attribute__((unused));
|
||||
|
||||
void b(void)
|
||||
{
|
||||
}
|
||||
void a(void)
|
||||
{
|
||||
b();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue