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.
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 ();
}
--- /dev/null
+!{ 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
+