1 // RUN: %clang_cc1 -std=c++11 -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s 2 3 //CHECK: call i32 @__kmpc_cancel 4 //CHECK: br {{.*}}label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]] 5 //CHECK: [[EXIT]]: 6 //CHECK: store i32 [[EXIT_SLOT:[0-9]+]] 7 //CHECK: br label %[[CLEANUP:.+]] 8 //CHECK: [[CONTINUE]]: 9 //CHECK: store i32 [[CONT_SLOT:[0-9]+]], 10 //CHECK: br label %[[CLEANUP]] 11 //CHECK: [[CLEANUP]]: 12 //CHECK-NEXT: call void @_ZN3ObjD1Ev 13 //CHECK: switch i32{{.*}}, label %[[UNREACHABLE:.+]] [ 14 //CHECK: i32 [[CONT_SLOT]], label %[[CLEANUPCONT:.+]] 15 //CHECK: i32 [[EXIT_SLOT]], label %[[CANCELEXIT:.+]] 16 //CHECK-NEXT: ] 17 //CHECK: [[CLEANUPCONT]]: 18 //CHECK: br label %[[CANCELCONT:.+]] 19 //CHECK: [[CANCELCONT]]: 20 //CHECK-NEXT: call void @__kmpc_barrier( 21 //CHECK-NEXT: ret void 22 //CHECK: [[UNREACHABLE]]: 23 //CHECK-NEXT: unreachable 24 //CHECK-NEXT: } 25 26 struct Obj { 27 int a; Obj(); Obj(const Obj& r) = delete; Obj &operator=(const Obj& r); 28 ~Obj(); 29 }; 30 31 void foo() { 32 int i,count = 0; 33 Obj obj; 34 35 #pragma omp parallel private(i) num_threads(1) 36 { 37 #pragma omp for reduction(+:count) lastprivate(obj) 38 for (i=0; i<1000; i++) { 39 if(i==100) { 40 obj.a = 100; 41 #pragma omp cancel for 42 } 43 count++; 44 } 45 } 46 } 47