[lld][WebAssembly] Reinstate mistakenly disabled test. NFC
[llvm-project.git] / clang / test / SemaCXX / switch.cpp
blob380f4d559ef8e89e34dde8e86707a91649114f05
1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
3 void test() {
4 bool x = true;
5 switch (x) { // expected-warning {{bool}}
6 case 0:
7 break;
10 int n = 3;
11 switch (n && true) { // expected-warning {{bool}}
12 case 1:
13 break;
17 // PR5518
18 struct A {
19 operator int(); // expected-note{{conversion to integral type}}
22 void x() {
23 switch(A()) {
27 enum E { e1, e2 };
28 struct B : A {
29 operator E() const; // expected-note{{conversion to enumeration type}}
32 void x2() {
33 switch (B()) { // expected-error{{multiple conversions}}
37 struct C; // expected-note{{forward declaration}}
39 void x3(C &c) {
40 switch (c) { // expected-error{{incomplete class type}}
44 namespace test3 {
45 enum En { A, B, C };
46 template <En how> void foo() {
47 int x = 0, y = 5;
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.
56 template void foo<A>();
57 template void foo<B>();
58 template void foo<C>(); //expected-note {{in instantiation}}
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: ;
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}}
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 }();
89 namespace Conversion {
90 struct S {
91 explicit operator int(); // expected-note {{conversion}}
93 template<typename T> void f(T t) {
94 switch (t) { // expected-error {{explicit conversion}}
95 case 0:
96 return;
97 default:
98 break;
101 template void f(S); // expected-note {{instantiation of}}
104 // rdar://29230764
105 namespace OpaqueEnumWarnings {
107 enum Opaque : int;
108 enum class OpaqueClass : int;
110 enum class Defined : int;
111 enum class Defined : int { a };
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;
119 switch (oc) {
120 case (OpaqueClass)1:
121 break;
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;
134 namespace EmptyEnum {
136 enum Empty : int {};
137 void test(Empty e) {
138 switch (e) {
139 case (Empty)0:
140 break;
142 switch (e) {
143 default:
144 break;
148 } // namespace EmptyEnum