re PR fortran/71047 (Allocatable component of INTENT(OUT) dummy not set correctly)
authorFritz Reese <fritzoreese@gmail.com>
Sat, 14 May 2016 15:29:13 +0000 (15:29 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 14 May 2016 15:29:13 +0000 (15:29 +0000)
2016-05-14  Fritz Reese <fritzoreese@gmail.com>

PR fortran/71047
* expr.c (gfc_default_initializer): Avoid extra component refs in
constructors for derived types and classes.

2016-05-14  Fritz Reese <fritzoreese@gmail.com>
PR fortran/71047
* gfortran.dg/pr71047.f08: New test.

From-SVN: r236241

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr71047.f08 [new file with mode: 0644]

index 3d79fcaec214c6c5f637b0f34495aeeb55dcab8b..a0256e13adb540f565c4c1daf0b13380dce46d57 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-14  Fritz Reese  <fritzoreese@gmail.com>
+
+       PR fortran/71047
+       * expr.c (gfc_default_initializer): Avoid extra component refs in
+       constructors for derived types and classes.
+
 2016-05-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/70855
index 6ebe08b75386ac393772c2b7cce8c23564ac4671..d1258cdf380f5e5b1967c75bddaf388a4119c9ea 100644 (file)
@@ -3975,7 +3975,10 @@ gfc_default_initializer (gfc_typespec *ts)
 
       if (comp->initializer)
        {
-          ctor->n.component = comp;
+         /* Save the component ref for STRUCTUREs and UNIONs.  */
+         if (ts->u.derived->attr.flavor == FL_STRUCT
+             || ts->u.derived->attr.flavor == FL_UNION)
+           ctor->n.component = comp;
          ctor->expr = gfc_copy_expr (comp->initializer);
          if ((comp->ts.type != comp->initializer->ts.type
               || comp->ts.kind != comp->initializer->ts.kind)
index 3916695f6f766ff994a0e583e4b056f4053cd0fd..9ca19ae6c00f53d55bb136d33806d5a256362309 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-14  Fritz Reese  <fritzoreese@gmail.com>
+
+       PR fortran/71047
+       * gfortran.dg/pr71047.f08: New test.
+
 2016-05-13  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/qual-return-5.c, gcc.dg/qual-return-6.c: New tests.
diff --git a/gcc/testsuite/gfortran.dg/pr71047.f08 b/gcc/testsuite/gfortran.dg/pr71047.f08
new file mode 100644 (file)
index 0000000..61a0ad4
--- /dev/null
@@ -0,0 +1,48 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! Fortran/PR71047
+!
+
+module m
+ implicit none
+
+ type, abstract :: c_abstr
+  integer :: i = 0
+ end type c_abstr
+
+ type, extends(c_abstr) :: t_a
+  class(c_abstr), allocatable :: f
+ end type t_a
+ type, extends(c_abstr) :: t_b
+ end type t_b
+
+contains
+
+ subroutine set(y,x)
+  class(c_abstr), intent(in)  :: x
+  type(t_a),      intent(out) :: y
+   allocate( y%f , source=x )
+ end subroutine set
+
+end module m
+
+
+program p
+ use m
+ implicit none
+
+ type(t_a) :: res
+ type(t_b) :: var
+
+  call set( res , var )
+  write(*,*) res%i
+
+end program p
+
+!
+! Check to ensure the vtable is actually initialized.
+!
+! { dg-final { scan-tree-dump "t_a\\.\\d+\\.f\\._vptr =" "original" } }
+!