1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2 
test()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 
x()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 
x2()32 void x2() {
33   switch (B()) { // expected-error{{multiple conversions}}
34   }
35 }
36 
37 struct C; // expected-note{{forward declaration}}
38 
x3(C & c)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 };
foo()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
click_check_header_sizes()62 void click_check_header_sizes() {
63   switch (0 == 8) {  // expected-warning {{switch condition has boolean value}}
64   case 0: ;
65   }
66 }
67 
local_class(int n)68 void local_class(int n) {
69   for (;;) switch (n) {
70   case 0:
71     struct S {
72       void f() {
73         case 1: // expected-error {{'case' statement not in switch statement}}
74         break; // expected-error {{'break' statement not in loop or switch statement}}
75         default: // expected-error {{'default' statement not in switch statement}}
76         continue; // expected-error {{'continue' statement not in loop statement}}
77       }
78     };
79     S().f();
80     []{
81       case 2: // expected-error {{'case' statement not in switch statement}}
82       break; // expected-error {{'break' statement not in loop or switch statement}}
83       default: // expected-error {{'default' statement not in switch statement}}
84       continue; // expected-error {{'continue' statement not in loop statement}}
85     }();
86   }
87 }
88 
89 namespace Conversion {
90   struct S {
91     explicit operator int(); // expected-note {{conversion}}
92   };
f(T t)93   template<typename T> void f(T t) {
94     switch (t) { // expected-error {{explicit conversion}}
95     case 0:
96       return;
97     default:
98       break;
99     }
100   }
101   template void f(S); // expected-note {{instantiation of}}
102 }
103 
104 // rdar://29230764
105 namespace OpaqueEnumWarnings {
106 
107 enum Opaque : int;
108 enum class OpaqueClass : int;
109 
110 enum class Defined : int;
111 enum class Defined : int { a };
112 
test(Opaque o,OpaqueClass oc,Defined d)113 void test(Opaque o, OpaqueClass oc, Defined d) {
114   // Don't warn that case value is not present in opaque enums.
115   switch (o) {
116   case (Opaque)1:
117     break;
118   }
119   switch (oc) {
120   case (OpaqueClass)1:
121     break;
122   }
123 
124   switch (d) {
125   case Defined::a:
126     break;
127   case (Defined)2: // expected-warning {{case value not in enumerated type 'OpaqueEnumWarnings::Defined'}}
128     break;
129   }
130 }
131 
132 }
133