diff --git a/flang/lib/Semantics/check-directive-structure.h b/flang/lib/Semantics/check-directive-structure.h index 0a0fe1cad4ce9..c1b00d2cac959 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 802fdf650a07c..9c9fb800bb155 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 a4712a27c4400..4391fad251382 100644 --- a/flang/test/Semantics/omp-clause-validity01.f90 +++ b/flang/test/Semantics/omp-clause-validity01.f90 @@ -556,4 +556,8 @@ 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 d5a1acc69721c..586cec6f8a94f 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.)