brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 2527918 Raw
139 lines · cpp
1// RUN: %clang_cc1 -emit-llvm -o - %s -triple x86_64-linux | FileCheck %s2 3struct A {4  A();5  A(const A &);6  ~A();7  operator bool();8  void *data;9};10 11A make();12bool cond();13void f(int);14 15// PR49585: Ensure that 'continue' performs the proper cleanups in the presence16// of a for loop condition variable.17//18// CHECK: define {{.*}} void @_Z7PR49585v(19void PR49585() {20  for (21      // CHECK: call void @_Z1fi(i32 noundef 1)22      // CHECK: br label %[[for_cond:.*]]23      f(1);24 25      // CHECK: [[for_cond]]:26      // CHECK: call {{.*}} @_Z4makev(27      // CHECK: call {{.*}} @_ZN1AcvbEv(28      // CHECK: br i1 {{.*}}, label %[[for_body:.*]], label %[[for_cond_cleanup:.*]]29      A a = make();30 31      // CHECK: [[for_cond_cleanup]]:32      // CHECK: store33      // CHECK: br label %[[cleanup:.*]]34 35      f(2)) {36    // CHECK: [[for_body]]:37    // CHECK: call {{.*}} @_Z4condv(38    // CHECK: br i1 {{.*}}, label %[[if_then:.*]], label %[[if_end:.*]]39    if (cond()) {40      // CHECK: [[if_then]]:41      // CHECK: call {{.*}} @_Z1fi(i32 noundef 3)42      // CHECK: br label %[[for_inc:.*]]43      f(3);44      continue;45    }46 47    // CHECK: [[if_end]]:48    // CHECK: call {{.*}} @_Z1fi(i32 noundef 4)49    // CHECK: br label %[[for_inc]]50    f(4);51  }52 53  // CHECK: [[for_inc]]:54  // CHECK: call void @_Z1fi(i32 noundef 2)55  // CHECK: store56  // CHECK: br label %[[cleanup]]57 58  // CHECK: [[cleanup]]:59  // CHECK: call void @_ZN1AD1Ev(60  // CHECK: load61  // CHECK: switch {{.*}} label62  // CHECK-NEXT: label %[[cleanup_cont:.*]]63  // CHECK-NEXT: label %[[for_end:.*]]64 65  // CHECK: [[cleanup_cont]]:66  // CHECK: br label %[[for_cond]]67 68  // CHECK [[for_end]]:69  // CHECK: ret void70}71 72// CHECK: define {{.*}} void @_Z13PR49585_breakv(73void PR49585_break() {74  for (75      // CHECK: call void @_Z1fi(i32 noundef 1)76      // CHECK: br label %[[for_cond:.*]]77      f(1);78 79      // CHECK: [[for_cond]]:80      // CHECK: call {{.*}} @_Z4makev(81      // CHECK: call {{.*}} @_ZN1AcvbEv(82      // CHECK: br i1 {{.*}}, label %[[for_body:.*]], label %[[for_cond_cleanup:.*]]83      A a = make();84 85      // CHECK: [[for_cond_cleanup]]:86      // CHECK: store87      // CHECK: br label %[[cleanup:.*]]88 89      f(2)) {90    // CHECK: [[for_body]]:91    // CHECK: call {{.*}} @_Z4condv(92    // CHECK: br i1 {{.*}}, label %[[if_then:.*]], label %[[if_end:.*]]93    if (cond()) {94      // CHECK: [[if_then]]:95      // CHECK: call {{.*}} @_Z1fi(i32 noundef 3)96      // CHECK: store97      // CHECK: br label %[[cleanup:.*]]98      f(3);99      break;100    }101 102    // CHECK: [[if_end]]:103    // CHECK: call {{.*}} @_Z1fi(i32 noundef 4)104    // CHECK: br label %[[for_inc]]105    f(4);106  }107 108  // CHECK: [[for_inc]]:109  // CHECK: call void @_Z1fi(i32 noundef 2)110  // CHECK: store111  // CHECK: br label %[[cleanup]]112 113  // CHECK: [[cleanup]]:114  // CHECK: call void @_ZN1AD1Ev(115  // CHECK: load116  // CHECK: switch {{.*}} label117  // CHECK-NEXT: label %[[cleanup_cont:.*]]118  // CHECK-NEXT: label %[[for_end:.*]]119 120  // CHECK: [[cleanup_cont]]:121  // CHECK: br label %[[for_cond]]122 123  // CHECK [[for_end]]:124  // CHECK: ret void125}126 127// CHECK: define {{.*}} void @_Z16incless_for_loopv(128void incless_for_loop() {129  // CHECK: br label %[[for_cond:.*]]130  // CHECK: [[for_cond]]:131  // CHECK:   br i1 {{.*}}, label %[[for_body:.*]], label %[[for_end:.*]]132  // CHECK: [[for_body]]:133  // CHECK:   br label %[[for_cond]]134  // CHECK: [[for_end]]:135  // CHECK:   ret void136  // CHECK: }137  for (; int b = 0;) continue;138}139