Subclause 7.5.2.4 lists conditions under which two distinct derived types are to be considered the same type for purposes of argument association, assignment, and so on. These conditions are implemented in evaluate::IsTkCompatibleWith(), but assignment semantics doesn't use it for testing for intrinsic assignment compatibility. Fix that. Differential Revision: https://reviews.llvm.org/D117621
49 lines
1.1 KiB
Fortran
49 lines
1.1 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
! "Same type" checking for intrinsic assignment
|
|
module m1
|
|
type :: nonSeqType
|
|
integer :: n1
|
|
end type
|
|
type :: seqType
|
|
sequence
|
|
integer :: n2
|
|
end type
|
|
type, bind(c) :: bindCType
|
|
integer :: n3
|
|
end type
|
|
end module
|
|
|
|
program test
|
|
use m1, modNonSeqType => nonSeqType, modSeqType => seqType, modBindCType => bindCType
|
|
type :: nonSeqType
|
|
integer :: n1
|
|
end type
|
|
type :: seqType
|
|
sequence
|
|
integer :: n2
|
|
end type
|
|
type, bind(c) :: bindCType
|
|
integer :: n3
|
|
end type
|
|
type(modNonSeqType) :: mns1, mns2
|
|
type(modSeqType) :: ms1, ms2
|
|
type(modBindCType) :: mb1, mb2
|
|
type(nonSeqType) :: ns1, ns2
|
|
type(seqType) :: s1, s2
|
|
type(bindCType) :: b1, b2
|
|
! These are trivially ok
|
|
mns1 = mns2
|
|
ms1 = ms2
|
|
mb1 = mb2
|
|
ns1 = ns2
|
|
s1 = s2
|
|
b1 = b2
|
|
! These are ok per 7.5.2.4
|
|
ms1 = s1
|
|
mb1 = b1
|
|
!ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types TYPE(modnonseqtype) and TYPE(nonseqtype)
|
|
mns1 = ns1
|
|
!ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types TYPE(nonseqtype) and TYPE(modnonseqtype)
|
|
ns1 = mns1
|
|
end
|