On Sep 6, 2012, at 10:28 AM, Ted Kremenek wrote: > Hi Fariborz, > > I see logic here that special cases for Objective-C categories, but no test > case for that bit. Is that already covered by an existing test? No, I cut-and-pasted from similar code for other attributes. I will add a test case.
-- Fariborz > > Ted > > On Sep 6, 2012, at 9:43 AM, Fariborz Jahanian <[email protected]> wrote: > >> Author: fjahanian >> Date: Thu Sep 6 11:43:18 2012 >> New Revision: 163329 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=163329&view=rev >> Log: >> c: make __attribute__((unused)) transitive. >> Don't warn if annotated decl is used inside another >> unused. // rdar://12233989 >> >> Modified: >> cfe/trunk/lib/Sema/SemaExpr.cpp >> cfe/trunk/test/Sema/warn-unused-function.c >> >> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=163329&r1=163328&r2=163329&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Sep 6 11:43:18 2012 >> @@ -66,6 +66,18 @@ >> 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 @@ >> } >> 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); >> >> >> Modified: cfe/trunk/test/Sema/warn-unused-function.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-unused-function.c?rev=163329&r1=163328&r2=163329&view=diff >> ============================================================================== >> --- cfe/trunk/test/Sema/warn-unused-function.c (original) >> +++ cfe/trunk/test/Sema/warn-unused-function.c Thu Sep 6 11:43:18 2012 >> @@ -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 @@ >> 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(); >> +} >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
