From bea53eead1de84a28affc6a7cbf88f87a258fed4 Mon Sep 17 00:00:00 2001 From: Harshil Jain Date: Sun, 13 Feb 2022 16:48:59 +0530 Subject: [PATCH] The device expression must evaluate to a non-negative integer value. Device clause when it occurs with **target enter data** and **target exit data** must be declared with some non negative value. So some changes were made to evaluate the device clause argument to non negative value and throw the expected error when it takes negative value as argument. Reviewed By: clementval Differential Revision: https://reviews.llvm.org/D119141 --- flang/lib/Semantics/check-directive-structure.h | 2 +- flang/lib/Semantics/check-omp-structure.cpp | 2 +- flang/test/Semantics/omp-clause-validity01.f90 | 4 ++++ flang/test/Semantics/omp-device-constructs.f90 | 6 ++++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/flang/lib/Semantics/check-directive-structure.h b/flang/lib/Semantics/check-directive-structure.h index 0a0fe1cad4ce..c1b00d2cac95 100644 --- a/flang/lib/Semantics/check-directive-structure.h +++ b/flang/lib/Semantics/check-directive-structure.h @@ -551,7 +551,7 @@ void DirectiveStructureChecker::RequiresPositiveParameter(const C &clause, const parser::ScalarIntExpr &i, llvm::StringRef paramName) { if (const auto v{GetIntValue(i)}) { - if (*v <= 0) { + if (*v < 0) { context_.Say(GetContext().clauseSource, "The %s of the %s clause must be " "a positive integer expression"_err_en_US, diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index 802fdf650a07..9c9fb800bb15 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -1656,7 +1656,6 @@ CHECK_SIMPLE_CLAUSE(Default, OMPC_default) CHECK_SIMPLE_CLAUSE(Depobj, OMPC_depobj) CHECK_SIMPLE_CLAUSE(Destroy, OMPC_destroy) CHECK_SIMPLE_CLAUSE(Detach, OMPC_detach) -CHECK_SIMPLE_CLAUSE(Device, OMPC_device) CHECK_SIMPLE_CLAUSE(DeviceType, OMPC_device_type) CHECK_SIMPLE_CLAUSE(DistSchedule, OMPC_dist_schedule) CHECK_SIMPLE_CLAUSE(DynamicAllocators, OMPC_dynamic_allocators) @@ -1721,6 +1720,7 @@ CHECK_REQ_SCALAR_INT_CLAUSE(NumTeams, OMPC_num_teams) CHECK_REQ_SCALAR_INT_CLAUSE(NumThreads, OMPC_num_threads) CHECK_REQ_SCALAR_INT_CLAUSE(Priority, OMPC_priority) CHECK_REQ_SCALAR_INT_CLAUSE(ThreadLimit, OMPC_thread_limit) +CHECK_REQ_SCALAR_INT_CLAUSE(Device, OMPC_device) CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Collapse, OMPC_collapse) CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Safelen, OMPC_safelen) diff --git a/flang/test/Semantics/omp-clause-validity01.f90 b/flang/test/Semantics/omp-clause-validity01.f90 index a4712a27c440..4391fad25138 100644 --- a/flang/test/Semantics/omp-clause-validity01.f90 +++ b/flang/test/Semantics/omp-clause-validity01.f90 @@ -556,4 +556,8 @@ use omp_lib do i = 1, N a = 3.14 enddo + + !$omp target enter data map(alloc:A) device(0) + !$omp target exit data map(delete:A) device(0) + end program diff --git a/flang/test/Semantics/omp-device-constructs.f90 b/flang/test/Semantics/omp-device-constructs.f90 index d5a1acc69721..586cec6f8a94 100644 --- a/flang/test/Semantics/omp-device-constructs.f90 +++ b/flang/test/Semantics/omp-device-constructs.f90 @@ -129,6 +129,12 @@ program main enddo !$omp end target data + !ERROR: The parameter of the DEVICE clause must be a positive integer expression + !$omp target enter data map(alloc:A) device(-2) + + !ERROR: The parameter of the DEVICE clause must be a positive integer expression + !$omp target exit data map(delete:A) device(-2) + !ERROR: At most one IF clause can appear on the TARGET ENTER DATA directive !$omp target enter data map(to:a) if(.true.) if(.false.)