]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/58880 ([OOP] ICE on valid with FINAL function and type extension)
authorTobias Burnus <burnus@gcc.gnu.org>
Thu, 27 Mar 2014 21:17:43 +0000 (22:17 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 27 Mar 2014 21:17:43 +0000 (22:17 +0100)
2014-03-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/58880
        * trans-expr.c (gfc_conv_scalar_to_descriptor): Fix handling
        of nonpointers.

2014-03-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/58880
        * gfortran.dg/finalize_24.f90: New.

From-SVN: r208879

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

index 848a76efb3c2e51a89251fbb44d911654a85cde1..ab702313d4773b4fe51cc0cfe4b7385de9f2ccad 100644 (file)
@@ -1,3 +1,9 @@
+2014-03-27  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/58880
+       * trans-expr.c (gfc_conv_scalar_to_descriptor): Fix handling
+       of nonpointers.
+
 2014-03-26 Dominique d'Humieres <dominiq@lps.ens.fr>
 
        PR fortran/34928
index f5350bb5ba9d35a9f09db9d003e879ab2fa0d7b6..9a6b40c5c58a42ed2a8fba8902d0e249a37549fa 100644 (file)
@@ -69,14 +69,16 @@ gfc_conv_scalar_to_descriptor (gfc_se *se, tree scalar, symbol_attribute attr)
   type = get_scalar_to_descriptor_type (scalar, attr);
   desc = gfc_create_var (type, "desc");
   DECL_ARTIFICIAL (desc) = 1;
+
+  if (!POINTER_TYPE_P (TREE_TYPE (scalar)))
+    scalar = gfc_build_addr_expr (NULL_TREE, scalar);
   gfc_add_modify (&se->pre, gfc_conv_descriptor_dtype (desc),
                  gfc_get_dtype (type));
   gfc_conv_descriptor_data_set (&se->pre, desc, scalar);
 
   /* Copy pointer address back - but only if it could have changed and
      if the actual argument is a pointer and not, e.g., NULL().  */
-  if ((attr.pointer || attr.allocatable)
-       && attr.intent != INTENT_IN && POINTER_TYPE_P (TREE_TYPE (scalar)))
+  if ((attr.pointer || attr.allocatable) && attr.intent != INTENT_IN)
     gfc_add_modify (&se->post, scalar,
                    fold_convert (TREE_TYPE (scalar),
                                  gfc_conv_descriptor_data_get (desc)));
index bf280022184ffe204d6552ddfdcad6312dd84d9a..03a617b4a432b5898639dcca8a40410ef6c7dc84 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-27  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/58880
+       * gfortran.dg/finalize_24.f90: New.
+
 2014-03-27  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/p8vector-vbpermq.c: New test to test the
@@ -43,8 +48,8 @@
 
 2014-03-26  Fabien ChĂȘne  <fabien@gcc.gnu.org>
 
-        PR c++/52369
-        * g++.dg/init/const10.C: New.
+       PR c++/52369
+       * g++.dg/init/const10.C: New.
        * g++.dg/init/const11.C: New.
        * g++.dg/init/pr25811.C: Adjust.
        * g++.dg/init/pr29043.C: Likewise.
diff --git a/gcc/testsuite/gfortran.dg/finalize_24.f90 b/gcc/testsuite/gfortran.dg/finalize_24.f90
new file mode 100644 (file)
index 0000000..2a21858
--- /dev/null
@@ -0,0 +1,28 @@
+! { dg-do compile }
+!
+! PR fortran/58880
+!
+! Contributed by Andrew Benson
+!
+
+module gn
+  type sl
+     integer, allocatable, dimension(:) :: lv
+   contains
+     final :: sld
+  end type sl
+  type :: nde
+     type(sl) :: r
+  end type nde
+contains
+  subroutine ndm(s)
+    type(nde), intent(inout) :: s
+    type(nde)                :: i    
+    i=s
+  end subroutine ndm
+  subroutine sld(s)
+    implicit none
+    type(sl), intent(inout) :: s
+    return
+  end subroutine sld
+end module gn