Index: cfe/trunk/include/clang/Basic/DiagnosticGroups.td =================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td @@ -454,6 +454,8 @@ def SwitchBool : DiagGroup<"switch-bool">; def SwitchEnum : DiagGroup<"switch-enum">; def Switch : DiagGroup<"switch">; +def EnumCompareSwitch : DiagGroup<"enum-compare-switch">; +def EnumCompare : DiagGroup<"enum-compare", [EnumCompareSwitch]>; def ImplicitFallthroughPerFunction : DiagGroup<"implicit-fallthrough-per-function">; def ImplicitFallthrough : DiagGroup<"implicit-fallthrough", Index: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td @@ -5918,7 +5918,11 @@ def warn_comparison_of_mixed_enum_types : Warning< "comparison of two values with different enumeration types" "%diff{ ($ and $)|}0,1">, - InGroup>; + InGroup; +def warn_comparison_of_mixed_enum_types_switch : Warning< + "comparison of two values with different enumeration types in switch statement" + "%diff{ ($ and $)|}0,1">, + InGroup; def warn_null_in_arithmetic_operation : Warning< "use of NULL in arithmetic operation">, InGroup; Index: cfe/trunk/lib/Sema/SemaStmt.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaStmt.cpp +++ cfe/trunk/lib/Sema/SemaStmt.cpp @@ -762,7 +762,7 @@ if (S.Context.hasSameUnqualifiedType(CondType, CaseType)) return; - S.Diag(Case->getExprLoc(), diag::warn_comparison_of_mixed_enum_types) + S.Diag(Case->getExprLoc(), diag::warn_comparison_of_mixed_enum_types_switch) << CondType << CaseType << Cond->getSourceRange() << Case->getSourceRange(); } Index: cfe/trunk/test/Sema/switch.c =================================================================== --- cfe/trunk/test/Sema/switch.c +++ cfe/trunk/test/Sema/switch.c @@ -372,7 +372,7 @@ case EE1_b: break; case EE1_c: break; // no-warning case EE1_d: break; // expected-warning {{case value not in enumerated type 'enum ExtendedEnum1'}} - // expected-warning@-1 {{comparison of two values with different enumeration types ('enum ExtendedEnum1' and 'const enum ExtendedEnum1_unrelated')}} + // expected-warning@-1 {{comparison of two values with different enumeration types in switch statement ('enum ExtendedEnum1' and 'const enum ExtendedEnum1_unrelated')}} } } Index: cfe/trunk/test/SemaCXX/warn-enum-compare.cpp =================================================================== --- cfe/trunk/test/SemaCXX/warn-enum-compare.cpp +++ cfe/trunk/test/SemaCXX/warn-enum-compare.cpp @@ -212,19 +212,19 @@ switch (a) { case name1::F1: break; case name1::F3: break; - case name2::B2: break; // expected-warning {{comparison of two values with different enumeration types ('name1::Foo' and 'name2::Baz')}} + case name2::B2: break; // expected-warning {{comparison of two values with different enumeration types in switch statement ('name1::Foo' and 'name2::Baz')}} } switch (x) { case FooB: break; case FooC: break; - case BarD: break; // expected-warning {{comparison of two values with different enumeration types ('Foo' and 'Bar')}} + case BarD: break; // expected-warning {{comparison of two values with different enumeration types in switch statement ('Foo' and 'Bar')}} } switch(getBar()) { case BarE: break; case BarF: break; - case FooA: break; // expected-warning {{comparison of two values with different enumeration types ('Bar' and 'Foo')}} + case FooA: break; // expected-warning {{comparison of two values with different enumeration types in switch statement ('Bar' and 'Foo')}} } switch(x) {