diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2019-09-29 10:12:42 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2019-09-29 10:12:42 +0000 |
commit | 56b070e3bbc4364f86357d6651fe1391464db6d6 (patch) | |
tree | 5f12959555e00cf9a1cbc41639212e59d4d5a50d /gcc/fortran/trans-expr.c | |
parent | ae517a31c9508d9b0424e7a057d05840cf2caaf5 (diff) | |
download | gcc-56b070e3bbc4364f86357d6651fe1391464db6d6.zip gcc-56b070e3bbc4364f86357d6651fe1391464db6d6.tar.gz gcc-56b070e3bbc4364f86357d6651fe1391464db6d6.tar.bz2 |
re PR fortran/91726 (ICE in gfc_conv_array_ref, at fortran/trans-array.c:3612)
2019-09-29 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91726
* resolve.c (gfc_expr_to_initialize): Bail out with a copy of
the original expression if the array ref is a scalar and the
array_spec has corank.
* trans-array.c (gfc_conv_array_ref): Such expressions are OK
even if the array ref codimen is zero.
* trans-expr.c (gfc_get_class_from_expr): New function taken
from gfc_get_vptr_from_expr.
(gfc_get_vptr_from_expr): Call new function.
* trans-stmt.c (trans_associate_var): If one of these is a
target expression, extract the class expression from the target
and copy its fields to a new target variable.
* trans.h : Add prototype for gfc_get_class_from_expr.
2019-09-29 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91726
* gfortran.dg/coarray_poly_9.f90 : New test.
From-SVN: r276269
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 2adc112..61db4e3 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -472,11 +472,11 @@ gfc_reset_len (stmtblock_t *block, gfc_expr *expr) } -/* Obtain the vptr of the last class reference in an expression. +/* Obtain the last class reference in an expression. Return NULL_TREE if no class reference is found. */ tree -gfc_get_vptr_from_expr (tree expr) +gfc_get_class_from_expr (tree expr) { tree tmp; tree type; @@ -487,7 +487,7 @@ gfc_get_vptr_from_expr (tree expr) while (type) { if (GFC_CLASS_TYPE_P (type)) - return gfc_class_vptr_get (tmp); + return tmp; if (type != TYPE_CANONICAL (type)) type = TYPE_CANONICAL (type); else @@ -501,6 +501,23 @@ gfc_get_vptr_from_expr (tree expr) tmp = build_fold_indirect_ref_loc (input_location, tmp); if (GFC_CLASS_TYPE_P (TREE_TYPE (tmp))) + return tmp; + + return NULL_TREE; +} + + +/* Obtain the vptr of the last class reference in an expression. + Return NULL_TREE if no class reference is found. */ + +tree +gfc_get_vptr_from_expr (tree expr) +{ + tree tmp; + + tmp = gfc_get_class_from_expr (expr); + + if (tmp != NULL_TREE) return gfc_class_vptr_get (tmp); return NULL_TREE; |