1 // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2 
3 extern int printf(const char*, ...);
4 
5 // CHECK-LABEL: @_Z4testi(
test(int val)6 int test(int val){
7  switch (val) {
8  case 4:
9    do {
10      switch (6) {
11        // CHECK: call i32 (i8*, ...) @_Z6printfPKcz
12        case 6: do { case 5: printf("bad\n"); } while (0);
13      };
14    } while (0);
15  }
16  return 0;
17 }
18 
main(void)19 int main(void) {
20  return test(5);
21 }
22 
23 // CHECK-LABEL: @_Z10other_testv(
other_test()24 void other_test() {
25   switch(0) {
26   case 0:
27     do {
28     default:;
29     } while(0);
30   }
31 }
32 
33 struct X { X(); ~X(); };
34 
35 void dont_call();
36 void foo();
37 
38 // CHECK-LABEL: @_Z13nested_scopesv(
nested_scopes()39 void nested_scopes() {
40   switch (1) {
41   case 0:
42     // CHECK-NOT: @_Z9dont_callv(
43     dont_call();
44     break;
45 
46   default:
47     // CHECK: call {{.*}} @_ZN1XC1Ev(
48     // CHECK: call {{.*}} @_Z3foov(
49     // CHECK-NOT: call {{.*}} @_Z3foov(
50     // CHECK: call {{.*}} @_ZN1XD1Ev(
51     { X x; foo(); }
52 
53     // CHECK: call {{.*}} @_ZN1XC1Ev(
54     // CHECK: call {{.*}} @_Z3foov(
55     // CHECK: call {{.*}} @_ZN1XD1Ev(
56     { X x; foo(); }
57 
58     // CHECK: call {{.*}} @_ZN1XC1Ev(
59     // CHECK: call {{.*}} @_Z3foov(
60     // CHECK: call {{.*}} @_ZN1XD1Ev(
61     { X x; foo(); }
62     break;
63   }
64 }
65 
66 // CHECK-LABEL: @_Z17scope_fallthroughv(
scope_fallthrough()67 void scope_fallthrough() {
68   switch (1) {
69     // CHECK: call {{.*}} @_ZN1XC1Ev(
70     // CHECK-NOT: call {{.*}} @_Z3foov(
71     // CHECK: call {{.*}} @_ZN1XD1Ev(
72     { default: X x; }
73     // CHECK: call {{.*}} @_Z3foov(
74     foo();
75     break;
76   }
77 }
78 
79 // CHECK-LABEL: @_Z12hidden_breakb(
hidden_break(bool b)80 void hidden_break(bool b) {
81   switch (1) {
82   default:
83     // CHECK: br
84     if (b)
85       break;
86     // CHECK: call {{.*}} @_Z3foov(
87     foo();
88     break;
89   }
90 }
91 
92 // CHECK-LABEL: @_Z10hidden_varv(
hidden_var()93 int hidden_var() {
94   switch (1) {
95   // CHECK: %[[N:.*]] = alloca i32
96   case 0: int n;
97   // CHECK: store i32 0, i32* %[[N]]
98   // CHECK: load i32, i32* %[[N]]
99   // CHECK: ret
100   default: n = 0; return n;
101   }
102 }
103 
104 // CHECK-LABEL: @_Z13case_in_labelv(
case_in_label()105 void case_in_label() {
106   // CHECK: br label %
107   switch (1) case 1: foo: case 0: goto foo;
108 }
109