2021-09-06 16:19:20 +08:00
|
|
|
! RUN: %python %S/test_errors.py %s %flang_fc1
|
2019-08-01 05:01:31 +08:00
|
|
|
! Test DO loop semantics for constraint C1130 --
|
2019-08-06 04:36:01 +08:00
|
|
|
! 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
|
2019-08-01 05:01:31 +08:00
|
|
|
! 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
|
|
|
|
|
2019-08-06 04:36:01 +08:00
|
|
|
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
|
|
|
|
|
2019-08-01 05:01:31 +08:00
|
|
|
jvar = 5
|
|
|
|
|
|
|
|
! References in this DO CONCURRENT are OK since there's no DEFAULT(NONE)
|
|
|
|
! locality-spec
|
2019-08-06 04:36:01 +08:00
|
|
|
associate (avar => ivar)
|
2019-11-21 05:33:04 +08:00
|
|
|
do concurrent (i = 1:2) shared(jvar)
|
2019-08-06 04:36:01 +08:00
|
|
|
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
|
2019-08-01 05:01:31 +08:00
|
|
|
|
2019-08-06 04:36:01 +08:00
|
|
|
associate (avar => ivar)
|
2020-02-19 09:14:24 +08:00
|
|
|
!ERROR: DO CONCURRENT step expression may not be zero
|
2019-08-06 04:36:01 +08:00
|
|
|
do concurrent (i = 1:2:0) default(none) shared(jvar) local(kvar)
|
[flang] Changes to check for constraint C1140
This constraint prohibits deallocation of polymorphic entities in a DO
CONCURRENT.
Section 9.7.3.2 specifies the situations that might cause deallocation
of a polymorphic entity. The ones that are applicable to a DO CONCURRENT
are exiting from a block that declares such variables, intrinsic
assignment, and an actual DEALLOCATE statement. This section also
specifies (paragraph 8) that deallocation of a derived type causes
deallocation of all of its allocatable subobjects.
Section 10.2.1.3 specifies what happens during intrinsic assignment.
Paragraph 3 states If the variable is an allocated allocatable variable,
it is deallocated if expr is an array of different shape, any
corresponding length type parameter values of the variable and expr
differ, or the variable is polymorphic and the dynamic type or any
corresponding kind type parameter values of the variable and expr
differ." Thus, an allocatable polymorphic variable on the left hand side
of an assignment statement gets deallocated. Paragraph 13 states that
"For a noncoarray allocatable component the following sequence of
operations is applied.
(1) If the component of the variable is allocated, it is deallocated."
Thus, a variable on the left-hand side of an assignment statement might have noncorray allocatable components. Such components will be deallocated.
Deallocation can be caused by exiting from a block where the entity is
declared, from an assignment, and from direct deallocation.
Original-commit: flang-compiler/f18@7d1932d344308d8266503268a7534532cebe6087
Reviewed-on: https://github.com/flang-compiler/f18/pull/814
2019-11-06 02:18:33 +08:00
|
|
|
!ERROR: Variable 'ivar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec
|
2019-08-06 04:36:01 +08:00
|
|
|
ivar = &
|
[flang] Changes to check for constraint C1140
This constraint prohibits deallocation of polymorphic entities in a DO
CONCURRENT.
Section 9.7.3.2 specifies the situations that might cause deallocation
of a polymorphic entity. The ones that are applicable to a DO CONCURRENT
are exiting from a block that declares such variables, intrinsic
assignment, and an actual DEALLOCATE statement. This section also
specifies (paragraph 8) that deallocation of a derived type causes
deallocation of all of its allocatable subobjects.
Section 10.2.1.3 specifies what happens during intrinsic assignment.
Paragraph 3 states If the variable is an allocated allocatable variable,
it is deallocated if expr is an array of different shape, any
corresponding length type parameter values of the variable and expr
differ, or the variable is polymorphic and the dynamic type or any
corresponding kind type parameter values of the variable and expr
differ." Thus, an allocatable polymorphic variable on the left hand side
of an assignment statement gets deallocated. Paragraph 13 states that
"For a noncoarray allocatable component the following sequence of
operations is applied.
(1) If the component of the variable is allocated, it is deallocated."
Thus, a variable on the left-hand side of an assignment statement might have noncorray allocatable components. Such components will be deallocated.
Deallocation can be caused by exiting from a block where the entity is
declared, from an assignment, and from direct deallocation.
Original-commit: flang-compiler/f18@7d1932d344308d8266503268a7534532cebe6087
Reviewed-on: https://github.com/flang-compiler/f18/pull/814
2019-11-06 02:18:33 +08:00
|
|
|
!ERROR: Variable 'ivar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec
|
2019-08-06 04:36:01 +08:00
|
|
|
ivar + i
|
|
|
|
block
|
|
|
|
real :: bvar
|
[flang] Changes to check for constraint C1140
This constraint prohibits deallocation of polymorphic entities in a DO
CONCURRENT.
Section 9.7.3.2 specifies the situations that might cause deallocation
of a polymorphic entity. The ones that are applicable to a DO CONCURRENT
are exiting from a block that declares such variables, intrinsic
assignment, and an actual DEALLOCATE statement. This section also
specifies (paragraph 8) that deallocation of a derived type causes
deallocation of all of its allocatable subobjects.
Section 10.2.1.3 specifies what happens during intrinsic assignment.
Paragraph 3 states If the variable is an allocated allocatable variable,
it is deallocated if expr is an array of different shape, any
corresponding length type parameter values of the variable and expr
differ, or the variable is polymorphic and the dynamic type or any
corresponding kind type parameter values of the variable and expr
differ." Thus, an allocatable polymorphic variable on the left hand side
of an assignment statement gets deallocated. Paragraph 13 states that
"For a noncoarray allocatable component the following sequence of
operations is applied.
(1) If the component of the variable is allocated, it is deallocated."
Thus, a variable on the left-hand side of an assignment statement might have noncorray allocatable components. Such components will be deallocated.
Deallocation can be caused by exiting from a block where the entity is
declared, from an assignment, and from direct deallocation.
Original-commit: flang-compiler/f18@7d1932d344308d8266503268a7534532cebe6087
Reviewed-on: https://github.com/flang-compiler/f18/pull/814
2019-11-06 02:18:33 +08:00
|
|
|
!ERROR: Variable 'avar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec
|
2019-08-06 04:36:01 +08:00
|
|
|
avar = 4
|
[flang] Changes to check for constraint C1140
This constraint prohibits deallocation of polymorphic entities in a DO
CONCURRENT.
Section 9.7.3.2 specifies the situations that might cause deallocation
of a polymorphic entity. The ones that are applicable to a DO CONCURRENT
are exiting from a block that declares such variables, intrinsic
assignment, and an actual DEALLOCATE statement. This section also
specifies (paragraph 8) that deallocation of a derived type causes
deallocation of all of its allocatable subobjects.
Section 10.2.1.3 specifies what happens during intrinsic assignment.
Paragraph 3 states If the variable is an allocated allocatable variable,
it is deallocated if expr is an array of different shape, any
corresponding length type parameter values of the variable and expr
differ, or the variable is polymorphic and the dynamic type or any
corresponding kind type parameter values of the variable and expr
differ." Thus, an allocatable polymorphic variable on the left hand side
of an assignment statement gets deallocated. Paragraph 13 states that
"For a noncoarray allocatable component the following sequence of
operations is applied.
(1) If the component of the variable is allocated, it is deallocated."
Thus, a variable on the left-hand side of an assignment statement might have noncorray allocatable components. Such components will be deallocated.
Deallocation can be caused by exiting from a block where the entity is
declared, from an assignment, and from direct deallocation.
Original-commit: flang-compiler/f18@7d1932d344308d8266503268a7534532cebe6087
Reviewed-on: https://github.com/flang-compiler/f18/pull/814
2019-11-06 02:18:33 +08:00
|
|
|
!ERROR: Variable 'x' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec
|
2019-08-06 04:36:01 +08:00
|
|
|
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
|
|
|
|
|
[flang] Changes to check for constraint C1140
This constraint prohibits deallocation of polymorphic entities in a DO
CONCURRENT.
Section 9.7.3.2 specifies the situations that might cause deallocation
of a polymorphic entity. The ones that are applicable to a DO CONCURRENT
are exiting from a block that declares such variables, intrinsic
assignment, and an actual DEALLOCATE statement. This section also
specifies (paragraph 8) that deallocation of a derived type causes
deallocation of all of its allocatable subobjects.
Section 10.2.1.3 specifies what happens during intrinsic assignment.
Paragraph 3 states If the variable is an allocated allocatable variable,
it is deallocated if expr is an array of different shape, any
corresponding length type parameter values of the variable and expr
differ, or the variable is polymorphic and the dynamic type or any
corresponding kind type parameter values of the variable and expr
differ." Thus, an allocatable polymorphic variable on the left hand side
of an assignment statement gets deallocated. Paragraph 13 states that
"For a noncoarray allocatable component the following sequence of
operations is applied.
(1) If the component of the variable is allocated, it is deallocated."
Thus, a variable on the left-hand side of an assignment statement might have noncorray allocatable components. Such components will be deallocated.
Deallocation can be caused by exiting from a block where the entity is
declared, from an assignment, and from direct deallocation.
Original-commit: flang-compiler/f18@7d1932d344308d8266503268a7534532cebe6087
Reviewed-on: https://github.com/flang-compiler/f18/pull/814
2019-11-06 02:18:33 +08:00
|
|
|
!ERROR: Variable 'mvar' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec
|
2019-08-06 04:36:01 +08:00
|
|
|
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)
|
[flang] Changes to check for constraint C1140
This constraint prohibits deallocation of polymorphic entities in a DO
CONCURRENT.
Section 9.7.3.2 specifies the situations that might cause deallocation
of a polymorphic entity. The ones that are applicable to a DO CONCURRENT
are exiting from a block that declares such variables, intrinsic
assignment, and an actual DEALLOCATE statement. This section also
specifies (paragraph 8) that deallocation of a derived type causes
deallocation of all of its allocatable subobjects.
Section 10.2.1.3 specifies what happens during intrinsic assignment.
Paragraph 3 states If the variable is an allocated allocatable variable,
it is deallocated if expr is an array of different shape, any
corresponding length type parameter values of the variable and expr
differ, or the variable is polymorphic and the dynamic type or any
corresponding kind type parameter values of the variable and expr
differ." Thus, an allocatable polymorphic variable on the left hand side
of an assignment statement gets deallocated. Paragraph 13 states that
"For a noncoarray allocatable component the following sequence of
operations is applied.
(1) If the component of the variable is allocated, it is deallocated."
Thus, a variable on the left-hand side of an assignment statement might have noncorray allocatable components. Such components will be deallocated.
Deallocation can be caused by exiting from a block where the entity is
declared, from an assignment, and from direct deallocation.
Original-commit: flang-compiler/f18@7d1932d344308d8266503268a7534532cebe6087
Reviewed-on: https://github.com/flang-compiler/f18/pull/814
2019-11-06 02:18:33 +08:00
|
|
|
!ERROR: Variable 'a' from an enclosing scope referenced in DO CONCURRENT with DEFAULT(NONE) must appear in a locality-spec
|
2019-08-06 04:36:01 +08:00
|
|
|
a%x = 3.5
|
|
|
|
end do
|
|
|
|
end select
|
2019-08-01 05:01:31 +08:00
|
|
|
|
2019-08-06 04:36:01 +08:00
|
|
|
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
|
2019-08-01 05:01:31 +08:00
|
|
|
|
|
|
|
x = 5.0 ! OK, we're not in a DO CONCURRENT
|
|
|
|
|
|
|
|
end subroutine s1
|