On Wed, 6 Mar 2024, Jason Merrill wrote:

> On 3/6/24 14:10, Patrick Palka wrote:
> > Tested on x86_64-pc-linux-gnu, does this look OK for trunk?
> > 
> > -- >8 --
> > 
> > The unreduced testcase from this PR crashes at runtime ultimately
> > because we don't stream the abi_tag attribute on inline namespaces and
> > so the filesystem::current_path() call resolves to the non-C++11 ABI
> > version even though the C++11 ABI is active, leading to a crash when
> > destructing the call result (which contains an std::string member).
> > 
> > While we do stream the DECL_ATTRIBUTES of all decls that go through
> > the generic tree streaming routines, it seems namespaces are streamed
> > separately from other decls and we don't use the generic routines for
> > them.  So this patch makes us stream the abi_tag manually for (inline)
> > namespaces.
> 
> Why not stream all DECL_ATTRIBUTES of all namespaces?

AFAICT abi_tag and deprecated are the only attributes that we recognize
on a namespace, and for deprecated it should suffice to stream the
TREE_DEPRECATED flag instead of the actual attribute, so hardcoding
abi_tag streaming seems convenient.

If we wanted to stream all DECL_ATTRIBUTES of a namespace then we'd have
to assume up front what kind of tree arguments of the attributes can be,
e.g. an INTEGER_CST or a STRING_CST etc and implement streaming of these
trees within the bytes_in/out base classes instead of trees_in/out (we
only have access to a bytes_in/out object from read/write_namespaces).
I'm not sure that's worth it unless there's other namespace attributes
we want to stream?

> 
> Jason
> 
> 

Reply via email to