re PR fortran/17740 (ICE in gfc_trans_arrayfunc_assign, at fortran/trans-expr.c:2011)
authorErik Edelmann <erik.edelmann@iki.fi>
Tue, 13 Sep 2005 21:46:04 +0000 (00:46 +0300)
committerTobias Schlüter <tobi@gcc.gnu.org>
Tue, 13 Sep 2005 21:46:04 +0000 (23:46 +0200)
2005-09-13  Erik Edelmann  <erik.edelmann@iki.fi>
fortran/
PR fortran/17740
* trans-expr.c (gfc_trans_arrayfunc_assign): Check value
of attr.elemental for specific function instead of generic name.
testsuite/
PR fortran/17740
* gfortran.dg/generic_4.f90: New test.

From-SVN: r104240

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

index 9ccd866fdfd7d8e86acd08dcbc641752ffaa86c1..9bde936ebc842f89bee0e03c3ddef1d1d15ca716 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-13  Erik Edelmann  <erik.edelmann@iki.fi>
+
+       PR fortran/17740
+       * trans-expr.c (gfc_trans_arrayfunc_assign): Check value
+       of attr.elemental for specific function instead of generic name.
+
 2005-09-13  Richard Sandiford  <richard@codesourcery.com>
 
        PR fortran/18899
index fce8e7b614e8650a46a329238af22043c8dd0263..913f7e659191fd952cb4e5c38fc70b1b4aebc4e8 100644 (file)
@@ -2573,7 +2573,8 @@ gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
     return NULL;
 
   /* Elemental functions don't need a temporary anyway.  */
-  if (expr2->symtree->n.sym->attr.elemental)
+  if (expr2->value.function.esym != NULL
+      && expr2->value.function.esym->attr.elemental)
     return NULL;
 
   /* Fail if EXPR1 can't be expressed as a descriptor.  */
index c192765cdd866423556ada8563bf026ca858a02c..512fccbe4ebb12998d6ccb192b9e681546eefd0a 100644 (file)
@@ -1,3 +1,8 @@
+2005-09-13  Erik Edelmann  <erik.edelmann@iki.fi>
+
+       PR fortran/17740
+       * gfortran.dg/generic_4.f90: New test.
+
 2005-09-13  Bastian Blank <waldi@debian.org>
 
        PR c++/16171
diff --git a/gcc/testsuite/gfortran.dg/generic_4.f90 b/gcc/testsuite/gfortran.dg/generic_4.f90
new file mode 100644 (file)
index 0000000..62bc569
--- /dev/null
@@ -0,0 +1,28 @@
+! { dg-do run }
+! reduced testcase from PR 17740
+module FOO
+
+  interface BAR
+     module procedure BAR2
+  end interface
+
+contains
+
+  elemental integer function BAR2(X)
+    integer, intent(in) :: X
+    BAR2 = X
+  end function
+
+  subroutine BAZ(y,z)
+    integer :: Y(3), Z(3)
+    Z = BAR(Y)
+  end subroutine
+
+end module
+
+use foo
+integer :: y(3), z(3)
+y = (/1,2,3/)
+call baz(y,z)
+if (any (y /= z)) call abort ()
+end