forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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;
 | |
| }
 |