|  | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s | 
|  |  | 
|  | void test() { | 
|  | bool x = true; | 
|  | switch (x) { // expected-warning {{bool}} | 
|  | case 0: | 
|  | break; | 
|  | } | 
|  |  | 
|  | int n = 3; | 
|  | switch (n && true) { // expected-warning {{bool}} | 
|  | case 1: | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | // PR5518 | 
|  | struct A { | 
|  | operator int(); // expected-note{{conversion to integral type}} | 
|  | }; | 
|  |  | 
|  | void x() { | 
|  | switch(A()) { | 
|  | } | 
|  | } | 
|  |  | 
|  | enum E { e1, e2 }; | 
|  | struct B : A { | 
|  | operator E() const; // expected-note{{conversion to enumeration type}} | 
|  | }; | 
|  |  | 
|  | void x2() { | 
|  | switch (B()) { // expected-error{{multiple conversions}} | 
|  | } | 
|  | } | 
|  |  | 
|  | struct C; // expected-note{{forward declaration}} | 
|  |  | 
|  | void x3(C &c) { | 
|  | switch (c) { // expected-error{{incomplete class type}} | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test3 { | 
|  | enum En { A, B, C }; | 
|  | template <En how> void foo() { | 
|  | int x = 0, y = 5; | 
|  |  | 
|  | switch (how) { //expected-warning {{no case matching constant switch condition '2'}} | 
|  | case A: x *= y; break; | 
|  | case B: x += y; break; | 
|  | // No case for C, but it's okay because we have a constant condition. | 
|  | } | 
|  | } | 
|  |  | 
|  | template void foo<A>(); | 
|  | template void foo<B>(); | 
|  | template void foo<C>(); //expected-note {{in instantiation}} | 
|  | } | 
|  |  | 
|  | // PR9304 and rdar://9045501 | 
|  | void click_check_header_sizes() { | 
|  | switch (0 == 8) {  // expected-warning {{switch condition has boolean value}} | 
|  | case 0: ; | 
|  | } | 
|  | } | 
|  |  | 
|  | void local_class(int n) { | 
|  | for (;;) switch (n) { | 
|  | case 0: | 
|  | struct S { | 
|  | void f() { | 
|  | case 1: // expected-error {{'case' statement not in switch statement}} | 
|  | break; // expected-error {{'break' statement not in loop or switch statement}} | 
|  | default: // expected-error {{'default' statement not in switch statement}} | 
|  | continue; // expected-error {{'continue' statement not in loop statement}} | 
|  | } | 
|  | }; | 
|  | S().f(); | 
|  | []{ | 
|  | case 2: // expected-error {{'case' statement not in switch statement}} | 
|  | break; // expected-error {{'break' statement not in loop or switch statement}} | 
|  | default: // expected-error {{'default' statement not in switch statement}} | 
|  | continue; // expected-error {{'continue' statement not in loop statement}} | 
|  | }(); | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace Conversion { | 
|  | struct S { | 
|  | explicit operator int(); // expected-note {{conversion}} | 
|  | }; | 
|  | template<typename T> void f(T t) { | 
|  | switch (t) { // expected-error {{explicit conversion}} | 
|  | case 0: | 
|  | return; | 
|  | default: | 
|  | break; | 
|  | } | 
|  | } | 
|  | 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; | 
|  | } | 
|  | } | 
|  |  | 
|  | } |