]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2011-01-31 Janus Weil <janus@gcc.gnu.org>
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Jan 2011 22:51:59 +0000 (22:51 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Jan 2011 22:51:59 +0000 (22:51 +0000)
PR fortran/47455
* trans-expr.c (gfc_conv_procedure_call): Handle procedure pointers
with pointer or allocatable result.

2011-01-31  Janus Weil  <janus@gcc.gnu.org>

PR fortran/47455
* gfortran.dg/typebound_call_19.f03: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169455 138bc75d-0d04-0410-961f-82ee72b054a4

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

index ae08fdc6a87996795ffc78c7d4736d6b755e3a18..e05645d14afcd9e365a48f8a094925f802845924 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-31  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/47455
+       * trans-expr.c (gfc_conv_procedure_call): Handle procedure pointers
+       with pointer or allocatable result.
+
 2011-01-31  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/47519
index 96828020689c7377b31a3a9b7c22d47c7da5ef75..b5b6d614984878210ffdaebb4c810c40bc4356dc 100644 (file)
@@ -3606,10 +3606,9 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
         x = f()
      where f is pointer valued, we have to dereference the result.  */
   if (!se->want_pointer && !byref
-      && (sym->attr.pointer || sym->attr.allocatable)
-      && !gfc_is_proc_ptr_comp (expr, NULL))
-    se->expr = build_fold_indirect_ref_loc (input_location,
-                                       se->expr);
+      && ((!comp && (sym->attr.pointer || sym->attr.allocatable))
+         || (comp && (comp->attr.pointer || comp->attr.allocatable))))
+    se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
 
   /* f2c calling conventions require a scalar default real function to
      return a double precision result.  Convert this back to default
index 7d22d04e6e8d2606aabdede9d192a4438f774e6d..17bb107bfe1ac9b520a45f820fab8f2d33278372 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-31  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/47455
+       * gfortran.dg/typebound_call_19.f03: New.
+
 2011-01-31  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/47416
diff --git a/gcc/testsuite/gfortran.dg/typebound_call_19.f03 b/gcc/testsuite/gfortran.dg/typebound_call_19.f03
new file mode 100644 (file)
index 0000000..95b272a
--- /dev/null
@@ -0,0 +1,51 @@
+! { dg-do run }
+!
+! PR 47455: [4.6 Regression][OOP] internal compiler error: in fold_convert_loc, at fold-const.c:2028
+!
+! Contributed by Thomas Henlich <thenlich@users.sourceforge.net>
+
+module class_t
+  type :: tx
+    integer :: i
+  end type
+  type :: t
+    type(tx) :: x
+    procedure(find_x), pointer :: ppc
+  contains
+    procedure :: find_x
+  end type
+  type(tx), target :: zero = tx(0)
+contains
+  function find_x(this)
+    class(t), intent(in) :: this
+    type(tx), pointer :: find_x
+    find_x => zero
+  end function find_x
+end module
+
+program test
+  use class_t
+  class(t),allocatable :: this
+  procedure(find_x), pointer :: pp
+  allocate(this)
+  ! (1) ordinary function call
+  zero = tx(1)
+  this%x = find_x(this)
+  if (this%x%i /= 1) call abort()
+  ! (2) procedure pointer
+  zero = tx(2)
+  pp => find_x
+  this%x = pp(this)
+  if (this%x%i /= 2) call abort()
+  ! (3) PPC
+  zero = tx(3)
+  this%ppc => find_x
+  this%x = this%ppc()
+  if (this%x%i /= 3) call abort()
+   ! (4) TBP
+  zero = tx(4)
+  this%x = this%find_x()
+  if (this%x%i /= 4) call abort()
+end
+
+! { dg-final { cleanup-modules "class_t" } }