[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:
Peter Klausler 2025-01-31 10:53:40 -08:00 committed by GitHub
parent 10b0a07e11
commit 4927a5ed4a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 6 deletions

View File

@ -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) {

View 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