The OmpLinearClause class was a variant of two classes, one for when the linear modifier was present, and one for when it was absent. These two classes did not follow the conventions for parse tree nodes, (i.e. tuple/wrapper/union formats), which necessitated specialization of the parse tree visitor. The new form of OmpLinearClause is the standard tuple with a list of modifiers and an object list. The specialization of parse tree visitor for it has been removed. Parsing and unparsing of the new form bears additional complexity due to syntactical differences between OpenMP 5.2 and prior versions: in OpenMP 5.2 the argument list is post-modified, while in the prior versions, the step modifier was a post-modifier while the linear modifier had an unusual syntax of `modifier(list)`. With this change the LINEAR clause is no different from any other clauses in terms of its structure and use of modifiers. Modifier validation and all other checks work the same as with other clauses.
86 lines
2.7 KiB
Fortran
86 lines
2.7 KiB
Fortran
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
|
|
! OpenMP Version 4.5
|
|
! Various checks with the ordered construct
|
|
|
|
SUBROUTINE LINEAR_GOOD(N)
|
|
INTEGER N, i, j, a, b(10)
|
|
!$omp target
|
|
!$omp teams
|
|
!$omp distribute parallel do simd linear(i)
|
|
do i = 1, N
|
|
a = 3.14
|
|
enddo
|
|
!$omp end distribute parallel do simd
|
|
!$omp end teams
|
|
!$omp end target
|
|
END SUBROUTINE LINEAR_GOOD
|
|
|
|
SUBROUTINE LINEAR_BAD(N)
|
|
INTEGER N, i, j, a, b(10)
|
|
|
|
!$omp target
|
|
!$omp teams
|
|
!ERROR: Variable 'j' not allowed in LINEAR clause, only loop iterator can be specified in LINEAR clause of a construct combined with DISTRIBUTE
|
|
!$omp distribute parallel do simd linear(j)
|
|
do i = 1, N
|
|
a = 3.14
|
|
enddo
|
|
!$omp end distribute parallel do simd
|
|
!$omp end teams
|
|
!$omp end target
|
|
|
|
!$omp target
|
|
!$omp teams
|
|
!ERROR: Variable 'j' not allowed in LINEAR clause, only loop iterator can be specified in LINEAR clause of a construct combined with DISTRIBUTE
|
|
!ERROR: Variable 'b' not allowed in LINEAR clause, only loop iterator can be specified in LINEAR clause of a construct combined with DISTRIBUTE
|
|
!$omp distribute parallel do simd linear(j) linear(b)
|
|
do i = 1, N
|
|
a = 3.14
|
|
enddo
|
|
!$omp end distribute parallel do simd
|
|
!$omp end teams
|
|
!$omp end target
|
|
|
|
!$omp target
|
|
!$omp teams
|
|
!ERROR: Variable 'j' not allowed in LINEAR clause, only loop iterator can be specified in LINEAR clause of a construct combined with DISTRIBUTE
|
|
!ERROR: Variable 'b' not allowed in LINEAR clause, only loop iterator can be specified in LINEAR clause of a construct combined with DISTRIBUTE
|
|
!$omp distribute parallel do simd linear(j, b)
|
|
do i = 1, N
|
|
a = 3.14
|
|
enddo
|
|
!$omp end distribute parallel do simd
|
|
!$omp end teams
|
|
!$omp end target
|
|
|
|
!ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
|
|
!ERROR: Variable 'j' not allowed in LINEAR clause, only loop iterator can be specified in LINEAR clause of a construct combined with DISTRIBUTE
|
|
!$omp distribute simd linear(i,j)
|
|
do i = 1, N
|
|
do j = 1, N
|
|
a = 3.14
|
|
enddo
|
|
enddo
|
|
!$omp end distribute simd
|
|
|
|
!ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
|
|
!ERROR: Variable 'j' not allowed in LINEAR clause, only loop iterator can be specified in LINEAR clause of a construct combined with DISTRIBUTE
|
|
!$omp distribute simd linear(i,j) collapse(1)
|
|
do i = 1, N
|
|
do j = 1, N
|
|
a = 3.14
|
|
enddo
|
|
enddo
|
|
!$omp end distribute simd
|
|
|
|
!ERROR: `DISTRIBUTE` region has to be strictly nested inside `TEAMS` region.
|
|
!$omp distribute simd linear(i,j) collapse(2)
|
|
do i = 1, N
|
|
do j = 1, N
|
|
a = 3.14
|
|
enddo
|
|
enddo
|
|
!$omp end distribute simd
|
|
|
|
END SUBROUTINE LINEAR_BAD
|