diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h --- a/flang/include/flang/Semantics/symbol.h +++ b/flang/include/flang/Semantics/symbol.h @@ -595,6 +595,8 @@ AccPrivate, AccFirstPrivate, AccShared, // OpenACC data-mapping attribute AccCopyIn, AccCopyOut, AccCreate, AccDelete, AccPresent, + // OpenACC data-movement attribute + AccDevice, AccHost, AccSelf, // OpenACC miscellaneous flags AccCommonBlock, AccThreadPrivate, AccReduction, AccNone, AccPreDetermined, // OpenMP data-sharing attribute 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 @@ -192,6 +192,27 @@ return false; } + bool Pre(const parser::AccClause::Device &x) { + ResolveAccObjectList(x.v, Symbol::Flag::AccDevice); + return false; + } + + bool Pre(const parser::AccClause::Host &x) { + ResolveAccObjectList(x.v, Symbol::Flag::AccHost); + return false; + } + + bool Pre(const parser::AccClause::Self &x) { + const std::optional &accSelfClause = x.v; + if (accSelfClause && + std::holds_alternative((*accSelfClause).u)) { + const auto &accObjectList = + std::get((*accSelfClause).u); + ResolveAccObjectList(accObjectList, Symbol::Flag::AccSelf); + } + return false; + } + void Post(const parser::Name &); private: @@ -210,6 +231,9 @@ Symbol::Flag::AccPrivate, Symbol::Flag::AccFirstPrivate, Symbol::Flag::AccReduction}; + static constexpr Symbol::Flags accDataMvtFlags{ + Symbol::Flag::AccDevice, Symbol::Flag::AccHost, Symbol::Flag::AccSelf}; + static constexpr Symbol::Flags accFlagsRequireMark{}; void PrivatizeAssociatedLoopIndex(const parser::OpenACCLoopConstruct &); diff --git a/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90 b/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90 --- a/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90 +++ b/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90 @@ -45,7 +45,7 @@ end do !ERROR: SELF clause on the PARALLEL LOOP directive only accepts optional scalar logical expression - !$acc parallel loop self(bb, cc(:)) + !$acc parallel loop self(bb, cc(:,:)) do i = 1, N a(i) = 3.14 end do diff --git a/flang/test/Semantics/OpenACC/acc-resolve04.f90 b/flang/test/Semantics/OpenACC/acc-resolve04.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/OpenACC/acc-resolve04.f90 @@ -0,0 +1,16 @@ +! RUN: %flang_fc1 -fopenacc %s + +! Check that symbol are correctly resolved in device, host and self clause. + +program test_resolve04 + real :: a(10), b(10) + common /foo/ b, c + +!$acc data create(/foo/) +!$acc update device(/foo/) +!$acc update host(/foo/) +!$acc update self(/foo/) +!$acc end data + +end + diff --git a/flang/test/Semantics/OpenACC/acc-update-validity.f90 b/flang/test/Semantics/OpenACC/acc-update-validity.f90 --- a/flang/test/Semantics/OpenACC/acc-update-validity.f90 +++ b/flang/test/Semantics/OpenACC/acc-update-validity.f90 @@ -38,7 +38,7 @@ !ERROR: At most one ASYNC clause can appear on the UPDATE directive !$acc update host(aa, bb) async(1) async(2) - !$acc update self(bb, cc(:)) wait(1) + !$acc update self(bb, cc(:,:)) wait(1) !ERROR: SELF clause on the UPDATE directive must have a var-list !$acc update self