re PR fortran/78641 ([OOP] ICE on polymorphic allocatable function in array constructor)
authorPaul Thomas <pault@gcc.gnu.org>
Sun, 5 Nov 2017 14:32:05 +0000 (14:32 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sun, 5 Nov 2017 14:32:05 +0000 (14:32 +0000)
2017-11-05  Paul Thomas  <pault@gcc.gnu.org>

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  <pault@gcc.gnu.org>

PR fortran/78641
* gfortran.dg/class_66.f90: New test.

From-SVN: r254428

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/class_66.f90 [new file with mode: 0644]

index 1a4da461e1c4227a540a741275cb5a3626c9faac..cbc8e29adaba20c4d54aecd8da17282ddf547b82 100644 (file)
@@ -1,3 +1,12 @@
+2017-11-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       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  <pault@gcc.gnu.org>
 
        PR fortran/81447
index 50b4b49fe97476961a0abb7932b2f3bcfb3a4be1..1dde0d3ce1a63569cf98def63fdff48b4c0c1871 100644 (file)
@@ -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
index a357389ae646ee30500bc158ac7077fcd0ad2d41..59b09fae0081b14c275f7c4a89fde3d9ce3c6084 100644 (file)
@@ -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?  */
index 993dca9fee7caac9240e9d8cb1eb92345e537792..1c92e2010f183d370edad9fd3ce23c4adcadb1ba 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-05  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/78641
+       * gfortran.dg/class_66.f90: New test.
+
 2017-11-05  Paul Thomas  <pault@gcc.gnu.org>
 
        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 (file)
index 0000000..1843ea7
--- /dev/null
@@ -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  <damian@sourceryinstitute.org>
+!
+  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