1 // RUN: %clang_cc1 -fsyntax-only -verify -Wassign-enum %s
2 // rdar://11824807
3 
4 typedef enum CCTestEnum
5 {
6   One,
7   Two=4,
8   Three
9 } CCTestEnum;
10 
11 CCTestEnum test = 50; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
12 CCTestEnum test1 = -50; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
13 
14 // Explicit cast should silence the warning.
15 static const CCTestEnum SilenceWithCast1 = 51; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
16 static const CCTestEnum SilenceWithCast2 = (CCTestEnum) 51; // no-warning
17 static const CCTestEnum SilenceWithCast3 = (const CCTestEnum) 51; // no-warning
18 static const CCTestEnum SilenceWithCast4 = (const volatile CCTestEnum) 51; // no-warning
19 
SilenceWithCastLocalVar()20 void SilenceWithCastLocalVar() {
21   CCTestEnum SilenceWithCast1 = 51; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
22   CCTestEnum SilenceWithCast2 = (CCTestEnum) 51; // no-warning
23   CCTestEnum SilenceWithCast3 = (const CCTestEnum) 51; // no-warning
24   CCTestEnum SilenceWithCast4 = (const volatile CCTestEnum) 51; // no-warning
25 
26   const CCTestEnum SilenceWithCast1c = 51; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
27   const CCTestEnum SilenceWithCast2c = (CCTestEnum) 51; // no-warning
28   const CCTestEnum SilenceWithCast3c = (const CCTestEnum) 51; // no-warning
29   const CCTestEnum SilenceWithCast4c = (const volatile CCTestEnum) 51; // no-warning
30 }
31 
foo(CCTestEnum r)32 CCTestEnum foo(CCTestEnum r) {
33   return 20; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
34 }
35 
36 enum Test2 { K_zero, K_one };
test2(enum Test2 * t)37 enum Test2 test2(enum Test2 *t) {
38   *t = 20; // expected-warning {{integer constant not in range of enumerated type 'enum Test2'}}
39   return 10; // expected-warning {{integer constant not in range of enumerated type 'enum Test2'}}
40 }
41 
42 // PR15069
43 typedef enum
44 {
45   a = 0
46 } T;
47 
f()48 void f()
49 {
50   T x = a;
51   x += 1; // expected-warning {{integer constant not in range of enumerated type}}
52 }
53 
main()54 int main() {
55   CCTestEnum test = 1; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
56   test = 600; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
57   foo(2); // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
58   foo(-1); // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
59   foo(4);
60   foo(Two+1);
61 }
62 
63