| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- // RUN: %clang_cc1 -fsyntax-only -verify -Wswitch-enum -Wcovered-switch-default -triple x86_64-linux-gnu %s
- void f (int z) {
- while (z) {
- default: z--; // expected-error {{statement not in switch}}
- }
- }
- void foo(int X) {
- switch (X) {
- case 42: ; // expected-note {{previous case}}
- case 5000000000LL: // expected-warning {{overflow}}
- case 42: // expected-error {{duplicate case value '42'}}
- ;
- case 100 ... 99: ; // expected-warning {{empty case range}}
- case 43: ; // expected-note {{previous case}}
- case 43 ... 45: ; // expected-error {{duplicate case value}}
- case 100 ... 20000:; // expected-note {{previous case}}
- case 15000 ... 40000000:; // expected-error {{duplicate case value}}
- }
- }
- void test3(void) {
- // empty switch;
- switch (0); // expected-warning {{no case matching constant switch condition '0'}} \
- // expected-warning {{switch statement has empty body}} \
- // expected-note{{put the semicolon on a separate line to silence this warning}}
- }
- extern int g();
- void test4()
- {
- int cond;
- switch (cond) {
- case 0 && g():
- case 1 || g():
- break;
- }
- switch(cond) {
- case g(): // expected-error {{expression is not an integer constant expression}}
- case 0 ... g(): // expected-error {{expression is not an integer constant expression}}
- break;
- }
-
- switch (cond) {
- case 0 && g() ... 1 || g():
- break;
- }
-
- switch (cond) {
- case g() // expected-error {{expression is not an integer constant expression}}
- && 0:
- break;
- }
-
- switch (cond) {
- case 0 ...
- g() // expected-error {{expression is not an integer constant expression}}
- || 1:
- break;
- }
- }
- void test5(int z) {
- switch(z) {
- default: // expected-note {{previous case defined here}}
- default: // expected-error {{multiple default labels in one switch}}
- break;
- }
- }
- void test6() {
- char ch = 'a';
- switch(ch) {
- case 1234: // expected-warning {{overflow converting case value}}
- break;
- }
- }
- // PR5606
- int f0(int var) {
- switch (va) { // expected-error{{use of undeclared identifier 'va'}}
- case 1:
- break;
- case 2:
- return 1;
- }
- return 2;
- }
- void test7() {
- enum {
- A = 1,
- B
- } a;
- switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
- case A:
- break;
- }
- switch(a) {
- case B:
- case A:
- break;
- }
- switch(a) {
- case A:
- case B:
- case 3: // expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- break;
- }
- switch(a) {
- case A:
- case B:
- case 3 ... //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- 4: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- break;
- }
- switch(a) {
- case 1 ... 2:
- break;
- }
- switch(a) {
- case 0 ... 2: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- break;
- }
- switch(a) {
- case 1 ... 3: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- break;
- }
- switch(a) {
- case 0 ... //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- 3: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- break;
- }
- }
- void test8() {
- enum {
- A,
- B,
- C = 1
- } a;
- switch(a) {
- case A:
- case B:
- break;
- }
- switch(a) {
- case A:
- case C:
- break;
- }
- switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
- case A:
- break;
- }
- }
- void test9() {
- enum {
- A = 3,
- C = 1
- } a;
- switch(a) {
- case 0: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- case 1:
- case 2: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- case 3:
- case 4: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- break;
- }
- }
- void test10() {
- enum {
- A = 10,
- C = 2,
- B = 4,
- D = 12
- } a;
- switch(a) {
- case 0 ... //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- 1: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- case 2 ... 4:
- case 5 ... //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- 9: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- case 10 ... 12:
- case 13 ... //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- 16: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
- break;
- }
- }
- void test11() {
- enum {
- A = -1,
- B,
- C
- } a;
- switch(a) { //expected-warning{{enumeration value 'A' not handled in switch}}
- case B:
- case C:
- break;
- }
- switch(a) { //expected-warning{{enumeration value 'A' not explicitly handled in switch}}
- case B:
- case C:
- break;
-
- default:
- break;
- }
- }
- void test12() {
- enum {
- A = -1,
- B = 4294967286
- } a;
- switch(a) {
- case A:
- case B:
- break;
- }
- }
- // <rdar://problem/7643909>
- typedef enum {
- val1,
- val2,
- val3
- } my_type_t;
- int test13(my_type_t t) {
- switch(t) { // expected-warning{{enumeration value 'val3' not handled in switch}}
- case val1:
- return 1;
- case val2:
- return 2;
- }
- return -1;
- }
- // <rdar://problem/7658121>
- enum {
- EC0 = 0xFFFF0000,
- EC1 = 0xFFFF0001,
- };
- int test14(int a) {
- switch(a) {
- case EC0: return 0;
- case EC1: return 1;
- }
- return 0;
- }
- void f1(unsigned x) {
- switch (x) {
- case -1: break;
- default: break;
- }
- }
- void test15() {
- int i = 0;
- switch (1) { // expected-warning {{no case matching constant switch condition '1'}}
- case 0: i = 0; break;
- case 2: i++; break;
- }
- }
- void test16() {
- const char c = '5';
- switch (c) { // expected-warning {{no case matching constant switch condition '53'}}
- case '6': return;
- }
- }
- // PR7359
- void test17(int x) {
- switch (x >= 17) { // expected-warning {{switch condition has boolean value}}
- case 0: return;
- }
- switch ((int) (x <= 17)) {
- case 0: return;
- }
- }
- int test18() {
- enum { A, B } a;
- switch (a) {
- case A: return 0;
- case B: return 1;
- case 7: return 1; // expected-warning {{case value not in enumerated type}}
- default: return 2; // expected-warning {{default label in switch which covers all enumeration values}}
- }
- }
- // rdar://110822110
- typedef enum {
- kOne = 1,
- } Ints;
-
- void rdar110822110(Ints i)
- {
- switch (i) {
- case kOne:
- break;
- case 2: // expected-warning {{case value not in enumerated type 'Ints'}}
- break;
- default: // expected-warning {{default label in switch which covers all enumeration values}}
- break;
- }
- }
- // PR9243
- #define TEST19MACRO 5
- void test19(int i) {
- enum {
- kTest19Enum1 = 7,
- kTest19Enum2 = kTest19Enum1
- };
- const int a = 3;
- switch (i) {
- case 5: // expected-note {{previous case}}
- case TEST19MACRO: // expected-error {{duplicate case value '5'}}
- case 7: // expected-note {{previous case}}
- case kTest19Enum1: // expected-error {{duplicate case value: '7' and 'kTest19Enum1' both equal '7'}} \
- // expected-note {{previous case}}
- case kTest19Enum1: // expected-error {{duplicate case value 'kTest19Enum1'}} \
- // expected-note {{previous case}}
- case kTest19Enum2: // expected-error {{duplicate case value: 'kTest19Enum1' and 'kTest19Enum2' both equal '7'}} \
- // expected-note {{previous case}}
- case (int)kTest19Enum2: //expected-error {{duplicate case value 'kTest19Enum2'}}
- case 3: // expected-note {{previous case}}
- case a: // expected-error {{duplicate case value: '3' and 'a' both equal '3'}} \
- // expected-note {{previous case}}
- case a: // expected-error {{duplicate case value 'a'}}
- break;
- }
- }
- // Allow the warning 'case value not in enumerated type' to be silenced with
- // the following pattern.
- //
- // If 'case' expression refers to a static const variable of the correct enum
- // type, then we count this as a sufficient declaration of intent by the user,
- // so we silence the warning.
- enum ExtendedEnum1 {
- EE1_a,
- EE1_b
- };
- enum ExtendedEnum1_unrelated { EE1_misc };
- static const enum ExtendedEnum1 EE1_c = 100;
- static const enum ExtendedEnum1_unrelated EE1_d = 101;
- void switch_on_ExtendedEnum1(enum ExtendedEnum1 e) {
- switch(e) {
- case EE1_a: break;
- case EE1_b: break;
- case EE1_c: break; // no-warning
- case EE1_d: break; // expected-warning {{case value not in enumerated type 'enum ExtendedEnum1'}}
- }
- }
- void PR11778(char c, int n, long long ll) {
- // Do not reject this; we don't have duplicate case values because we
- // check for duplicates in the promoted type.
- switch (c) case 1: case 257: ; // expected-warning {{overflow}}
- switch (n) case 0x100000001LL: case 1: ; // expected-warning {{overflow}} expected-error {{duplicate}} expected-note {{previous}}
- switch ((int)ll) case 0x100000001LL: case 1: ; // expected-warning {{overflow}} expected-error {{duplicate}} expected-note {{previous}}
- switch ((long long)n) case 0x100000001LL: case 1: ;
- switch (ll) case 0x100000001LL: case 1: ;
- }
|