Fortran: fix check of polymorphic elements in data transfers [PR100971]
Commit Message
Dear all,
the check of data transfer elements needs to verify that for
polymorphic objects there is a user defined DTIO procedure.
This check worked fine for scalars, but skipped arrays,
leading to an ICE later.
The obvious fix is to allow this check to inspect arrays.
Regtested on x86_64-pc-linux-gnu. OK for mainline?
Thanks,
Harald
Comments
Le 09/10/2022 à 20:57, Harald Anlauf via Fortran a écrit :
> Dear all,
>
> the check of data transfer elements needs to verify that for
> polymorphic objects there is a user defined DTIO procedure.
> This check worked fine for scalars, but skipped arrays,
> leading to an ICE later.
>
> The obvious fix is to allow this check to inspect arrays.
>
> Regtested on x86_64-pc-linux-gnu. OK for mainline?
>
Yes, thanks.
From 4db0aba8309a2c7e2c7ac95195621dff02e9796c Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Sun, 9 Oct 2022 20:43:32 +0200
Subject: [PATCH] Fortran: fix check of polymorphic elements in data transfers
[PR100971]
gcc/fortran/ChangeLog:
PR fortran/100971
* resolve.cc (resolve_transfer): Extend check for permissibility
of polymorphic elements in a data transfer to arrays.
gcc/testsuite/ChangeLog:
PR fortran/100971
* gfortran.dg/der_io_5.f90: New test.
---
gcc/fortran/resolve.cc | 5 +++++
gcc/testsuite/gfortran.dg/der_io_5.f90 | 17 +++++++++++++++++
2 files changed, 22 insertions(+)
create mode 100644 gcc/testsuite/gfortran.dg/der_io_5.f90
@@ -10017,6 +10017,7 @@ resolve_transfer (gfc_code *code)
if (exp == NULL || (exp->expr_type != EXPR_VARIABLE
&& exp->expr_type != EXPR_FUNCTION
+ && exp->expr_type != EXPR_ARRAY
&& exp->expr_type != EXPR_STRUCTURE))
return;
@@ -10030,6 +10031,7 @@ resolve_transfer (gfc_code *code)
const gfc_typespec *ts = exp->expr_type == EXPR_STRUCTURE
|| exp->expr_type == EXPR_FUNCTION
+ || exp->expr_type == EXPR_ARRAY
? &exp->ts : &exp->symtree->n.sym->ts;
/* Go to actual component transferred. */
@@ -10128,6 +10130,9 @@ resolve_transfer (gfc_code *code)
if (exp->expr_type == EXPR_STRUCTURE)
return;
+ if (exp->expr_type == EXPR_ARRAY)
+ return;
+
sym = exp->symtree->n.sym;
if (sym->as != NULL && sym->as->type == AS_ASSUMED_SIZE && exp->ref
new file mode 100644
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! PR fortran/100971 - ICE: Bad IO basetype (7)
+! Contributed by G.Steinmetz
+
+program p
+ implicit none
+ type t
+ end type
+ class(t), allocatable :: a, b(:)
+ type(t) :: x, y(1)
+ integer :: i
+ allocate (a,b(1))
+ print *, [a] ! { dg-error "Data transfer element at .1. cannot be polymorphic" }
+ print *, [(b(i),i=1,1)] ! { dg-error "Data transfer element at .1. cannot be polymorphic" }
+ print *, [x]
+ print *, [(y(i),i=1,1)]
+end
--
2.35.3