From: Fariborz Jahanian Date: Thu, 6 Sep 2012 16:43:18 +0000 (+0000) Subject: c: make __attribute__((unused)) transitive. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d40d9e3bd6638399260332d8c7a98ac715f7b0d;p=clang c: make __attribute__((unused)) transitive. Don't warn if annotated decl is used inside another unused. // rdar://12233989 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163329 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 57dab09e46..a67d5c6bd0 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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()) { + const Decl *DC = cast(S.getCurLexicalContext()); + // A category implicitly has the availability of the interface. + if (const ObjCCategoryDecl *CatD = dyn_cast(DC)) + DC = CatD->getClassInterface(); + if (!DC->hasAttr()) + 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()) - Diag(Loc, diag::warn_used_but_marked_unused) << D->getDeclName(); + DiagnoseUnusedOfDecl(*this, D, Loc); diagnoseUseOfInternalDeclInInlineFunction(*this, D, Loc); diff --git a/test/Sema/warn-unused-function.c b/test/Sema/warn-unused-function.c index 8f4cdcba88..a334e71e50 100644 --- a/test/Sema/warn-unused-function.c +++ b/test/Sema/warn-unused-function.c @@ -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(); +}