Bug 43843

Summary: Wrong-code due to missing temporary with user-defined operatator
Product: gcc Reporter: Tobias Burnus <burnus>
Component: fortranAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED DUPLICATE    
Severity: normal CC: burnus, gcc-bugs, pault
Priority: P3 Keywords: wrong-code
Version: 4.5.0   
Target Milestone: ---   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed:

Description Tobias Burnus 2010-04-21 21:23:30 UTC
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
Comment 1 Dominique d'Humieres 2010-04-21 21:49:34 UTC
It looks like a duplicate of PR 43841.
Comment 2 Daniel Franke 2010-04-22 08:25:29 UTC

*** This bug has been marked as a duplicate of 43841 ***
Comment 3 Paul Thomas 2010-04-24 09:28:58 UTC
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

Comment 4 Paul Thomas 2010-06-27 16:15:15 UTC
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

Comment 5 Paul Thomas 2010-06-27 16:22:43 UTC
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