[PATCH] D36777: [Sema] Don't emit -Wunguarded-availability for switch cases

Erik Pilkington via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 15 17:21:40 PDT 2017


erik.pilkington created this revision.

Currently, this has pretty terrible ergonomics for the fairly common case of switching over an enum which has some entries that are partial. Thanks to Nico Weber for pointing this out!

Thanks,
Erik


https://reviews.llvm.org/D36777

Files:
  lib/Sema/SemaDeclAttr.cpp
  test/SemaObjC/unguarded-availability.m


Index: test/SemaObjC/unguarded-availability.m
===================================================================
--- test/SemaObjC/unguarded-availability.m
+++ test/SemaObjC/unguarded-availability.m
@@ -287,3 +287,22 @@
 @interface BaseClass (CategoryWithNewProtocolRequirement) <NewProtocol>
 
 @end
+
+typedef enum {
+  AK_Dodo __attribute__((availability(macos, deprecated=10.3))), // expected-note 2 {{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
+  }
+
+  (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}}
+}
Index: lib/Sema/SemaDeclAttr.cpp
===================================================================
--- lib/Sema/SemaDeclAttr.cpp
+++ lib/Sema/SemaDeclAttr.cpp
@@ -7513,6 +7513,15 @@
 
   bool TraverseLambdaExpr(LambdaExpr *E) { return true; }
 
+  bool TraverseCaseStmt(CaseStmt *CS) {
+    // for 'case X:' statements, don't bother looking at the 'X'; it can't lead
+    // to any useful diagnostics.
+    for (Stmt *Child : llvm::drop_begin(CS->children(), 1))
+      if (!Base::TraverseStmt(Child))
+        return false;
+    return true;
+  }
+
   bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) {
     if (PRE->isClassReceiver())
       DiagnoseDeclAvailability(PRE->getClassReceiver(), PRE->getReceiverLocation());


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36777.111288.patch
Type: text/x-patch
Size: 1859 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170816/6849fcc3/attachment.bin>


More information about the cfe-commits mailing list