diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -462,6 +462,28 @@ void Post(const parser::EndLabel &endLabel) { CheckSourceLabel(endLabel.v); } void Post(const parser::EorLabel &eorLabel) { CheckSourceLabel(eorLabel.v); } + void Post(const parser::OmpMapClause &x) { + const auto &ompObjList{std::get(x.t)}; + for (const auto &ompObj : ompObjList.v) { + common::visit( + common::visitors{ + [&](const parser::Designator &designator) { + if (const auto *name{GetDesignatorNameIfDataRef(designator)}) { + if (name->symbol && + semantics::IsAssumedSizeArray(*name->symbol)) { + context_.Say(designator.source, + "Assumed-size whole arrays may not appear on the %s " + "clause"_err_en_US, + "MAP"); + } + } + }, + [&](const auto &name) {}, + }, + ompObj.u); + } + } + const parser::OmpClause *associatedClause{nullptr}; void SetAssociatedClause(const parser::OmpClause &c) { associatedClause = &c; diff --git a/flang/test/Semantics/OpenMP/map-clause.f90 b/flang/test/Semantics/OpenMP/map-clause.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/OpenMP/map-clause.f90 @@ -0,0 +1,26 @@ +! RUN: %python %S/../test_errors.py %s %flang -fopenmp +! Check OpenMP clause validity for the following directives: +! 2.10 Device constructs +subroutine sb(arr) + real(8) :: arr(*) + real :: a + + !ERROR: Assumed-size whole arrays may not appear on the MAP clause + !$omp target map(arr) + do i = 1, 100 + a = 3.14 + enddo + !$omp end target + + !$omp target map(arr(:)) + do i = 1, 100 + a = 3.14 + enddo + !$omp end target + + !$omp target map(arr(3:5)) + do i = 1, 100 + a = 3.14 + enddo + !$omp end target +end subroutine