diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/generic_4.f90 | 28 |
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9ccd866..9bde936 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index fce8e7b..913f7e6 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c192765..512fccb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..62bc569 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/generic_4.f90 @@ -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 |