Hello,

the uninit-13.c testcase fails on s390 and s390x:

1 /* { dg-do compile } */
2 /* { dg-options "-O -Wuninitialized" } */
3
4 typedef _Complex float C;
5 C foo()
6 {
7   C f;
8   __imag__ f = 0;     /* { dg-warning "is used" "unconditional" } */
9   return f;
10 }

On s390 and s390x the reported line number in the warning is 7 which
is indeed a bit surprising.  But anyway also the expected line number
of the warning does not look correct to me.  The "uninitialized use"
of the real part of f is done in line 9 so I'm a bit surprised that we
expect the warning to be issued for line 8?  I think the dg-warning
directive should be moved one line downwards.

But S/390 reveals another problem here since we do not return complex
numbers in registers.  Therefore aggregate_value_p in
gimplify_return_expr returns true and an additional copy statement for
the result is generated:

foo ()
[uninit-13.c : 10] {
  float D.1203;
  C f;

  [uninit-13.c : 8] D.1203 = REALPART_EXPR <f>;
  [uninit-13.c : 8] f = COMPLEX_EXPR <D.1203, 0.0>;
  [uninit-13.c : 9] <retval> = f;
  [uninit-13.c : 9] return <retval>;
}

The <retval> = f; statement is then lowered by tree-complex to:

foo ()
{
  float f$real;
  C f;
  float D.1203;

<bb 2>:
  [uninit-13.c : 8] f$real_2 = f$real_6(D);
  [uninit-13.c : 8] f_3 = COMPLEX_EXPR <f$real_2, 0.0>;
  REALPART_EXPR <<retval>> = f$real_2;
  [uninit-13.c : 9] IMAGPART_EXPR <<retval>> = 0.0;
  return <retval>;

}

Note that the write to the imaginary part is assigned to a different
source code location. expand_complex_move in tree-complex.c issues the
real part move before the original statement but re-uses the original
statement for the move of the imaginary part.

Replacing __imag__ with __real__ in the testcase causes a warning to
be issued for line 9 instead of 7.  So I can hit the two lines
surrounding the expected line :)

Should we do something about this for GCC 4.3 or just XFAIL the
testcases for s390 and s390x?

Bye,

-Andreas-

Reply via email to