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
This commit is contained in:
Harshil Jain 2022-02-13 16:48:59 +05:30 committed by Nimish Mishra
parent 446e7c64c7
commit bea53eead1
4 changed files with 12 additions and 2 deletions

View File

@ -551,7 +551,7 @@ void DirectiveStructureChecker<D, C, PC,
ClauseEnumSize>::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,

View File

@ -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)

View File

@ -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

View File

@ -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.)