reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
// 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;
  }
}

}