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;
 | 
						|
}
 |