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 > >