11a2b8e27135ec72f183dd4510612f6d5d7ee088aTed Kremenek// RUN: %clang_cc1 -fsyntax-only -verify -Wswitch-enum -Wcovered-switch-default %s
28a87e57beb96212ee61dc08a5f691cd7f7710703Chris Lattnervoid f (int z) {
38a87e57beb96212ee61dc08a5f691cd7f7710703Chris Lattner  while (z) {
40471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner    default: z--;            // expected-error {{statement not in switch}}
58a87e57beb96212ee61dc08a5f691cd7f7710703Chris Lattner  }
68a87e57beb96212ee61dc08a5f691cd7f7710703Chris Lattner}
78a87e57beb96212ee61dc08a5f691cd7f7710703Chris Lattner
8f4021e7d5228a2be5a380269dffa0331a6c78b95Chris Lattnervoid foo(int X) {
9f4021e7d5228a2be5a380269dffa0331a6c78b95Chris Lattner  switch (X) {
105f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner  case 42: ;                 // expected-note {{previous case}}
110471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner  case 5000000000LL:         // expected-warning {{overflow}}
123940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor  case 42:                   // expected-error {{duplicate case value '42'}}
13f4021e7d5228a2be5a380269dffa0331a6c78b95Chris Lattner   ;
146efc4d3659632ddcea4a58cb62e9ee54ca4a373eChris Lattner
150471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner  case 100 ... 99: ;         // expected-warning {{empty case range}}
160471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner
175f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner  case 43: ;                 // expected-note {{previous case}}
180471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner  case 43 ... 45:  ;         // expected-error {{duplicate case value}}
190471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner
205f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner  case 100 ... 20000:;       // expected-note {{previous case}}
210471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner  case 15000 ... 40000000:;  // expected-error {{duplicate case value}}
22f4021e7d5228a2be5a380269dffa0331a6c78b95Chris Lattner  }
23f4021e7d5228a2be5a380269dffa0331a6c78b95Chris Lattner}
24f4021e7d5228a2be5a380269dffa0331a6c78b95Chris Lattner
25f334850cd2fc2d4ac9b585f80d97b4f0097a0348Chris Lattnervoid test3(void) {
260471f5bc8191e39cdb61fabcaf1870e2af2d42e8Chris Lattner  // empty switch;
27625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko  switch (0); // expected-warning {{no case matching constant switch condition '0'}} \
28625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko              // expected-warning {{switch statement has empty body}} \
29625bb569df0c34feec0d52c0ec5215f21ef2e054Dmitri Gribenko              // expected-note{{put the semicolon on a separate line to silence this warning}}
30f334850cd2fc2d4ac9b585f80d97b4f0097a0348Chris Lattner}
31f334850cd2fc2d4ac9b585f80d97b4f0097a0348Chris Lattner
3251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlssonextern int g();
3351fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
3451fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlssonvoid test4()
3551fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson{
360fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  int cond;
370fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  switch (cond) {
3851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  case 0 && g():
3951fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  case 1 || g():
4051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson    break;
4151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  }
4251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
430fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  switch(cond)  {
44d3a61d5ec5357d19b7c0b6b599231e68dc5e237fAnders Carlsson  case g(): // expected-error {{expression is not an integer constant expression}}
45d3a61d5ec5357d19b7c0b6b599231e68dc5e237fAnders Carlsson  case 0 ... g(): // expected-error {{expression is not an integer constant expression}}
4651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson    break;
4751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  }
4851fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
490fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  switch (cond) {
5051fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  case 0 && g() ... 1 || g():
5151fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson    break;
5251fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson  }
536dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
540fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  switch (cond) {
55282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith  case g() // expected-error {{expression is not an integer constant expression}}
56282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith      && 0:
576dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    break;
586dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson  }
596dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson
600fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  switch (cond) {
61282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith  case 0 ...
62282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith      g() // expected-error {{expression is not an integer constant expression}}
63282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith      || 1:
646dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson    break;
656dde0d5dc09f45f4d9508c964703e36fef1a0198Anders Carlsson  }
6651fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson}
6751fe996231b1d7199f76e4005ff4c943d5deeecdAnders Carlsson
685f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattnervoid test5(int z) {
695f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner  switch(z) {
705f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner    default:  // expected-note {{previous case defined here}}
715f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner    default:  // expected-error {{multiple default labels in one switch}}
725f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner      break;
735f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner  }
745f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner}
755f4a6829dc58cab2f76e2b98492859aa3b91e3f2Chris Lattner
765f04881eb025f61396d0555d8173730fe2759e0aChris Lattnervoid test6() {
770fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  char ch = 'a';
785f04881eb025f61396d0555d8173730fe2759e0aChris Lattner  switch(ch) {
795f04881eb025f61396d0555d8173730fe2759e0aChris Lattner    case 1234:  // expected-warning {{overflow converting case value}}
805f04881eb025f61396d0555d8173730fe2759e0aChris Lattner      break;
815f04881eb025f61396d0555d8173730fe2759e0aChris Lattner  }
825f04881eb025f61396d0555d8173730fe2759e0aChris Lattner}
83be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor
84be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor// PR5606
85e24b575f06985336973bb721e198bd184bf7bdd3Douglas Gregorint f0(int var) {
86be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor  switch (va) { // expected-error{{use of undeclared identifier 'va'}}
87be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor  case 1:
88be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor    break;
89be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor  case 2:
90be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor    return 1;
91be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor  }
92be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor  return 2;
93be724bab2ba7ad47aebced25e7c8ec551eb72d28Douglas Gregor}
94ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
95ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregorvoid test7() {
96ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  enum {
97ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    A = 1,
98ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    B
99ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  } a;
100ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
101ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
102ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
103ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
104ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
105ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case B:
106ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
107ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
108ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
109ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
110ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
111ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case B:
11254faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 3: // expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
113ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
114ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
115ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
116ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
117ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case B:
11854faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 3 ... //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
11954faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian        4: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
120ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
121ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
122ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
123ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case 1 ... 2:
124ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
125ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
126ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
12754faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 0 ... 2: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
128ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
129ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
130ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
13154faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 1 ... 3: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
132ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
133ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
134ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
13554faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 0 ...  //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
13654faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian      3:  //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
137ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
138ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
139ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
140ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor}
141ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
142ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregorvoid test8() {
143ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  enum {
144ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    A,
145ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    B,
146ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    C = 1
147ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  } a;
148ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
149ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
150ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case B:
151ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor     break;
152ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
153ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
154ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
155ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case C:
156ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
157ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
158ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
159ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
160ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
161ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
162ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor}
163ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
164ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregorvoid test9() {
165ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  enum {
166ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    A = 3,
167ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    C = 1
168ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  } a;
169ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
17054faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 0: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
171ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case 1:
17254faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 2: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
173ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case 3:
17454faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 4: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
175ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
176ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
177ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor}
178ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
179ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregorvoid test10() {
180ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  enum {
181ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    A = 10,
182ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    C = 2,
183ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    B = 4,
184ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    D = 12
185ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  } a;
186ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
18754faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 0 ...  //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
18854faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian	    1:  //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
189ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case 2 ... 4:
19054faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 5 ...  //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
19154faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian	      9:  //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
192ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case 10 ... 12:
19354faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian    case 13 ...  //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
19454faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian              16: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
195ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
196ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
197ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor}
198ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
199ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregorvoid test11() {
200ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  enum {
201ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    A = -1,
202ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    B,
203ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    C
204ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  } a;
205ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) { //expected-warning{{enumeration value 'A' not handled in switch}}
206ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case B:
207ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case C:
208ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
209ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
210ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
211e1d82deb6839bf972aa6301da40f06e8926f0af5David Blaikie  switch(a) { //expected-warning{{enumeration value 'A' not explicitly handled in switch}}
212ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case B:
213ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case C:
214ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
215ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
216ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    default:
217ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
218ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
219ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor}
220ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor
221ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregorvoid test12() {
222ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  enum {
223ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    A = -1,
224ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    B = 4294967286
225ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  } a;
226ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  switch(a) {
227ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case A:
228ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor    case B:
229ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor      break;
230ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor  }
231ba915af51ced751c46e7c2b9c6f3b59d2e668825Douglas Gregor}
23230ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor
23330ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor// <rdar://problem/7643909>
23430ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregortypedef enum {
23530ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor    val1,
23630ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor    val2,
23730ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor    val3
23830ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor} my_type_t;
23930ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor
24030ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregorint test13(my_type_t t) {
24130ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor  switch(t) { // expected-warning{{enumeration value 'val3' not handled in switch}}
24230ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor  case val1:
24330ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor    return 1;
24430ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor  case val2:
24530ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor    return 2;
24630ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor  }
24730ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor  return -1;
24830ab37122300a5f6664b8ae2d0b43b4396eb6bcbDouglas Gregor}
2492853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor
2502853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor// <rdar://problem/7658121>
2512853eac24e2e70a74d7da817653b0528b976039fDouglas Gregorenum {
2522853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor  EC0 = 0xFFFF0000,
2532853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor  EC1 = 0xFFFF0001,
2542853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor};
2552853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor
2562853eac24e2e70a74d7da817653b0528b976039fDouglas Gregorint test14(int a) {
2572853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor  switch(a) {
2582853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor  case EC0: return 0;
2592853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor  case EC1: return 1;
2602853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor  }
2612853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor  return 0;
2622853eac24e2e70a74d7da817653b0528b976039fDouglas Gregor}
263f9f627dbbc62fbf51b906c24c783b4249dc7e9bbDouglas Gregor
264f9f627dbbc62fbf51b906c24c783b4249dc7e9bbDouglas Gregorvoid f1(unsigned x) {
265f9f627dbbc62fbf51b906c24c783b4249dc7e9bbDouglas Gregor  switch (x) {
266f9f627dbbc62fbf51b906c24c783b4249dc7e9bbDouglas Gregor  case -1: break;
267f9f627dbbc62fbf51b906c24c783b4249dc7e9bbDouglas Gregor  default: break;
268f9f627dbbc62fbf51b906c24c783b4249dc7e9bbDouglas Gregor  }
269f9f627dbbc62fbf51b906c24c783b4249dc7e9bbDouglas Gregor}
2700fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall
2710fb97083cc0f8a82e404e22991ae80d2216e71d5John McCallvoid test15() {
2720fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  int i = 0;
2730fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  switch (1) { // expected-warning {{no case matching constant switch condition '1'}}
2740fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  case 0: i = 0; break;
2750fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  case 2: i++; break;
2760fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  }
2770fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall}
2780fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall
2790fb97083cc0f8a82e404e22991ae80d2216e71d5John McCallvoid test16() {
2800fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  const char c = '5';
2810fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  switch (c) { // expected-warning {{no case matching constant switch condition '53'}}
2820fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  case '6': return;
2830fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall  }
2840fb97083cc0f8a82e404e22991ae80d2216e71d5John McCall}
2856907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall
2866907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall// PR7359
2876907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCallvoid test17(int x) {
2886907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  switch (x >= 17) { // expected-warning {{switch condition has boolean value}}
2896907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  case 0: return;
2906907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  }
2916907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall
2926907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  switch ((int) (x <= 17)) {
2936907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  case 0: return;
2946907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall  }
2956907fbe758d23e1aec4c0a67e7b633d1d855feb4John McCall}
29631ceb61172bca7ebc3fb90e9125864c7a29c55c0David Blaikie
29731ceb61172bca7ebc3fb90e9125864c7a29c55c0David Blaikieint test18() {
29831ceb61172bca7ebc3fb90e9125864c7a29c55c0David Blaikie  enum { A, B } a;
29931ceb61172bca7ebc3fb90e9125864c7a29c55c0David Blaikie  switch (a) {
30031ceb61172bca7ebc3fb90e9125864c7a29c55c0David Blaikie  case A: return 0;
30131ceb61172bca7ebc3fb90e9125864c7a29c55c0David Blaikie  case B: return 1;
3029366750a5a97c8aeae1df4898ea849b087865195David Blaikie  case 7: return 1; // expected-warning {{case value not in enumerated type}}
3032dd52e3815d040e340a5d953d838cd2268e25372David Blaikie  default: return 2; // expected-warning {{default label in switch which covers all enumeration values}}
3049366750a5a97c8aeae1df4898ea849b087865195David Blaikie  }
3059366750a5a97c8aeae1df4898ea849b087865195David Blaikie}
30654faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian
30754faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian// rdar://110822110
30854faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahaniantypedef enum {
30954faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian        kOne = 1,
31054faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian} Ints;
31154faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian
31254faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanianvoid rdar110822110(Ints i)
31354faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian{
31454faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian        switch (i) {
31554faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian                case kOne:
31654faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian                        break;
31754faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian                case 2: 	// expected-warning {{case value not in enumerated type 'Ints'}}
31854faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian                        break;
31954faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian                default:	// expected-warning {{default label in switch which covers all enumeration values}}
32054faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian                        break;
32154faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian                }
32254faba4f7f3f0e8f1376da1c459312596ad5486dFariborz Jahanian}
3233940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor
3243940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor// PR9243
3253940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor#define TEST19MACRO 5
3263940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregorvoid test19(int i) {
3273940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor  enum {
3283940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    kTest19Enum1 = 7,
3297af7de7d6b121132dfe8c3b9b5febe2b37aafd62Richard Trieu    kTest19Enum2 = kTest19Enum1
3303940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor  };
3313940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor  const int a = 3;
3323940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor  switch (i) {
3333940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case 5: // expected-note {{previous case}}
3343940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case TEST19MACRO: // expected-error {{duplicate case value '5'}}
3353940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor
3363940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case 7: // expected-note {{previous case}}
3373940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case kTest19Enum1: // expected-error {{duplicate case value: '7' and 'kTest19Enum1' both equal '7'}} \
3383940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor                       // expected-note {{previous case}}
3393940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case kTest19Enum1: // expected-error {{duplicate case value 'kTest19Enum1'}} \
3403940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor                       // expected-note {{previous case}}
3413940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case kTest19Enum2: // expected-error {{duplicate case value: 'kTest19Enum1' and 'kTest19Enum2' both equal '7'}} \
3423940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor                       // expected-note {{previous case}}
3433940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case (int)kTest19Enum2: //expected-error {{duplicate case value 'kTest19Enum2'}}
3443940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor
3453940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case 3: // expected-note {{previous case}}
3463940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case a: // expected-error {{duplicate case value: '3' and 'a' both equal '3'}} \
3473940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor            // expected-note {{previous case}}
3483940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor    case a: // expected-error {{duplicate case value 'a'}}
3493940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor      break;
3503940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor  }
3513940ce83438e2332ba541f4e65e700fbefe0c7a8Douglas Gregor}
352