| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Test DO loop semantics for constraint C1130 -- |
| ! The constraint states that "If the locality-spec DEFAULT ( NONE ) appears in a |
| ! DO CONCURRENT statement; a variable that is a local or construct entity of a |
| ! scope containing the DO CONCURRENT construct; and that appears in the block of |
| ! the construct; shall have its locality explicitly specified by that |
| ! statement." |
| |
| module m |
| real :: mvar |
| end module m |
| |
| subroutine s1() |
| use m |
| integer :: i, ivar, jvar, kvar |
| real :: x |
| |
| type point |
| real :: x, y |
| end type point |
| |
| type, extends(point) :: color_point |
| integer :: color |
| end type color_point |
| |
| type(point), target :: c |
| class(point), pointer :: p_or_c |
| |
| p_or_c => c |
| |
| jvar = 5 |
| |
| ! References in this DO CONCURRENT are OK since there's no DEFAULT(NONE) |
| ! locality-spec |
| associate (avar => ivar) |
| do concurrent (i = 1:2) shared(jvar) |
| ivar = 3 |
| ivar = ivar + i |
| block |
| real :: bvar |
| avar = 4 |
| x = 3.5 |
| bvar = 3.5 + i |
| end block |
| jvar = 5 |
| mvar = 3.5 |
| end do |
| end associate |
| |
| associate (avar => ivar) |
| !ERROR: DO CONCURRENT step expression may not be zero |
| do concurrent (i = 1:2:0) default(none) shared(jvar) local(kvar) |
| !ERROR: Variable 'ivar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec |
| ivar = & |
| !ERROR: Variable 'ivar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec |
| ivar + i |
| block |
| real :: bvar |
| !ERROR: Variable 'avar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec |
| avar = 4 |
| !ERROR: Variable 'x' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec |
| x = 3.5 |
| bvar = 3.5 + i ! OK, bvar's scope is within the DO CONCURRENT |
| end block |
| jvar = 5 ! OK, jvar appears in a locality spec |
| kvar = 5 ! OK, kvar appears in a locality spec |
| |
| !ERROR: Variable 'mvar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec |
| mvar = 3.5 |
| end do |
| end associate |
| |
| select type ( a => p_or_c ) |
| type is ( point ) |
| do concurrent (i=1:5) local(a) |
| ! C1130 This is OK because there's no DEFAULT(NONE) locality spec |
| a%x = 3.5 |
| end do |
| end select |
| |
| select type ( a => p_or_c ) |
| type is ( point ) |
| do concurrent (i=1:5) default (none) |
| !ERROR: Variable 'a' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec |
| a%x = 3.5 |
| end do |
| end select |
| |
| select type ( a => p_or_c ) |
| type is ( point ) |
| do concurrent (i=1:5) default (none) local(a) |
| ! C1130 This is OK because 'a' is in a locality-spec |
| a%x = 3.5 |
| end do |
| end select |
| |
| x = 5.0 ! OK, we're not in a DO CONCURRENT |
| |
| end subroutine s1 |