diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -2399,12 +2399,13 @@ for (const Fortran::parser::AccClause &clause : accClauseList.v) { if (const auto *createClause = std::get_if(&clause.u)) { - genGlobalCtorsWithModifier( - converter, modBuilder, createClause, - Fortran::parser::AccDataModifier::Modifier::Zero, - mlir::acc::DataClause::acc_create, - mlir::acc::DataClause::acc_create_zero); + const Fortran::parser::AccObjectListWithModifier &listWithModifier = + createClause->v; + const auto &accObjectList = + std::get(listWithModifier.t); + genGlobalCtors( + converter, modBuilder, accObjectList, + mlir::acc::DataClause::acc_create); } else if (const auto *copyinClause = std::get_if(&clause.u)) { genGlobalCtorsWithModifier} : !fir.array<100000xf32> @@ -25,23 +25,6 @@ ! CHECK: acc.terminator ! CHECK: } -! CHECK-LABEL: fir.global @_QMacc_declare_testEdata2 {acc.declare = #acc.declare} : !fir.array<100000xf32> - -! CHECK-LABEL: acc.global_ctor @_QMacc_declare_testEdata2_acc_ctor { -! CHECK: %[[GLOBAL_ADDR:.*]] = fir.address_of(@_QMacc_declare_testEdata2) {acc.declare = #acc.declare} : !fir.ref> -! CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[GLOBAL_ADDR]] : !fir.ref>) -> !fir.ref> {dataClause = #acc, name = "data2", structured = false} -! CHECK: acc.declare_enter dataOperands(%[[CREATE]] : !fir.ref>) -! CHECK: acc.terminator -! CHECK: } - -! CHECK-LABEL: acc.global_dtor @_QMacc_declare_testEdata2_acc_dtor { -! CHECK: %[[GLOBAL_ADDR:.*]] = fir.address_of(@_QMacc_declare_testEdata2) {acc.declare = #acc.declare} : !fir.ref> -! CHECK: %[[DEVICEPTR:.*]] = acc.getdeviceptr varPtr(%[[GLOBAL_ADDR]] : !fir.ref>) -> !fir.ref> {dataClause = #acc, name = "data2", structured = false} -! CHECK: acc.declare_exit dataOperands(%[[DEVICEPTR]] : !fir.ref>) -! CHECK: acc.delete accPtr(%[[DEVICEPTR]] : !fir.ref>) {dataClause = #acc, name = "data2", structured = false} -! CHECK: acc.terminator -! CHECK: } - module acc_declare_copyin_test integer, parameter :: n = 100000 real, dimension(n) :: data1 diff --git a/flang/test/Semantics/OpenACC/acc-declare-validity.f90 b/flang/test/Semantics/OpenACC/acc-declare-validity.f90 --- a/flang/test/Semantics/OpenACC/acc-declare-validity.f90 +++ b/flang/test/Semantics/OpenACC/acc-declare-validity.f90 @@ -30,6 +30,9 @@ !ERROR: DEVICEPTR clause is not allowed on the DECLARE directive in module declaration section !$acc declare deviceptr(ab) + !ERROR: The ZERO modifier is not allowed for the CREATE clause on the DECLARE directive + !$acc declare create(zero: aa) + contains subroutine sub1(cc, dd)