https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114024
kargl at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
Priority|P3 |P4
--- Comment #2 from kargl at gcc dot gnu.org ---
This is ugly. Essentially, the translation of an allocate statement is
mot prepared to have a complex-part-ref as the source expression. For this
code
program foo
implicit none
complex :: cmp(3)
real, allocatable :: xx(:), yy(:), zz(:)
cmp = (3.45,6.78)
allocate (xx, source = cmp%re) ! ICE
allocate (yy, source = cmp(1:3)%re) ! ICE
allocate (zz, source = (cmp%re))
print *, xx
print *, yy
print *, zz
end
The lines marked with ICE will cause gfortran to, well, ICE. The
following patch cures the issues by impose a set of parentheses
about the source expression. There is likely a better way.
diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index 5247d3d39d7..6ff3f12d7ed 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -6355,8 +6355,24 @@ gfc_trans_allocate (gfc_code * code, gfc_omp_namelist
*omp_allocate)
vtab_needed = (al->expr->ts.type == BT_CLASS);
gfc_init_se (&se, NULL);
- /* When expr3 is a variable, i.e., a very simple expression,
- then convert it once here. */
+
+ /* When expr3 is a variable, i.e., a very simple expression, then
+ convert it once here. Note, if one has source = z%re or z%im,
+ then things can go sideways with the complex-part-ref, so wrap
+ the entity in parentheses to force evaluation of an expression.
+ That is, the else-branch of the ensuing if-else-stmt is entered. */
+
+ if (code->expr3->ref
+ && ((code->expr3->ref->u.i == INQUIRY_RE
+ || code->expr3->ref->u.i == INQUIRY_IM)
+ || (code->expr3->ref->type == REF_ARRAY
+ && code->expr3->ref->u.ar.type == AR_SECTION)))
+ {
+ gfc_expr *etmp = gfc_get_parentheses (code->expr3);
+ code->expr3 = gfc_copy_expr (etmp);
+ gfc_free_expr (etmp);
+ }
+
if (code->expr3->expr_type == EXPR_VARIABLE
|| code->expr3->expr_type == EXPR_ARRAY
|| code->expr3->expr_type == EXPR_CONSTANT)