switch.cpp revision b7690b425845b636849f25074d64d30aad646473
1// RUN: %clang_cc1 -fsyntax-only -verify -Wswitch-enum %s 2 3void 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 && 1) { // expected-warning {{bool}} 12 case 1: 13 break; 14 } 15} 16 17// PR5518 18struct A { 19 operator int(); // expected-note{{conversion to integral type}} 20}; 21 22void x() { 23 switch(A()) { 24 } 25} 26 27enum E { e1, e2 }; 28struct B : A { 29 operator E() const; // expected-note{{conversion to enumeration type}} 30}; 31 32void x2() { 33 switch (B()) { // expected-error{{multiple conversions}} 34 } 35} 36 37struct C; // expected-note{{forward declaration}} 38 39void x3(C &c) { 40 switch (c) { // expected-error{{incomplete class type}} 41 } 42} 43 44namespace 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