]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Fix ICE in sizeof(coarray) [PR77518]
authorAndre Vehreschild <vehre@gcc.gnu.org>
Thu, 18 Jul 2024 12:53:31 +0000 (14:53 +0200)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Wed, 21 Aug 2024 06:38:56 +0000 (08:38 +0200)
Use se's class_container where present in sizeof().

PR fortran/77518

gcc/fortran/ChangeLog:

* trans-intrinsic.cc (gfc_conv_intrinsic_sizeof): Use
class_container of se when set.

gcc/testsuite/ChangeLog:

* gfortran.dg/coarray/sizeof_1.f90: New test.

gcc/fortran/trans-intrinsic.cc
gcc/testsuite/gfortran.dg/coarray/sizeof_1.f90 [new file with mode: 0644]

index fd2da4638252f97b17de3d179b2469c2be1e882d..0ecb043977833f2b6fa29a72264e616ae9b61883 100644 (file)
@@ -8216,10 +8216,17 @@ gfc_conv_intrinsic_sizeof (gfc_se *se, gfc_expr *expr)
       else if (arg->rank > 0
               || (arg->rank == 0
                   && arg->ref && arg->ref->type == REF_COMPONENT))
-       /* The scalarizer added an additional temp.  To get the class' vptr
-          one has to look at the original backend_decl.  */
-       byte_size = gfc_class_vtab_size_get (
+       {
+         /* The scalarizer added an additional temp.  To get the class' vptr
+            one has to look at the original backend_decl.  */
+         if (argse.class_container)
+           byte_size = gfc_class_vtab_size_get (argse.class_container);
+         else if (DECL_LANG_SPECIFIC (arg->symtree->n.sym->backend_decl))
+           byte_size = gfc_class_vtab_size_get (
              GFC_DECL_SAVED_DESCRIPTOR (arg->symtree->n.sym->backend_decl));
+         else
+           gcc_unreachable ();
+       }
       else
        gcc_unreachable ();
     }
diff --git a/gcc/testsuite/gfortran.dg/coarray/sizeof_1.f90 b/gcc/testsuite/gfortran.dg/coarray/sizeof_1.f90
new file mode 100644 (file)
index 0000000..b26f841
--- /dev/null
@@ -0,0 +1,27 @@
+!{ dg-do run }
+
+! Check that pr77518 is fixed.
+! Based on code by Gerhard Steinmetz  <gerhard.steinmetz.fortran@t-online.de>
+
+program coarray_sizeof_1
+  type t
+  end type
+  type t2
+    integer :: v = 42
+  end type
+  type t3
+    type(t2) :: s
+    integer :: n = 1
+  end type
+
+  class(t), allocatable :: z[:]
+  class(t2), allocatable :: z2[:]
+  class(t3), allocatable :: z3[:]
+
+  if (sizeof(z) /= 0) stop 1
+  if (sizeof(z2) /= sizeof(integer)) stop 2
+  allocate(z3[*])
+  if (sizeof(z3) /= sizeof(z2) + sizeof(integer)) stop 3
+  if (sizeof(z3%s) /= sizeof(z2)) stop 4
+end
+