From: Paul Thomas Date: Sun, 5 Nov 2017 14:32:05 +0000 (+0000) Subject: re PR fortran/78641 ([OOP] ICE on polymorphic allocatable function in array constructor) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5233d45559d5869fe7dc9705d6c79e6538d8a2ab;p=gcc.git re PR fortran/78641 ([OOP] ICE on polymorphic allocatable function in array constructor) 2017-11-05 Paul Thomas 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-05 Paul Thomas PR fortran/78641 * gfortran.dg/class_66.f90: New test. From-SVN: r254428 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1a4da461e1c..cbc8e29adab 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2017-11-05 Paul Thomas + + 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-05 Paul Thomas PR fortran/81447 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 50b4b49fe97..1dde0d3ce1a 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -10324,7 +10324,8 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns) /* Assign the 'data' of a class object to a derived type. */ if (lhs->ts.type == BT_DERIVED - && rhs->ts.type == BT_CLASS) + && rhs->ts.type == BT_CLASS + && rhs->expr_type != EXPR_ARRAY) gfc_add_data_component (rhs); bool caf_convert_to_send = flag_coarray == GFC_FCOARRAY_LIB diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index a357389ae64..59b09fae008 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -1580,6 +1580,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? */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 993dca9fee7..1c92e2010f1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-05 Paul Thomas + + PR fortran/78641 + * gfortran.dg/class_66.f90: New test. + 2017-11-05 Paul Thomas PR fortran/81447 diff --git a/gcc/testsuite/gfortran.dg/class_66.f90 b/gcc/testsuite/gfortran.dg/class_66.f90 new file mode 100644 index 00000000000..1843ea7eb69 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_66.f90 @@ -0,0 +1,28 @@ +! { dg- do run } +! +! Test the fix for PR78641 in which an ICE occured on assignment +! of a class array constructor to a derived type array. +! +! Contributed by Damian Rouson +! + implicit none + type foo + integer :: i = 99 + end type + type(foo) :: bar(4) + class(foo), allocatable :: barfoo + + allocate(barfoo,source = f(11)) + bar = [f(33), [f(22), barfoo], f(1)] + if (any (bar%i .ne. [33, 22, 11, 1])) call abort + deallocate (barfoo) + +contains + + function f(arg) result(foobar) + class(foo), allocatable :: foobar + integer :: arg + allocate(foobar,source = foo(arg)) + end function + +end program