On Sep 29, 2011, at 11:40 AM, Fariborz Jahanian wrote: > Author: fjahanian > Date: Thu Sep 29 13:40:01 2011 > New Revision: 140800 > > URL: http://llvm.org/viewvc/llvm-project?rev=140800&view=rev > Log: > c - Enumerators may inherit the deprecated/unavailable > attributes from the enumeration type. > // rdar://10201690 > > Modified: > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/test/Sema/attr-deprecated.c > cfe/trunk/test/Sema/attr-unavailable-message.c > cfe/trunk/test/SemaCXX/attr-deprecated.cpp > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=140800&r1=140799&r2=140800&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Thu Sep 29 13:40:01 2011 > @@ -2222,7 +2222,8 @@ > > bool CanUseDecl(NamedDecl *D); > bool DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc, > - const ObjCInterfaceDecl *UnknownObjCClass = 0); > + const ObjCInterfaceDecl *UnknownObjCClass = 0, > + const EnumDecl *EnumeratorEnumDecl = 0); > std::string getDeletedOrUnavailableSuffix(const FunctionDecl *FD); > bool DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *PD, > ObjCMethodDecl *Getter, > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=140800&r1=140799&r2=140800&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Sep 29 13:40:01 2011 > @@ -69,7 +69,8 @@ > /// referenced), false otherwise. > /// > bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc, > - const ObjCInterfaceDecl *UnknownObjCClass) { > + const ObjCInterfaceDecl *UnknownObjCClass, > + const EnumDecl *EnumeratorEnumDecl) { > if (getLangOptions().CPlusPlus && isa<FunctionDecl>(D)) { > // If there were any diagnostics suppressed by template argument > deduction, > // emit them now. > @@ -106,11 +107,12 @@ > > // See if this declaration is unavailable or deprecated. > std::string Message; > - switch (D->getAvailability(&Message)) { > + AvailabilityResult Result = D->getAvailability(&Message); > + switch (Result) { > case AR_Available: > case AR_NotYetIntroduced: > break; > - > + > case AR_Deprecated: > EmitDeprecationWarning(D, Message, Loc, UnknownObjCClass); > break; > @@ -134,9 +136,17 @@ > } > > // Warn if this is used but marked unused. > - if (D->hasAttr<UnusedAttr>()) > + if (D->hasAttr<UnusedAttr>() && !EnumeratorEnumDecl) > Diag(Loc, diag::warn_used_but_marked_unused) << D->getDeclName(); > - > + // For available enumerator, it will become unavailable/deprecated > + // if its enum declaration is as such. > + if (Result == AR_Available) > + if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) { > + const DeclContext *DC = ECD->getDeclContext(); > + if (const EnumDecl *TheEnumDecl = dyn_cast<EnumDecl>(DC)) > + DiagnoseUseOfDecl(const_cast< EnumDecl *>(TheEnumDecl), > + Loc, UnknownObjCClass, TheEnumDecl); > + } > return false; > }
The recursive invocation here is weird; why not just split out most of the checking into a helper function? John. _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
