1379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian// RUN: %clang_cc1 -fsyntax-only -verify -Wassign-enum %s
2379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian// rdar://11824807
3379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian
4379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahaniantypedef enum CCTestEnum
5379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian{
6379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  One,
7379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  Two=4,
8379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  Three
9379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian} CCTestEnum;
10379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian
11379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz JahanianCCTestEnum test = 50; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
12379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz JahanianCCTestEnum test1 = -50; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
13379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Explicit cast should silence the warning.
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic const CCTestEnum SilenceWithCast1 = 51; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic const CCTestEnum SilenceWithCast2 = (CCTestEnum) 51; // no-warning
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic const CCTestEnum SilenceWithCast3 = (const CCTestEnum) 51; // no-warning
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic const CCTestEnum SilenceWithCast4 = (const volatile CCTestEnum) 51; // no-warning
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid SilenceWithCastLocalVar() {
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CCTestEnum SilenceWithCast1 = 51; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CCTestEnum SilenceWithCast2 = (CCTestEnum) 51; // no-warning
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CCTestEnum SilenceWithCast3 = (const CCTestEnum) 51; // no-warning
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CCTestEnum SilenceWithCast4 = (const volatile CCTestEnum) 51; // no-warning
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CCTestEnum SilenceWithCast1c = 51; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CCTestEnum SilenceWithCast2c = (CCTestEnum) 51; // no-warning
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CCTestEnum SilenceWithCast3c = (const CCTestEnum) 51; // no-warning
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CCTestEnum SilenceWithCast4c = (const volatile CCTestEnum) 51; // no-warning
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
32379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz JahanianCCTestEnum foo(CCTestEnum r) {
33379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  return 20; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
34379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian}
35379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian
36379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanianenum Test2 { K_zero, K_one };
37379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanianenum Test2 test2(enum Test2 *t) {
38379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  *t = 20; // expected-warning {{integer constant not in range of enumerated type 'enum Test2'}}
39379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  return 10; // expected-warning {{integer constant not in range of enumerated type 'enum Test2'}}
40379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian}
41379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian
4248a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly// PR15069
4348a1e81715bf9c37a4168d83f4218e6517e29541Joey Goulytypedef enum
4448a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly{
4548a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly  a = 0
4648a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly} T;
4748a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly
4848a1e81715bf9c37a4168d83f4218e6517e29541Joey Goulyvoid f()
4948a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly{
5048a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly  T x = a;
5148a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly  x += 1; // expected-warning {{integer constant not in range of enumerated type}}
5248a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly}
5348a1e81715bf9c37a4168d83f4218e6517e29541Joey Gouly
54379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanianint main() {
55379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  CCTestEnum test = 1; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
56379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  test = 600; // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
57379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  foo(2); // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
58379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  foo(-1); // expected-warning {{integer constant not in range of enumerated type 'CCTestEnum'}}
59379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  foo(4);
60379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian  foo(Two+1);
61379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian}
62379b28183a7dcb715c3f3eb2da4b0157d6d8ffbeFariborz Jahanian
63