Fortran: BOZ literal constants are not compatible to any type [PR103413]
Checks
Commit Message
Dear all,
a BOZ as source-expression in an ALLOCATE statement could lead
to an ICE when the allocate-object was a CLASS variable.
Since a BOZ has no type, we can handle it as type incompatible
with any type. This is also what the Cray compiler does for
the code in the testcase.
Regtested on x86_64-pc-linux-gnu. OK for mainline?
The PR is marked as a 10/11/12/13 regression, so OK for backports?
Thanks,
Harald
Comments
Hello,
Le 26/10/2022 à 21:15, Harald Anlauf via Fortran a écrit :
> Dear all,
>
> a BOZ as source-expression in an ALLOCATE statement could lead
> to an ICE when the allocate-object was a CLASS variable.
> Since a BOZ has no type, we can handle it as type incompatible
> with any type. This is also what the Cray compiler does for
> the code in the testcase.
>
> Regtested on x86_64-pc-linux-gnu. OK for mainline?
>
> The PR is marked as a 10/11/12/13 regression, so OK for backports?
>
OK for both, thanks.
From 986bf9cc5abc51598609b16edc9242a87244571b Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Wed, 26 Oct 2022 21:00:44 +0200
Subject: [PATCH] Fortran: BOZ literal constants are not compatible to any type
[PR103413]
gcc/fortran/ChangeLog:
PR fortran/103413
* symbol.cc (gfc_type_compatible): A boz-literal-constant has no type
and thus is not considered compatible to any type.
gcc/testsuite/ChangeLog:
PR fortran/103413
* gfortran.dg/illegal_boz_arg_4.f90: New test.
---
gcc/fortran/symbol.cc | 4 ++++
gcc/testsuite/gfortran.dg/illegal_boz_arg_4.f90 | 13 +++++++++++++
2 files changed, 17 insertions(+)
create mode 100644 gcc/testsuite/gfortran.dg/illegal_boz_arg_4.f90
@@ -5139,6 +5139,10 @@ gfc_type_compatible (gfc_typespec *ts1, gfc_typespec *ts2)
bool is_union1 = (ts1->type == BT_UNION);
bool is_union2 = (ts2->type == BT_UNION);
+ /* A boz-literal-constant has no type. */
+ if (ts1->type == BT_BOZ || ts2->type == BT_BOZ)
+ return false;
+
if (is_class1
&& ts1->u.derived->components
&& ((ts1->u.derived->attr.is_class
new file mode 100644
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! { dg-options "-std=f2018" }
+! PR fortran/103413
+! Contributed by G.Steinmetz
+
+program p
+ type t
+ class(*), allocatable :: a
+ end type
+ type(t) :: x
+ allocate (x%a, source=z'1') ! { dg-error "type incompatible" }
+ allocate (x%a, mold=z'1') ! { dg-error "type incompatible" }
+end
--
2.35.3