From c0c07d7b821d9010b77358135290aeaa24c48c6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20Schl=C3=BCter?=
 <tobias.schlueter@physik.uni-muenchen.de>
Date: Fri, 24 Sep 2004 19:06:57 +0200
Subject: [PATCH] re PR fortran/17615 (Internal compiler error using interface
 procedures)

fortran/
PR fortran/17615
* trans-expr.c (gfc_trans_arrayfunc_assign): Look at resolved
function to determine return type.

testsuite/
PR fortran/17615
* gfortran.dg/pr17615.f90: New test.

From-SVN: r88061
---
 gcc/fortran/ChangeLog                 |  7 +++++++
 gcc/fortran/trans-expr.c              |  4 ++--
 gcc/testsuite/ChangeLog               |  5 +++++
 gcc/testsuite/gfortran.dg/pr17615.f90 | 19 +++++++++++++++++++
 4 files changed, 33 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/pr17615.f90

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index cd67054d195a..46bb7fa09822 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -3,6 +3,13 @@
 	* trans-types.c (gfc_return_by_reference): Remove superfluous
 	assertion.
 
+	* intrinsic.h (gfc_resolve_getcwd): Update prototype.
+	* iresolve.c (gfc_resolve_getcwd): Add second argument to function.
+
+	PR fortran/17615
+	* trans-expr.c (gfc_trans_arrayfunc_assign): Look at resolved
+	function to determine return type.
+	
 2004-09-20  Jan Hubicka  <jh@suse.cz>
 
 	* trans-decl.c (build_entry_thunks): Finalize the function; do not lower
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 29550b715e6a..fc5b41bf8805 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -2007,8 +2007,8 @@ gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
   /* The frontend doesn't seem to bother filling in expr->symtree for intrinsic
      functions.  */
   gcc_assert (expr2->value.function.isym
-	  || (gfc_return_by_reference (expr2->symtree->n.sym)
-	      && expr2->symtree->n.sym->result->attr.dimension));
+	      || (gfc_return_by_reference (expr2->value.function.esym)
+	      && expr2->value.function.esym->result->attr.dimension));
 
   ss = gfc_walk_expr (expr1);
   gcc_assert (ss != gfc_ss_terminator);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6b4225351b6d..2dcc996052e8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-09-24  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
+
+	PR fortran/17615
+	* gfortran.dg/pr17615.f90: New test.
+
 2004-09-24  Andrew MacLeod  <amacleod@redhat.com>
 
 	PR tree-optimzation/17517
diff --git a/gcc/testsuite/gfortran.dg/pr17615.f90 b/gcc/testsuite/gfortran.dg/pr17615.f90
new file mode 100644
index 000000000000..13b90334a7b9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr17615.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! we didn't look at the right symbol when genrating code. This broke
+! when array valued functions came into play.
+module module_vec3d
+  INTERFACE cross_product
+     MODULE PROCEDURE cross_product3_R4_R8
+  END INTERFACE
+CONTAINS
+  FUNCTION cross_product3_R4_R8 ()
+    real(8) :: cross_product3_r4_r8(3)
+    cross_product3_r4_r8 = 0
+  END FUNCTION cross_product3_R4_R8
+END MODULE module_vec3d
+
+PROGRAM TEST
+  use module_vec3d, only: cross_product
+  real(8) :: c(3)
+  c = cross_product()
+END PROGRAM TEST
-- 
GitLab