2020-05-12 02:38:53 +08:00
|
|
|
! RUN: %S/test_errors.sh %s %t %f18
|
2018-09-05 01:28:27 +08:00
|
|
|
! Derived type parameters
|
2020-03-31 08:42:50 +08:00
|
|
|
! C731 The same type-param-name shall not appear more than once in a given
|
|
|
|
! derived-type-stmt.
|
[flang] New implementation for checks for constraints C741 through C750
Summary:
Most of these checks were already implemented, and I just added references to
them to the code and tests. Also, much of this code was already
reviewed in the old flang/f18 GitHub repository, but I didn't get to
merge it before we switched repositories.
I implemented the check for C747 to not allow coarray components in derived
types that are of type C_PTR, C_FUNPTR, or type TEAM_TYPE.
I implemented the check for C748 that requires a data component whose type has
a coarray ultimate component to be a nonpointer, nonallocatable scalar and not
be a coarray.
I implemented the check for C750 that adds additional restrictions to the
bounds expressions of a derived type component that's an array.
These bounds expressions are sepcification expressions as defined in
10.1.11. There was already code in lib/Evaluate/check-expression.cpp to
check semantics for specification expressions, but it did not check for
the extra requirements of C750.
C750 prohibits specification functions, the intrinsic functions
ALLOCATED, ASSOCIATED, EXTENDS_TYPE_OF, PRESENT, and SAME_TYPE_AS. It
also requires every specification inquiry reference to be a constant
expression, and requires that the value of the bound not depend on the
value of a variable.
To implement these additional checks, I added code to the intrinsic proc
table to get the intrinsic class of a procedure. I also added an
enumeration to distinguish between specification expressions for
derived type component bounds versus for type parameters. I then
changed the code to pass an enumeration value to
"CheckSpecificationExpr()" to indicate that the expression was a bounds
expression and used this value to determine whether to emit an error
message when violations of C750 are found.
I changed the implementation of IsPureProcedure() to handle statement
functions and changed some references in the code that tested for the
PURE attribute to call IsPureProcedure().
I also fixed some unrelated tests that got new errors when I implemented these
new checks.
Reviewers: tskeith, DavidTruby, sscalpone
Subscribers: jfb, llvm-commits
Tags: #llvm, #flang
Differential Revision: https://reviews.llvm.org/D79263
2020-05-02 04:00:28 +08:00
|
|
|
! C741 A type-param-name in a type-param-def-stmt in a derived-type-def shall
|
|
|
|
! be one of the type-paramnames in the derived-type-stmt of that
|
|
|
|
! derived-type-def.
|
|
|
|
! C742 Each type-param-name in the derived-type-stmt in a derived-type-def
|
|
|
|
! shall appear exactly once as a type-param-name in a type-param-def-stmt
|
|
|
|
! in that derived-type-def.
|
2018-09-05 01:28:27 +08:00
|
|
|
|
|
|
|
module m
|
|
|
|
!ERROR: Duplicate type parameter name: 'a'
|
|
|
|
type t1(a, b, a)
|
|
|
|
integer, kind :: a
|
|
|
|
integer(8), len :: b
|
|
|
|
end type
|
|
|
|
!ERROR: No definition found for type parameter 'b'
|
|
|
|
type t2(a, b, c)
|
|
|
|
integer, kind :: a
|
|
|
|
integer, len :: c
|
|
|
|
end type
|
2019-02-16 08:08:32 +08:00
|
|
|
!ERROR: No definition found for type parameter 'b'
|
2018-09-05 01:28:27 +08:00
|
|
|
type t3(a, b)
|
|
|
|
integer, kind :: a
|
|
|
|
integer :: b
|
|
|
|
end type
|
|
|
|
type t4(a)
|
|
|
|
integer, kind :: a
|
|
|
|
!ERROR: 'd' is not a type parameter of this derived type
|
|
|
|
integer(8), len :: d
|
|
|
|
end type
|
2018-12-07 09:52:43 +08:00
|
|
|
type t5(a, b)
|
|
|
|
integer, len :: a
|
|
|
|
integer, len :: b
|
|
|
|
!ERROR: Type parameter, component, or procedure binding 'a' already defined in this type
|
|
|
|
integer, len :: a
|
|
|
|
end type
|
2020-05-02 11:47:59 +08:00
|
|
|
!ERROR: No definition found for type parameter 'k'
|
|
|
|
!ERROR: No definition found for type parameter 'l'
|
|
|
|
type :: t6(k, l)
|
|
|
|
character(kind=k, len=l) :: d3
|
|
|
|
end type
|
|
|
|
type(t6(2, 10)) :: x3
|
2018-09-05 01:28:27 +08:00
|
|
|
end module
|