V3 patch causes EH failures in ILP32 mode
Mark Mitchell
mark@codesourcery.com
Wed Jun 23 18:33:00 GMT 2004
B. Kosnik wrote:
>>you added seemingly pointless implementations of __upcast_result's
>>copy constructor and assignment operator; these versions are almost
>>identical to the implicit definitions. On HP-UX in ILP32 mode, this
>>change is causing several G++ testsuite failures relating to upcasts
>>during EH processing.
>
>
> Wow.
>
> Well, I added these so that -Weffc++ could be used in CXXFLAGS while
> building libstdc++. This was a longstanding issue w/ v3 that was an
> annoyance to several C++ maintainers (myself included, naturally!).
Ugh. Do you really think this kind of change is worth it? I'm all for
Scott Meyers, but now every time we add a data member we've got to
remember to update these functions...
> I wasn't expecting any issues like this to surface.
It seems to be an interaction between the explicit test in the "operator
=" (which, as you note, is the major difference from what the compiler
does) and the use of "__restrict" in several places in that file.
(Removing either one makes the problem go away.)
This does show, however, how little clean-ups can have serious
repurcussions. It's good we're finding the codegen bug, but it may or
not be worth the effort; the codegen bug is probably pretty rare, and EH
is now pretty much busted on this platform, which is going to affect
lots of programs.
> Just out of curiosity, can't you also change this (AFAICT) textbook C++
> to something that doesn't check for self, and produce equivalent code to
> the implicitly generated functions? If not, is there a way to produce
> equivalent code with explicit definitions? I'm surprised that there's
> such a difference: can you humor me with additional details?
The other difference is that the compiler may use a bitwise copy in many
situations. (It certainly could in this case, although I don't know if
it actually does.) By writing things out explicitly, you're going to
make the compiler work hard to figure out that the various reads/writes
are all contiguous and that any padding in-between can be safely copied
as well.
Also, the test -- the "this != &r" bit -- is not necessary for
correctness for this class and is always satisfied; there is exactly one
use of this operator and it does not copy between things which have the
same address. That will therefore be a pessimization, unless the
compiler can figure out that the test is redundant.
I would advise against making these kinds of functions explicit, except
when necessary.
--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
More information about the Gcc
mailing list