| Submitter | Tobias Burnus |
|---|---|
| Date | Jan. 31, 2012, 10:22 p.m. |
| Message ID | <4F2869A9.8000107@net-b.de> |
| Download | mbox | patch |
| Permalink | /patch/138870/ |
| State | New |
| Headers | show |
Comments
On 31.01.2012 23:22, Tobias Burnus wrote: > Dear all, > > I have no idea about the scalarizer, but the attached patch fixes the > test case and somehow adding an array ref to a scalar looks odd to me ... > ?? The condition is about an array without array ref, isn't it? We can't access the "array" part of the "data" union without checking before that it is an array. To be clear the added if branch is there to catch temporaries created by the trans-stmt.c part of the regressing patch. Those had no array ref, but gfc_conv_variable (they are temporaries for variables) expects one. I thought I would have to revert the trans-expr.c part and try to detect temporaries somewhere else, but it seems your patch would do just fine. > (Before the regression-causing patch, only the "else" branch existed.) > > Build and regtested on x86-64-linux. > OK for the trunk? > OK, and thanks for it. Mikael PS: gfc_conv_derived_to_class has only the "else" branch, but has to handle elementals too; I wouldn't be surprised if there was a problem with it.
Patch
2012-01-31 Tobias Burnus PR fortran/52059 * trans-expr.c (gfc_conv_procedure_call): Add array ref only to variables. 2012-01-31 Tobias Burnus PR fortran/52059 * gfortran.dg/elemental_function_1.f90: New. Index: gcc/fortran/trans-expr.c =================================================================== --- gcc/fortran/trans-expr.c (Revision 183775) +++ gcc/fortran/trans-expr.c @@ -3519,21 +3519,21 @@ gfc_conv_procedure_call (gfc_se * se, gf CLASS object. */ gfc_init_se (&parmse, se); gfc_conv_derived_to_class (&parmse, e, fsym->ts); } else if (se->ss && se->ss->info->useflags) { /* An elemental function inside a scalarized loop. */ gfc_init_se (&parmse, se); parm_kind = ELEMENTAL; - if (se->ss->dimen > 0 + if (se->ss->dimen > 0 && e->expr_type == EXPR_VARIABLE && se->ss->info->data.array.ref == NULL) { gfc_conv_tmp_array_ref (&parmse); if (e->ts.type == BT_CHARACTER) gfc_conv_string_parameter (&parmse); else parmse.expr = gfc_build_addr_expr (NULL_TREE, parmse.expr); } else gfc_conv_expr_reference (&parmse, e); Index: gcc/testsuite/gfortran.dg/elemental_function_1.f90 =================================================================== --- gcc/testsuite/gfortran.dg/elemental_function_1.f90 (Revision 0) +++ gcc/testsuite/gfortran.dg/elemental_function_1.f90 @@ -0,0 +1,22 @@ +! { dg-do compile } +! +! PR fortran/52059 +! +! + +subroutine baz + real(kind=8) :: a(99), b + interface bar + function bar (x, y) + integer, intent(in) :: x, y + real(kind=8), dimension((y-x)) :: bar + end function bar + end interface + b = 1.0_8 + a = foo (bar(0,35) / dble(34), b) +contains + elemental real(kind=8) function foo(x, y) + real(kind=8), intent(in) :: x, y + foo = 1 + end function foo +end subroutine baz