diff options
author | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-11-06 10:40:11 +0000 |
---|---|---|
committer | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-11-06 10:40:11 +0000 |
commit | e2cf69382a50cb683d628c922b181199ef3aadde (patch) | |
tree | 2d4c21d8d66699f557189357307516c8d11572ff /gcc/fortran/trans-array.c | |
parent | f3b1a797f9784dcb34587273d13f122df6b41949 (diff) |
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
Backported from trunk
PR fortran/78641
* resolve.c (resolve_ordinary_assign): Do not add the _data
component for class valued array constructors being assigned
to derived type arrays.
* trans-array.c (gfc_trans_array_ctor_element): Take the _data
of class valued elements for assignment to derived type arrays.
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
Backported from trunk
PR fortran/78641
* gfortran.dg/class_66.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@254444 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 47e8c091a9b0..d3a452a13fac 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -1441,6 +1441,17 @@ gfc_trans_array_ctor_element (stmtblock_t * pblock, tree desc, } } } + else if (GFC_CLASS_TYPE_P (TREE_TYPE (se->expr)) + && !GFC_CLASS_TYPE_P (gfc_get_element_type (TREE_TYPE (desc)))) + { + /* Assignment of a CLASS array constructor to a derived type array. */ + if (expr->expr_type == EXPR_FUNCTION) + se->expr = gfc_evaluate_now (se->expr, pblock); + se->expr = gfc_class_data_get (se->expr); + se->expr = build_fold_indirect_ref_loc (input_location, se->expr); + se->expr = fold_convert (TREE_TYPE (tmp), se->expr); + gfc_add_modify (&se->pre, tmp, se->expr); + } else { /* TODO: Should the frontend already have done this conversion? */ |