[Sema] Avoid "case value not in enumerated type" warning for C++11 opaque enums

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

llvm-svn: 289055
This commit is contained in:
Alex Lorenz 2016-12-08 14:46:05 +00:00
parent 9ccd966612
commit 660195f024
2 changed files with 32 additions and 1 deletions

View 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;

View 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;
}
}
}