------- Comment #4 from jakub at gcc dot gnu dot org  2010-09-07 08:05 -------
This isn't specific to Fortran,
struct S { int a; };

struct S foo (struct S *arg)
  struct S s;
  if (bar ())
    baz ("not valid");
    s = *arg;
  return s;

has the exactly same difference.
I believe this is caused by ESRA or gimplification.  In *.ealias we have:
<bb 5>:
  [pr25923.f90 : 22:0] D.1570 = res;
  return D.1570;
and in *.esra this is:
<bb 5>:
  # res$yr_9 = PHI <res$yr_8(D)(3), [pr25923.f90 : 20:0] res$yr_3(4)>
  [pr25923.f90 : 22:0] SR.2_10 = res$yr_9;
  D.1570.yr = SR.2_10;
  return D.1570;

Note no locus on D.1570.yr = SR.2_10; assignment.  The question is if ESRA just
forgots to set the locus, or if it sets it from the following stmt
(GIMPLE_RETURN).  If the former, then it would just be a SRA bug, if the
then the question is why don't we set location on GIMPLE_RETURN.
Note that on the C testcase there apparently is locus on GIMPLE_RETURN between
gimplification and gimple lowering (where the locus on it is lost).
On the Fortran testcase in *.gimple the locus is strange:
  [pr25923.f90 : 22:0] D.1570 = res;
  [pr25923.f90 : 13:0] return D.1570;
Line 22 is the END FUNCTION line, line 13 is the FUNCTION line.  For C it is
obvious where it wants to report the return, for Fortran, given that it doesn't
have any kind of RETURN statement, I guess either of the locations is fine, but
we should be consistent.


jakub at gcc dot gnu dot org changed:

           What    |Removed                     |Added
                 CC|                            |jamborm at gcc dot gnu dot
                   |                            |org


Reply via email to