Reported by Kyle Horne at http://gcc.gnu.org/ml/fortran/2010-04/msg00215.html There is a missing temporary for user-defined operators: type(polar_t),dimension(3)::b b = polar_t(1.0,0.5) b(:) = b(:)/b(1) The latter is translated into: struct polar_t * D.1551; D.1551 = &b[0]; S.5 = 1; while (1) { if (S.5 > 3) goto L.3; b[S.5 + -1] = div_pp (&b[S.5 + -1], D.1551); S.5 = S.5 + 1; } L.3:; but that fails as one overrides *D.1551 alias b[0] alias B(1) in the first iteration instead of evaluating first all of the RHS before assigning to the LHS. Work with ifort and NAG, fails with GCC 4.1, 4.2, 4.3, 4.4, 4.5, and 4.6
It looks like a duplicate of PR 43841.
*** This bug has been marked as a duplicate of 43841 ***
Subject: Bug 43843 Author: pault Date: Sat Apr 24 09:28:32 2010 New Revision: 158683 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=158683 Log: 2010-04-24 Paul Thomas <pault@gcc.gnu.org> PR fortran/43841 PR fortran/43843 * trans-expr.c (gfc_conv_expr): Supply an address expression for GFC_SS_REFERENCE. (gfc_conv_expr_reference): Call gfc_conv_expr and return for GFC_SS_REFERENCE. * trans-array.c (gfc_add_loop_ss_code): Store the value rather than the address of a GFC_SS_REFERENCE. * trans.h : Change comment on GFC_SS_REFERENCE. 2010-04-24 Paul Thomas <pault@gcc.gnu.org> PR fortran/43841 PR fortran/43843 * gfortran.dg/elemental_scalar_args_1.f90 : New test. Added: trunk/gcc/testsuite/gfortran.dg/elemental_scalar_args_1.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/trans-array.c trunk/gcc/fortran/trans-expr.c trunk/gcc/fortran/trans.h trunk/gcc/testsuite/ChangeLog
Subject: Bug 43843 Author: pault Date: Sun Jun 27 16:14:55 2010 New Revision: 161471 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=161471 Log: 2010-06-27 Paul Thomas <pault@gcc.gnu.org> PR fortran/43841 PR fortran/43843 * trans-expr.c (gfc_conv_expr): Supply an address expression for GFC_SS_REFERENCE. (gfc_conv_expr_reference): Call gfc_conv_expr and return for GFC_SS_REFERENCE. * trans-array.c (gfc_add_loop_ss_code): Store the value rather than the address of a GFC_SS_REFERENCE. * trans.h : Change comment on GFC_SS_REFERENCE. 2010-06-27 Paul Thomas <pault@gcc.gnu.org> PR fortran/43841 PR fortran/43843 * gfortran.dg/elemental_scalar_args_1.f90 : New test. Added: branches/gcc-4_5-branch/gcc/testsuite/gfortran.dg/elemental_scalar_args_1.f90 Modified: branches/gcc-4_5-branch/gcc/fortran/ChangeLog branches/gcc-4_5-branch/gcc/fortran/trans-array.c branches/gcc-4_5-branch/gcc/fortran/trans-expr.c branches/gcc-4_5-branch/gcc/fortran/trans.h branches/gcc-4_5-branch/gcc/testsuite/ChangeLog
Subject: Bug 43843 Author: pault Date: Sun Jun 27 16:22:27 2010 New Revision: 161472 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=161472 Log: 2010-06-27 Paul Thomas <pault@gcc.gnu.org> PR fortran/43841 PR fortran/43843 * trans-expr.c (gfc_conv_expr): Supply an address expression for GFC_SS_REFERENCE. (gfc_conv_expr_reference): Call gfc_conv_expr and return for GFC_SS_REFERENCE. * trans-array.c (gfc_add_loop_ss_code): Store the value rather than the address of a GFC_SS_REFERENCE. * trans.h : Change comment on GFC_SS_REFERENCE. 2010-06-27 Paul Thomas <pault@gcc.gnu.org> PR fortran/43841 PR fortran/43843 * gfortran.dg/elemental_scalar_args_1.f90 : New test. Added: branches/gcc-4_4-branch/gcc/testsuite/gfortran.dg/elemental_scalar_args_1.f90 Modified: branches/gcc-4_4-branch/gcc/fortran/ChangeLog branches/gcc-4_4-branch/gcc/fortran/trans-array.c branches/gcc-4_4-branch/gcc/fortran/trans-expr.c branches/gcc-4_4-branch/gcc/fortran/trans.h branches/gcc-4_4-branch/gcc/testsuite/ChangeLog