g++.old-deja/g++.mike/p7325.C - suspected bogus test case
Jim Wilson
wilson@specifixinc.com
Tue Jun 29 18:30:00 GMT 2004
Ian Lance Taylor wrote:
> For example, here is a quickie test for whether arrays declared in
> different blocks overlap. This test appears to currently always fail.
See bug #9997 which has a 4 line patch (only two lines of actual code)
that fixes this. It just needs someone to test the patch. This is in
my backlog of stuff to look at some day, but it is probably faster if
someone else does it.
This patch does not work for Ian's testcase because of a technicality.
We call expand_expr with ignore==1 and target==const0_rtx, which
eventually calls expand_builtin, which calls expand_builtin_memset,
which returns a value even though we clearly said we didn't want one.
Since we have a return value, the stack temporaries code gets confused
and thinks we have a ({ }) construct instead of a { } construct, and
that we might have a return value that refers to the array, so we need
to keep it live past the end of the imaginary ({ }) construct. This
shouldn't be hard to fix. We just need to make sure expand_builtin does
not return a value when it isn't supposed to. It looks like this
problem has been around for a very long time. gcc-2.0 appears to have
the same problem, just from looking at the source code.
I don't know if either of these effects the p7325.C testcase. I didn't
check.
By the way, if p7325.C uses TARGET_EXPR, then that could be why it is
broken. There have been a number of changes to the lifetimes of stack
slots generated for TARGET_EXPRs, including one Ulrich Wiegand made a
couple of months ago.
--
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com
More information about the Gcc
mailing list