1 // RUN: %clang_cc1 -fsyntax-only -verify -Wswitch-enum %s 2 3 void test() { 4 bool x = true; 5 switch (x) { // expected-warning {{bool}} 6 case 0: 7 break; 8 } 9 10 int n = 3; 11 switch (n && true) { // expected-warning {{bool}} 12 case 1: 13 break; 14 } 15 } 16 17 // PR5518 18 struct A { 19 operator int(); // expected-note{{conversion to integral type}} 20 }; 21 22 void x() { 23 switch(A()) { 24 } 25 } 26 27 enum E { e1, e2 }; 28 struct B : A { 29 operator E() const; // expected-note{{conversion to enumeration type}} 30 }; 31 32 void x2() { 33 switch (B()) { // expected-error{{multiple conversions}} 34 } 35 } 36 37 struct C; // expected-note{{forward declaration}} 38 39 void x3(C &c) { 40 switch (c) { // expected-error{{incomplete class type}} 41 } 42 } 43 44 namespace test3 { 45 enum En { A, B, C }; 46 template <En how> void foo() { 47 int x = 0, y = 5; 48 49 switch (how) { //expected-warning {{no case matching constant switch condition '2'}} 50 case A: x *= y; break; 51 case B: x += y; break; 52 // No case for C, but it's okay because we have a constant condition. 53 } 54 } 55 56 template void foo<A>(); 57 template void foo<B>(); 58 template void foo<C>(); //expected-note {{in instantiation}} 59 } 60 61 // PR9304 and rdar://9045501 62 void click_check_header_sizes() { 63 switch (0 == 8) { // expected-warning {{switch condition has boolean value}} 64 case 0: ; 65 } 66 } 67