mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 08:16:47 +00:00
[flang] Allow defined assignment to CLASS(*) (#124817)
An unlimited polymorphic left-hand side variable is acceptable in the definition of a defined assignment subroutine. Fixes https://github.com/llvm/llvm-project/issues/124621.
This commit is contained in:
parent
10b0a07e11
commit
4927a5ed4a
@ -137,12 +137,6 @@ Tristate IsDefinedAssignment(
|
||||
if (!lhsType || !rhsType) {
|
||||
return Tristate::No; // error or rhs is untyped
|
||||
}
|
||||
if (lhsType->IsUnlimitedPolymorphic()) {
|
||||
return Tristate::No;
|
||||
}
|
||||
if (rhsType->IsUnlimitedPolymorphic()) {
|
||||
return Tristate::Maybe;
|
||||
}
|
||||
TypeCategory lhsCat{lhsType->category()};
|
||||
TypeCategory rhsCat{rhsType->category()};
|
||||
if (rhsRank > 0 && lhsRank != rhsRank) {
|
||||
|
46
flang/test/Semantics/bug124621.f90
Normal file
46
flang/test/Semantics/bug124621.f90
Normal file
@ -0,0 +1,46 @@
|
||||
! RUN: %python %S/test_errors.py %s %flang_fc1
|
||||
module m
|
||||
type t1
|
||||
contains
|
||||
procedure, pass(from) :: defAsst1
|
||||
generic :: assignment(=) => defAsst1
|
||||
end type
|
||||
type t2
|
||||
end type
|
||||
type t3
|
||||
end type
|
||||
interface assignment(=)
|
||||
module procedure defAsst2
|
||||
end interface
|
||||
contains
|
||||
subroutine defAsst1(to,from)
|
||||
class(*), intent(out) :: to
|
||||
class(t1), intent(in) :: from
|
||||
end
|
||||
subroutine defAsst2(to,from)
|
||||
class(*), intent(out) :: to
|
||||
class(t2), intent(in) :: from
|
||||
end
|
||||
end
|
||||
|
||||
program test
|
||||
use m
|
||||
type(t1) x1
|
||||
type(t2) x2
|
||||
type(t3) x3
|
||||
j = x1
|
||||
j = x2
|
||||
!ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types INTEGER(4) and TYPE(t3)
|
||||
j = x3
|
||||
x1 = x1
|
||||
x1 = x2
|
||||
!ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types TYPE(t1) and TYPE(t3)
|
||||
x1 = x3
|
||||
x2 = x1
|
||||
x2 = x2
|
||||
!ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types TYPE(t2) and TYPE(t3)
|
||||
x2 = x3
|
||||
x3 = x1
|
||||
x3 = x2
|
||||
x3 = x3
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user