Fortran: Extend align-clause checks of OpenMP's allocate directive
gcc/fortran/ChangeLog: * openmp.cc (resolve_omp_clauses): Check also for power of two. libgomp/ChangeLog: * testsuite/libgomp.fortran/allocate-3.f90: Fix ALIGN usage, remove unused -fdump-tree-original. * testsuite/libgomp.fortran/allocate-4.f90: New.
This commit is contained in:
parent
5ce8961b46
commit
bf2cf6f3f1
3 changed files with 49 additions and 6 deletions
|
@ -7392,11 +7392,12 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
|
|||
|| n->u.align->ts.type != BT_INTEGER
|
||||
|| n->u.align->rank != 0
|
||||
|| gfc_extract_int (n->u.align, &alignment)
|
||||
|| alignment <= 0)
|
||||
|| alignment <= 0
|
||||
|| !pow2p_hwi (alignment))
|
||||
{
|
||||
gfc_error ("ALIGN modifier requires a scalar positive "
|
||||
"constant integer alignment expression at %L",
|
||||
&n->u.align->where);
|
||||
gfc_error ("ALIGN modifier requires at %L a scalar positive "
|
||||
"constant integer alignment expression that is a "
|
||||
"power of two", &n->u.align->where);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
! { dg-do compile }
|
||||
! { dg-additional-options "-fdump-tree-original" }
|
||||
|
||||
use omp_lib
|
||||
implicit none
|
||||
|
@ -23,6 +22,7 @@ integer :: q, x,y,z
|
|||
! { dg-error "Object 'omp_high_bw_mem_alloc' is not a variable" "" { target *-*-* } .-1 }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align(q) : x) firstprivate(x) ! { dg-error "31:ALIGN modifier requires a scalar positive constant integer alignment expression at" }
|
||||
!$omp parallel allocate( align(128) : x) firstprivate(x) ! OK
|
||||
!$omp end parallel
|
||||
|
||||
end
|
||||
|
|
42
libgomp/testsuite/libgomp.fortran/allocate-4.f90
Normal file
42
libgomp/testsuite/libgomp.fortran/allocate-4.f90
Normal file
|
@ -0,0 +1,42 @@
|
|||
! { dg-do compile }
|
||||
|
||||
|
||||
subroutine test()
|
||||
use iso_c_binding, only: c_intptr_t
|
||||
implicit none
|
||||
integer, parameter :: omp_allocator_handle_kind = 1 !! <<<
|
||||
integer (kind=omp_allocator_handle_kind), &
|
||||
parameter :: omp_high_bw_mem_alloc = 4
|
||||
integer :: q, x,y,z
|
||||
integer, parameter :: cnst(2) = [64, 101]
|
||||
|
||||
!$omp parallel allocate( omp_high_bw_mem_alloc : x) firstprivate(x) ! { dg-error "Expected integer expression of the 'omp_allocator_handle_kind' kind" }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( allocator (omp_high_bw_mem_alloc) : x) firstprivate(x) ! { dg-error "Expected integer expression of the 'omp_allocator_handle_kind' kind" }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align (q) : x) firstprivate(x) ! { dg-error "32:ALIGN modifier requires at \\(1\\) a scalar positive constant integer alignment expression that is a power of two" }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align (32) : x) firstprivate(x) ! OK
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align(q) : x) firstprivate(x) ! { dg-error "31:ALIGN modifier requires at \\(1\\) a scalar positive constant integer alignment expression that is a power of two" }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align(cnst(1)) : x ) firstprivate(x) ! OK
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align(cnst(2)) : x) firstprivate(x) ! { dg-error "31:ALIGN modifier requires at \\(1\\) a scalar positive constant integer alignment expression that is a power of two" }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align( 31) :x) firstprivate(x) ! { dg-error "32:ALIGN modifier requires at \\(1\\) a scalar positive constant integer alignment expression that is a power of two" }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align (32.0): x) firstprivate(x) ! { dg-error "32:ALIGN modifier requires at \\(1\\) a scalar positive constant integer alignment expression that is a power of two" }
|
||||
!$omp end parallel
|
||||
|
||||
!$omp parallel allocate( align(cnst ) : x ) firstprivate(x) ! { dg-error "31:ALIGN modifier requires at \\(1\\) a scalar positive constant integer alignment expression that is a power of two" }
|
||||
!$omp end parallel
|
||||
end
|
Loading…
Add table
Reference in a new issue