// RUN: %clang_cc1 -fopenacc -triple x86_64-linux-gnu -Wno-openacc-self-if-potential-conflict -emit-cir -fclangir -triple x86_64-linux-pc %s -o - | FileCheck %s struct CopyConstruct { CopyConstruct() = default; CopyConstruct(const CopyConstruct&); }; struct NonDefaultCtor { NonDefaultCtor(); }; struct HasDtor { ~HasDtor(); }; // CHECK: acc.private.recipe @privatization__ZTSi : !cir.ptr init { // CHECK-NEXT: ^bb0(%[[ARG:.*]]: !cir.ptr {{.*}}): // CHECK-NEXT: cir.alloca !s32i, !cir.ptr, ["openacc.private.init"] // CHECK-NEXT: acc.yield // CHECK-NEXT: } // // CHECK-NEXT: acc.private.recipe @privatization__ZTS7HasDtor : !cir.ptr init { // CHECK-NEXT: ^bb0(%[[ARG:.*]]: !cir.ptr {{.*}}): // CHECK-NEXT: cir.alloca !rec_HasDtor, !cir.ptr, ["openacc.private.init"] // CHECK-NEXT: acc.yield // CHECK-NEXT: } destroy { // CHECK-NEXT: ^bb0(%[[ARG:.*]]: !cir.ptr {{.*}}): // CHECK-NEXT: cir.call @_ZN7HasDtorD1Ev(%[[ARG]]) nothrow : (!cir.ptr) -> () // CHECK-NEXT: acc.yield // CHECK-NEXT: } // // CHECK-NEXT: acc.private.recipe @privatization__ZTS14NonDefaultCtor : !cir.ptr init { // CHECK-NEXT: ^bb0(%[[ARG:.*]]: !cir.ptr {{.*}}): // CHECK-NEXT: %[[ALLOCA:.*]] = cir.alloca !rec_NonDefaultCtor, !cir.ptr, ["openacc.private.init", init] // CHECK-NEXT: cir.call @_ZN14NonDefaultCtorC1Ev(%[[ALLOCA]]) : (!cir.ptr) -> () // CHECK-NEXT: acc.yield // CHECK-NEXT: } // // CHECK-NEXT: acc.private.recipe @privatization__ZTS13CopyConstruct : !cir.ptr init { // CHECK-NEXT: ^bb0(%[[ARG:.*]]: !cir.ptr {{.*}}): // CHECK-NEXT: cir.alloca !rec_CopyConstruct, !cir.ptr, ["openacc.private.init"] // CHECK-NEXT: acc.yield // CHECK-NEXT: } template void dependent_version(const T &cc, const U &ndc, const V &dtor, const W &someInt) { // CHECK: cir.func {{.*}}@_Z17dependent_versionI13CopyConstruct14NonDefaultCtor7HasDtoriEvRKT_RKT0_RKT1_RKT2_(%[[ARG0:.*]]: !cir.ptr {{.*}}, %[[ARG1:.*]]: !cir.ptr {{.*}}, %[[ARG2:.*]]: !cir.ptr {{.*}}, %[[ARG3:.*]]: !cir.ptr {{.*}}) { // CHECK-NEXT: %[[CC:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["cc", init, const] // CHECK-NEXT: %[[NDC:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["ndc", init, const] // CHECK-NEXT: %[[DTOR:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["dtor", init, const] // CHECK-NEXT: %[[SOMEINT:.*]] = cir.alloca !cir.ptr, !cir.ptr>, ["someInt", init, const] // % 3 = cir.alloca !cir.ptr, !cir.ptr>, ["someInt", init, const] #pragma acc parallel private(cc, ndc, dtor, someInt) ; // CHECK: %[[PRIV_LOAD:.*]] = cir.load %[[CC]] : !cir.ptr>, !cir.ptr // CHECK-NEXT: %[[PRIVATE1:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr) -> !cir.ptr {name = "cc"} // CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[NDC]] : !cir.ptr>, !cir.ptr // CHECK-NEXT: %[[PRIVATE2:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr) -> !cir.ptr {name = "ndc"} // CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[DTOR]] : !cir.ptr>, !cir.ptr // CHECK-NEXT: %[[PRIVATE3:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr) -> !cir.ptr {name = "dtor"} // CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[SOMEINT]] : !cir.ptr>, !cir.ptr // CHECK-NEXT: %[[PRIVATE4:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr) -> !cir.ptr {name = "someInt"} // CHECK-NEXT: acc.parallel private(@privatization__ZTS13CopyConstruct -> %[[PRIVATE1]] : !cir.ptr, // CHECK-SAME: @privatization__ZTS14NonDefaultCtor -> %[[PRIVATE2]] : !cir.ptr, // CHECK-SAME: @privatization__ZTS7HasDtor -> %[[PRIVATE3]] : !cir.ptr, // CHECK-SAME: @privatization__ZTSi -> %[[PRIVATE4]] : !cir.ptr) { // CHECK-NEXT: acc.yield // CHECK-NEXT: } loc } void use() { CopyConstruct cc; NonDefaultCtor ndc; HasDtor dtor; int i; dependent_version(cc, ndc, dtor, i); }