https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85222

--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to rguent...@suse.de from comment #5)
> On Thu, 5 Apr 2018, redi at gcc dot gnu.org wrote:
> 
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85222
> > 
> > --- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
> > (In reply to Richard Biener from comment #3)
> > > Do you know of any other exception type affected by the c++11 vs. old ABI
> > > issue or does the entire I/O hierarchy only ever throw exactly
> > > ios_base::failure?
> > 
> > That's the only one.
> > 
> > > So a workaround would be to marshal these somehow in the C++ EH 
> > > personality
> > > routine?  The c++11 variant seems to be a superset feature-wise (apart 
> > > from
> > > the changed inheritance), so constructing (in-place?!) the c++98 variant
> > > once we hit a filter for c++98 ios_base::failure with an EH object of
> > > type ios_base::failure[c++11] would "work"?
> > 
> > Until you try to rethrow it and catch it as the new type again.
> 
> Ok, but that would be an even more weird case of an intermediate
> old-ABI object sitting inbetween the c++11 throwing libstdc++ and
> a c++11 object.

Which can happen with a legacy shared library trying to catch the old
ios::failure, log something, and then re-throw it. If that shared library is
used by a program where the main() function is using the new ABI and main()
tries to catch ios::failure at the top-level, it won't be able to if the
exception was replaced by another type.

> So the old std::ios::failure doesn't fit in the new one?

It fits, but overwriting it in place can create data races and invalidate
existing references to the original object that was overwritten.

>  As said
> above I consider the re-throwing and catching as c++11 a situation
> that shouldn't be required for fixing the "legacy" binary case.

It's not required to fix the simple case of a legacy binary using a new
libstdc++.so but it breaks other cases.

Reply via email to