Dealing with C++98/11 ABI incompatibilities

Jason Merrill jason@redhat.com
Wed Oct 31 20:10:00 GMT 2012


On 07/03/2012 03:18 PM, Jason Merrill wrote:
> 2) Object layout changes to std::list and std::basic_string.  For these
> types, there is no way to both retain backward compatibility with older
> C++98 code and conform to the C++11 standard.  The best we can hope for
> is to allow old code to coexist with new code so long as they don't try
> to touch the same string/list objects.
>
> As above, one solution to this would be to change the linkage name of
> the new versions so that they don't clash with the old versions.  But
> that isn't enough in this case, as it wouldn't affect the linkage name
> of a class like
>
> struct Wrap { std::string s; };
>
> so we would need some way to cause the name decoration to propagate to
> other containing/derived classes.

I raised this issue on the ABI list, and someone pointed out to me that 
incomplete classes make quiet propagation impossible; any full 
coexistence solution will require changes to affected user types.  There 
seem to be two options:

1) No propagation, add a warning to suggest that users decorate their 
types appropriately.
2) Propagate to class definitions, give an error if there was an earlier 
forward declaration without the appropriate tag.

I lean toward #1; people who rebuild everything regularly won't be 
affected by it, and people who need coexistence can use the warning flag 
to help them adjust.

Jason



More information about the Gcc mailing list