Clang Project

clang_source_code/test/CodeGenCXX/switch-case-folding-2.cpp
1// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2
3extern int printf(const char*, ...);
4
5// CHECK-LABEL: @_Z4testi(
6int 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
19int main(void) {
20 return test(5);
21}
22
23// CHECK-LABEL: @_Z10other_testv(
24void other_test() {
25  switch(0) {
26  case 0:
27    do {
28    default:;
29    } while(0);
30  }
31}
32
33struct X { X(); ~X(); };
34
35void dont_call();
36void foo();
37
38// CHECK-LABEL: @_Z13nested_scopesv(
39void 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(
67void 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(
80void 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(
93int 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(
105void case_in_label() {
106  // CHECK: br label %
107  switch (1) case 1: foo: case 0: goto foo;
108}
109