[Sema] Don't warn about omitting unavailable enum constants in a switch
authorErik Pilkington <erik.pilkington@gmail.com>
Wed, 5 Sep 2018 19:13:27 +0000 (19:13 +0000)
committerErik Pilkington <erik.pilkington@gmail.com>
Wed, 5 Sep 2018 19:13:27 +0000 (19:13 +0000)
rdar://42717026

Differential revision: https://reviews.llvm.org/D51649

llvm-svn: 341490

clang/lib/Sema/SemaStmt.cpp
clang/test/Sema/switch-availability.c [new file with mode: 0644]

index 8d620a7..61c6b37 100644 (file)
@@ -1164,7 +1164,21 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch,
 
       SmallVector<DeclarationName,8> UnhandledNames;
 
-      for (EI = EnumVals.begin(); EI != EIEnd; EI++){
+      for (EI = EnumVals.begin(); EI != EIEnd; EI++) {
+        // Don't warn about omitted unavailable EnumConstantDecls.
+        switch (EI->second->getAvailability()) {
+        case AR_Deprecated:
+          // Omitting a deprecated constant is ok; it should never materialize.
+        case AR_Unavailable:
+          continue;
+
+        case AR_NotYetIntroduced:
+          // Partially available enum constants should be present. Note that we
+          // suppress -Wunguarded-availability diagnostics for such uses.
+        case AR_Available:
+          break;
+        }
+
         // Drop unneeded case values
         while (CI != CaseVals.end() && CI->first < EI->first)
           CI++;
diff --git a/clang/test/Sema/switch-availability.c b/clang/test/Sema/switch-availability.c
new file mode 100644 (file)
index 0000000..888eddd
--- /dev/null
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -verify -Wswitch -triple x86_64-apple-macosx10.12 %s
+
+enum SwitchOne {
+  Unavail __attribute__((availability(macos, unavailable))),
+};
+
+void testSwitchOne(enum SwitchOne so) {
+  switch (so) {} // no warning
+}
+
+enum SwitchTwo {
+  Ed __attribute__((availability(macos, deprecated=10.12))),
+  Vim __attribute__((availability(macos, deprecated=10.13))),
+  Emacs,
+};
+
+void testSwitchTwo(enum SwitchTwo st) {
+  switch (st) {} // expected-warning{{enumeration values 'Vim' and 'Emacs' not handled in switch}}
+}
+
+enum SwitchThree {
+  New __attribute__((availability(macos, introduced=1000))),
+};
+
+void testSwitchThree(enum SwitchThree st) {
+  switch (st) {} // expected-warning{{enumeration value 'New' not handled in switch}}
+}