From: Erik Pilkington Date: Fri, 18 Aug 2017 20:20:56 +0000 (+0000) Subject: [Sema] Don't emit -Wunguarded-availability for switch cases X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=433560bf0604ccb20dcafe9716270ba06debd7c9;p=clang [Sema] Don't emit -Wunguarded-availability for switch cases This made it awkward to switch over an enum where some entries are partial and is unlikley to catch any bugs. Differential revision: https://reviews.llvm.org/D36777 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@311191 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 3d58b9ae05..b8432ebd53 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -7513,6 +7513,10 @@ public: bool TraverseLambdaExpr(LambdaExpr *E) { return true; } + // for 'case X:' statements, don't bother looking at the 'X'; it can't lead + // to any useful diagnostics. + bool TraverseCaseStmt(CaseStmt *CS) { return TraverseStmt(CS->getSubStmt()); } + bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) { if (PRE->isClassReceiver()) DiagnoseDeclAvailability(PRE->getClassReceiver(), PRE->getReceiverLocation()); diff --git a/test/SemaObjC/unguarded-availability.m b/test/SemaObjC/unguarded-availability.m index f94d1425fe..b34cd0f982 100644 --- a/test/SemaObjC/unguarded-availability.m +++ b/test/SemaObjC/unguarded-availability.m @@ -287,3 +287,27 @@ AVAILABLE_10_12 @interface BaseClass (CategoryWithNewProtocolRequirement) @end + +typedef enum { + AK_Dodo __attribute__((availability(macos, deprecated=10.3))), // expected-note 3 {{marked deprecated here}} + AK_Cat __attribute__((availability(macos, introduced=10.4))), + AK_CyborgCat __attribute__((availability(macos, introduced=10.12))), // expected-note {{marked partial here}} +} Animals; + +void switchAnimals(Animals a) { + switch (a) { + case AK_Dodo: break; // expected-warning{{'AK_Dodo' is deprecated}} + case AK_Cat: break; + case AK_Cat|AK_CyborgCat: break; // expected-warning{{case value not in enum}} + case AK_CyborgCat: break; // no warn + } + + switch (a) { + case AK_Dodo...AK_CyborgCat: // expected-warning {{'AK_Dodo' is depr}} + break; + } + + (void)AK_Dodo; // expected-warning{{'AK_Dodo' is deprecated}} + (void)AK_Cat; // no warning + (void)AK_CyborgCat; // expected-warning{{'AK_CyborgCat' is only available on macOS 10.12 or newer}} expected-note {{@available}} +}