1 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-pc-windows-msvc18.0.0 -std=c++11 -fms-compatibility-version=18 -fms-extensions -emit-llvm %s -fexceptions -fcxx-exceptions -o - -O1 | FileCheck %s 2 // REQUIRES: x86-registered-target 3 // expected-no-diagnostics 4 5 void foo(); 6 void bar(); 7 8 struct Test { 9 static void main() { 10 int failed = 0; 11 int j = 2; 12 13 #pragma omp parallel 14 { 15 int local_j = 3; 16 #pragma omp single copyprivate(local_j) 17 { 18 local_j = 4; 19 } 20 21 // Assure reports a data race, but value written to "j" 22 // should always be the same. 23 j = local_j; 24 } 25 26 } 27 }; 28 29 // CHECK-LABEL: @main 30 int main() { 31 // CHECK: call void @{{.+}}main 32 Test::main(); 33 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%ident_t* {{.*}}@0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OUTLINED:@.+]] to void (i32*, i32*, ...)*)) 34 #pragma omp parallel 35 { 36 try { 37 foo(); 38 } catch (int t) { 39 #pragma omp critical 40 { 41 bar(); 42 }; 43 } 44 }; 45 // CHECK: ret i32 0 46 return 0; 47 } 48 49 // CHECK: define internal void [[OUTLINED]]( 50 // CHECK: [[GID:%.+]] = {{.*}}call i32 @__kmpc_global_thread_num(%ident_t* {{.*}}@0) 51 // CHECK: invoke void @{{.+}}foo 52 // CHECK: catchswitch within 53 // CHECK: catchpad within 54 // CHECK: call void @__kmpc_critical(%ident_t* {{.*}}@0, i32 [[GID]], 55 // CHECK: invoke void @{{.+}}bar 56 // CHECK: call void @__kmpc_end_critical(%ident_t* {{.*}}@0, i32 [[GID]], 57 // CHECK: catchret from 58 // CHECK: cleanuppad within 59 // CHECK: call void @__kmpc_end_critical(%ident_t* {{.*}}@0, i32 [[GID]], 60 // CHECK: cleanupret from 61 62