| // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s |
| |
| extern int printf(const char*, ...); |
| |
| // CHECK-LABEL: @_Z4testi( |
| int test(int val){ |
| switch (val) { |
| case 4: |
| do { |
| switch (6) { |
| // CHECK: call i32 (i8*, ...) @_Z6printfPKcz |
| case 6: do { case 5: printf("bad\n"); } while (0); |
| }; |
| } while (0); |
| } |
| return 0; |
| } |
| |
| int main(void) { |
| return test(5); |
| } |
| |
| // CHECK-LABEL: @_Z10other_testv( |
| void other_test() { |
| switch(0) { |
| case 0: |
| do { |
| default:; |
| } while(0); |
| } |
| } |
| |
| struct X { X(); ~X(); }; |
| |
| void dont_call(); |
| void foo(); |
| |
| // CHECK-LABEL: @_Z13nested_scopesv( |
| void nested_scopes() { |
| switch (1) { |
| case 0: |
| // CHECK-NOT: @_Z9dont_callv( |
| dont_call(); |
| break; |
| |
| default: |
| // CHECK: call {{.*}} @_ZN1XC1Ev( |
| // CHECK: call {{.*}} @_Z3foov( |
| // CHECK-NOT: call {{.*}} @_Z3foov( |
| // CHECK: call {{.*}} @_ZN1XD1Ev( |
| { X x; foo(); } |
| |
| // CHECK: call {{.*}} @_ZN1XC1Ev( |
| // CHECK: call {{.*}} @_Z3foov( |
| // CHECK: call {{.*}} @_ZN1XD1Ev( |
| { X x; foo(); } |
| |
| // CHECK: call {{.*}} @_ZN1XC1Ev( |
| // CHECK: call {{.*}} @_Z3foov( |
| // CHECK: call {{.*}} @_ZN1XD1Ev( |
| { X x; foo(); } |
| break; |
| } |
| } |
| |
| // CHECK-LABEL: @_Z17scope_fallthroughv( |
| void scope_fallthrough() { |
| switch (1) { |
| // CHECK: call {{.*}} @_ZN1XC1Ev( |
| // CHECK-NOT: call {{.*}} @_Z3foov( |
| // CHECK: call {{.*}} @_ZN1XD1Ev( |
| { default: X x; } |
| // CHECK: call {{.*}} @_Z3foov( |
| foo(); |
| break; |
| } |
| } |
| |
| // CHECK-LABEL: @_Z12hidden_breakb( |
| void hidden_break(bool b) { |
| switch (1) { |
| default: |
| // CHECK: br |
| if (b) |
| break; |
| // CHECK: call {{.*}} @_Z3foov( |
| foo(); |
| break; |
| } |
| } |
| |
| // CHECK-LABEL: @_Z10hidden_varv( |
| int hidden_var() { |
| switch (1) { |
| // CHECK: %[[N:.*]] = alloca i32 |
| case 0: int n; |
| // CHECK: store i32 0, i32* %[[N]] |
| // CHECK: load i32, i32* %[[N]] |
| // CHECK: ret |
| default: n = 0; return n; |
| } |
| } |
| |
| // CHECK-LABEL: @_Z13case_in_labelv( |
| void case_in_label() { |
| // CHECK: br label % |
| switch (1) case 1: foo: case 0: goto foo; |
| } |