]> granicus.if.org Git - clang/commitdiff
[Sema] Avoid "case value not in enumerated type" warning for C++11 opaque enums
authorAlex Lorenz <arphaman@gmail.com>
Thu, 8 Dec 2016 14:46:05 +0000 (14:46 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Thu, 8 Dec 2016 14:46:05 +0000 (14:46 +0000)
This commit ensures that the switch warning "case value not in enumerated type"
isn't shown for opaque enums. We don't know the actual list of values in opaque
enums, so that warning is incorrect.

rdar://29230764

Differential Revision: https://reviews.llvm.org/D27299

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@289055 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmt.cpp
test/SemaCXX/switch.cpp

index 89c82c9805a57a3106f59ae2a9b0681433c41eda..50f0a22ff02b3f2f4c114afd84769505d29d0155 100644 (file)
@@ -1070,7 +1070,8 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch,
     const EnumType *ET = CondTypeBeforePromotion->getAs<EnumType>();
 
     // If switch has default case, then ignore it.
-    if (!CaseListIsErroneous  && !HasConstantCond && ET) {
+    if (!CaseListIsErroneous && !HasConstantCond && ET &&
+        ET->getDecl()->isCompleteDefinition()) {
       const EnumDecl *ED = ET->getDecl();
       EnumValsTy EnumVals;
 
index 392dcd869802987a4ff915f33e2dc556e9e72ddc..0c60ce02097bbf47ae2b62b69c3db4b7f3d3b861 100644 (file)
@@ -100,3 +100,33 @@ namespace Conversion {
   }
   template void f(S); // expected-note {{instantiation of}}
 }
+
+// rdar://29230764
+namespace OpaqueEnumWarnings {
+
+enum Opaque : int;
+enum class OpaqueClass : int;
+
+enum class Defined : int;
+enum class Defined : int { a };
+
+void test(Opaque o, OpaqueClass oc, Defined d) {
+  // Don't warn that case value is not present in opaque enums.
+  switch (o) {
+  case (Opaque)1:
+    break;
+  }
+  switch (oc) {
+  case (OpaqueClass)1:
+    break;
+  }
+
+  switch (d) {
+  case Defined::a:
+    break;
+  case (Defined)2: // expected-warning {{case value not in enumerated type 'OpaqueEnumWarnings::Defined'}}
+    break;
+  }
+}
+
+}