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 @@ -526,6 +526,13 @@ if (const auto *name = Fortran::semantics::getDesignatorNameIfDataRef(*designator)) return *name->symbol; + if (const auto *arrayElement = + Fortran::parser::Unwrap( + *designator)) { + const Fortran::parser::Name &name = + Fortran::parser::GetLastName(arrayElement->base); + return *name.symbol; + } } else if (const auto *name = std::get_if(&accObject.u)) { return *name->symbol; diff --git a/flang/test/Lower/OpenACC/acc-declare.f90 b/flang/test/Lower/OpenACC/acc-declare.f90 --- a/flang/test/Lower/OpenACC/acc-declare.f90 +++ b/flang/test/Lower/OpenACC/acc-declare.f90 @@ -278,6 +278,24 @@ ! CHECK: acc.copyout accPtr(%[[CREATE]] : !fir.ref>) bounds(%{{.*}}) to varPtr(%[[ARG1]] : !fir.ref>) {name = "b"} ! CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref>) bounds(%{{.*}}) to varPtr(%[[ARG0]] : !fir.ref>) {dataClause = #acc, name = "a"} + subroutine acc_declare_array_section(a) + integer :: a(:) + !$acc declare copy(a(1:10)) + + do i = 1, 100 + a(i) = i + end do + end subroutine + +! CHECK-LABEL: func.func @_QMacc_declarePacc_declare_array_section( +! CHECK-SAME: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a"}) { +! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %arg0 {acc.declare = #acc.declare} : (!fir.box>) -> !fir.ref> +! CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[BOX_ADDR]] : !fir.ref>) bounds(%{{.*}}) -> !fir.ref> {dataClause = #acc, name = "a(1:10)"} +! CHECK: acc.declare dataOperands(%4 : !fir.ref>) { +! CHECK: acc.terminator +! CHECK: } +! CHECK: acc.copyout accPtr(%[[COPYIN]] : !fir.ref>) bounds(%{{.*}}) to varPtr(%[[BOX_ADDR]] : !fir.ref>) {dataClause = #acc, name = "a(1:10)"} + end module module acc_declare_allocatable_test