148 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s2 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 && true) { // expected-warning {{bool}}12 case 1:13 break;14 }15}16 17// PR551818struct 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 61// PR930462void click_check_header_sizes() {63 switch (0 == 8) { // expected-warning {{switch condition has boolean value}}64 case 0: ;65 }66}67 68void 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 89namespace Conversion {90 struct S {91 explicit operator int(); // expected-note {{conversion}}92 };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 104namespace OpaqueEnumWarnings {105 106enum Opaque : int;107enum class OpaqueClass : int;108 109enum class Defined : int;110enum class Defined : int { a };111 112void test(Opaque o, OpaqueClass oc, Defined d) {113 // Don't warn that case value is not present in opaque enums.114 switch (o) {115 case (Opaque)1:116 break;117 }118 switch (oc) {119 case (OpaqueClass)1:120 break;121 }122 123 switch (d) {124 case Defined::a:125 break;126 case (Defined)2: // expected-warning {{case value not in enumerated type 'Defined'}}127 break;128 }129}130 131}132 133namespace EmptyEnum {134 135enum Empty : int {};136void test(Empty e) {137 switch (e) {138 case (Empty)0:139 break;140 }141 switch (e) {142 default:143 break;144 }145}146 147} // namespace EmptyEnum148