2014-08-04 08:40:48 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -Wswitch-enum -Wcovered-switch-default -triple x86_64-linux-gnu %s
2007-07-24 01:05:23 +08:00
void f ( int z ) {
while ( z ) {
2007-08-24 02:29:20 +08:00
default : z - - ; // expected-error {{statement not in switch}}
2007-07-24 01:05:23 +08:00
}
}
2007-08-23 13:46:52 +08:00
void foo ( int X ) {
switch ( X ) {
2008-11-24 07:12:31 +08:00
case 42 : ; // expected-note {{previous case}}
2007-08-24 02:29:20 +08:00
case 5000000000LL : // expected-warning {{overflow}}
2012-05-16 13:32:58 +08:00
case 42 : // expected-error {{duplicate case value '42'}}
2007-08-23 13:46:52 +08:00
;
2007-08-24 01:48:14 +08:00
2007-08-24 02:29:20 +08:00
case 100 . . . 99 : ; // expected-warning {{empty case range}}
2008-11-24 07:12:31 +08:00
case 43 : ; // expected-note {{previous case}}
2007-08-24 02:29:20 +08:00
case 43 . . . 45 : ; // expected-error {{duplicate case value}}
2008-11-24 07:12:31 +08:00
case 100 . . . 20000 : ; // expected-note {{previous case}}
2007-08-24 02:29:20 +08:00
case 15000 . . . 40000000 : ; // expected-error {{duplicate case value}}
2007-08-23 13:46:52 +08:00
}
}
2007-08-23 22:29:07 +08:00
void test3 ( void ) {
2007-08-24 02:29:20 +08:00
// empty switch;
2012-02-15 06:14:32 +08:00
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}}
2007-08-23 22:29:07 +08:00
}
2008-11-23 05:04:56 +08:00
extern int g ( ) ;
void test4 ( )
{
2010-05-18 11:19:21 +08:00
int cond ;
switch ( cond ) {
2008-11-23 05:04:56 +08:00
case 0 & & g ( ) :
case 1 | | g ( ) :
break ;
}
2010-05-18 11:19:21 +08:00
switch ( cond ) {
2008-12-01 10:13:02 +08:00
case g ( ) : / / expected - error { { expression is not an integer constant expression } }
case 0 . . . g ( ) : // expected-error {{expression is not an integer constant expression}}
2008-11-23 05:04:56 +08:00
break ;
}
2010-05-18 11:19:21 +08:00
switch ( cond ) {
2008-11-23 05:04:56 +08:00
case 0 & & g ( ) . . . 1 | | g ( ) :
break ;
}
2008-11-23 05:50:49 +08:00
2010-05-18 11:19:21 +08:00
switch ( cond ) {
2012-02-04 17:53:13 +08:00
case g ( ) / / expected - error { { expression is not an integer constant expression } }
& & 0 :
2008-11-23 05:50:49 +08:00
break ;
}
2010-05-18 11:19:21 +08:00
switch ( cond ) {
2012-02-04 17:53:13 +08:00
case 0 . . .
g ( ) // expected-error {{expression is not an integer constant expression}}
| | 1 :
2008-11-23 05:50:49 +08:00
break ;
}
2008-11-23 05:04:56 +08:00
}
2008-11-24 07:12:31 +08:00
void test5 ( int z ) {
switch ( z ) {
default : // expected-note {{previous case defined here}}
default : // expected-error {{multiple default labels in one switch}}
break ;
}
}
2009-10-17 00:45:22 +08:00
void test6 ( ) {
2010-05-18 11:19:21 +08:00
char ch = ' a ' ;
2009-10-17 00:45:22 +08:00
switch ( ch ) {
case 1234 : // expected-warning {{overflow converting case value}}
break ;
}
}
2009-11-25 14:20:02 +08:00
// PR5606
2010-10-15 04:34:08 +08:00
int f0 ( int var ) {
2009-11-25 14:20:02 +08:00
switch ( va ) { // expected-error{{use of undeclared identifier 'va'}}
case 1 :
break ;
case 2 :
return 1 ;
}
return 2 ;
}
2010-02-09 06:24:16 +08:00
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 :
2014-04-02 13:58:29 +08:00
case 3 : // expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
2010-02-09 06:24:16 +08:00
break ;
}
switch ( a ) {
case A :
case B :
2014-04-02 13:58:29 +08:00
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}}
2010-02-09 06:24:16 +08:00
break ;
}
switch ( a ) {
case 1 . . . 2 :
break ;
}
switch ( a ) {
2014-04-02 13:58:29 +08:00
case 0 . . . 2 : //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
2010-02-09 06:24:16 +08:00
break ;
}
switch ( a ) {
2014-04-02 13:58:29 +08:00
case 1 . . . 3 : //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
2010-02-09 06:24:16 +08:00
break ;
}
switch ( a ) {
2014-04-02 13:58:29 +08:00
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}}
2010-02-09 06:24:16 +08:00
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 ) {
2014-04-02 13:58:29 +08:00
case 0 : //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
2010-02-09 06:24:16 +08:00
case 1 :
2014-04-02 13:58:29 +08:00
case 2 : //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
2010-02-09 06:24:16 +08:00
case 3 :
2014-04-02 13:58:29 +08:00
case 4 : //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
2010-02-09 06:24:16 +08:00
break ;
}
}
void test10 ( ) {
enum {
A = 10 ,
C = 2 ,
B = 4 ,
D = 12
} a ;
switch ( a ) {
2014-04-02 13:58:29 +08:00
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}}
2010-02-09 06:24:16 +08:00
case 2 . . . 4 :
2014-04-02 13:58:29 +08:00
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}}
2010-02-09 06:24:16 +08:00
case 10 . . . 12 :
2014-04-02 13:58:29 +08:00
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}}
2010-02-09 06:24:16 +08:00
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 ;
}
2012-01-24 12:56:25 +08:00
switch ( a ) { //expected-warning{{enumeration value 'A' not explicitly handled in switch}}
2010-02-09 06:24:16 +08:00
case B :
case C :
break ;
default :
break ;
}
}
void test12 ( ) {
enum {
A = - 1 ,
B = 4294967286
} a ;
switch ( a ) {
case A :
case B :
break ;
}
}
2010-02-18 07:29:11 +08:00
// <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 ;
}
2010-02-18 08:56:01 +08:00
// <rdar://problem/7658121>
enum {
EC0 = 0xFFFF0000 ,
EC1 = 0xFFFF0001 ,
} ;
int test14 ( int a ) {
switch ( a ) {
case EC0 : return 0 ;
case EC1 : return 1 ;
}
return 0 ;
}
2010-03-01 09:04:55 +08:00
void f1 ( unsigned x ) {
switch ( x ) {
case - 1 : break ;
default : break ;
}
}
2010-05-18 11:19:21 +08:00
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 ;
}
}
2010-06-12 09:56:02 +08:00
// 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 ;
}
}
2012-01-22 02:12:07 +08:00
int test18 ( ) {
enum { A , B } a ;
switch ( a ) {
case A : return 0 ;
case B : return 1 ;
2012-01-22 10:31:55 +08:00
case 7 : return 1 ; // expected-warning {{case value not in enumerated type}}
2012-01-24 13:34:08 +08:00
default : return 2 ; // expected-warning {{default label in switch which covers all enumeration values}}
2012-01-22 10:31:55 +08:00
}
}
2012-03-22 04:56:29 +08:00
// 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 ;
}
}
2012-05-16 13:32:58 +08:00
// PR9243
# define TEST19MACRO 5
void test19 ( int i ) {
enum {
kTest19Enum1 = 7 ,
2012-05-30 09:01:11 +08:00
kTest19Enum2 = kTest19Enum1
2012-05-16 13:32:58 +08:00
} ;
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 ;
}
}
2013-12-06 06:52:07 +08:00
// 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'}}
2018-07-27 02:41:30 +08:00
// expected-warning@-1 {{comparison of two values with different enumeration types in switch statement ('enum ExtendedEnum1' and 'enum ExtendedEnum1_unrelated')}}
2013-12-06 06:52:07 +08:00
}
}
2014-08-04 08:40:48 +08:00
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 : ;
}