| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| |
| void test() { |
| bool x = true; |
| switch (x) { // expected-warning {{bool}} |
| case 0: |
| break; |
| } |
| |
| int n = 3; |
| switch (n && true) { // expected-warning {{bool}} |
| case 1: |
| break; |
| } |
| } |
| |
| // PR5518 |
| struct A { |
| operator int(); // expected-note{{conversion to integral type}} |
| }; |
| |
| void x() { |
| switch(A()) { |
| } |
| } |
| |
| enum E { e1, e2 }; |
| struct B : A { |
| operator E() const; // expected-note{{conversion to enumeration type}} |
| }; |
| |
| void x2() { |
| switch (B()) { // expected-error{{multiple conversions}} |
| } |
| } |
| |
| struct C; // expected-note{{forward declaration}} |
| |
| void x3(C &c) { |
| switch (c) { // expected-error{{incomplete class type}} |
| } |
| } |
| |
| namespace test3 { |
| enum En { A, B, C }; |
| template <En how> void foo() { |
| int x = 0, y = 5; |
| |
| switch (how) { //expected-warning {{no case matching constant switch condition '2'}} |
| case A: x *= y; break; |
| case B: x += y; break; |
| // No case for C, but it's okay because we have a constant condition. |
| } |
| } |
| |
| template void foo<A>(); |
| template void foo<B>(); |
| template void foo<C>(); //expected-note {{in instantiation}} |
| } |
| |
| // PR9304 and rdar://9045501 |
| void click_check_header_sizes() { |
| switch (0 == 8) { // expected-warning {{switch condition has boolean value}} |
| case 0: ; |
| } |
| } |
| |
| void local_class(int n) { |
| for (;;) switch (n) { |
| case 0: |
| struct S { |
| void f() { |
| case 1: // expected-error {{'case' statement not in switch statement}} |
| break; // expected-error {{'break' statement not in loop or switch statement}} |
| default: // expected-error {{'default' statement not in switch statement}} |
| continue; // expected-error {{'continue' statement not in loop statement}} |
| } |
| }; |
| S().f(); |
| []{ |
| case 2: // expected-error {{'case' statement not in switch statement}} |
| break; // expected-error {{'break' statement not in loop or switch statement}} |
| default: // expected-error {{'default' statement not in switch statement}} |
| continue; // expected-error {{'continue' statement not in loop statement}} |
| }(); |
| } |
| } |
| |
| namespace Conversion { |
| struct S { |
| explicit operator int(); // expected-note {{conversion}} |
| }; |
| template<typename T> void f(T t) { |
| switch (t) { // expected-error {{explicit conversion}} |
| case 0: |
| return; |
| default: |
| break; |
| } |
| } |
| template void f(S); // expected-note {{instantiation of}} |
| } |
| |
| // rdar://29230764 |
| namespace OpaqueEnumWarnings { |
| |
| enum Opaque : int; |
| enum class OpaqueClass : int; |
| |
| enum class Defined : int; |
| enum class Defined : int { a }; |
| |
| void test(Opaque o, OpaqueClass oc, Defined d) { |
| // Don't warn that case value is not present in opaque enums. |
| switch (o) { |
| case (Opaque)1: |
| break; |
| } |
| switch (oc) { |
| case (OpaqueClass)1: |
| break; |
| } |
| |
| switch (d) { |
| case Defined::a: |
| break; |
| case (Defined)2: // expected-warning {{case value not in enumerated type 'OpaqueEnumWarnings::Defined'}} |
| break; |
| } |
| } |
| |
| } |