https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99479
Patrick Palka <ppalka at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ppalka at gcc dot gnu.org --- Comment #20 from Patrick Palka <ppalka at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #19) > Created attachment 52106 [details] > reduced testcase > > Not even though it says PR 100129, this is the reduced testcase. > just execute t.sh which does: > gcc header.hh -std=c++20 -fmodules-ts > gcc t.cc -std=c++20 -fmodules-ts -wrapper valgrind,--error-exitcode=1 > > And you will see the valgrind failures. Looks like name_lookup::search_unqualified uses a static vector under the assumption that the function isn't recursive: /* Make static to avoid continual reallocation. We're not recursive. */ static using_queue *queue = NULL; but with modules, this assumption appears to be untrue: #0 name_lookup::search_unqualified (this=0x7fffffffcde0, scope=<namespace_decl 0x7ffff7263098 std>, level=0x7ffff73ba048) at /home/patrick/code/gcc/gcc/cp/name-lookup.cc:1133 #1 0x0000000000aa33f5 in lookup_name (name=name@entry=<identifier_node 0x7ffff7261980 operator delete>, where=<optimized out>, where@entry=LOOK_where::BLOCK_NAMESPACE, want=want@entry=LOOK_want::NORMAL) at /home/patrick/code/gcc/gcc/cp/name-lookup.cc:7736 #2 0x00000000009492be in build_op_delete_call (code=code@entry=DELETE_EXPR, addr=<parm_decl 0x7ffff7fc5180 this>, size=<integer_cst 0x7ffff73b9150>, global_p=global_p@entry=false, placement=placement@entry=<tree 0x0>, alloc_fn=alloc_fn@entry=<tree 0x0>, complain=3) at /home/patrick/code/gcc/gcc/cp/call.cc:7264 #3 0x0000000000aa9e63 in build_delete_destructor_body (delete_dtor=<function_decl 0x7ffff7399800 __dt_del >, complete_dtor=<function_decl 0x7ffff7399900 __dt_comp >) at /home/patrick/code/gcc/gcc/cp/optimize.cc:139 #4 0x0000000000aab5f9 in maybe_clone_body (fn=fn@entry=<function_decl 0x7ffff7399700 __dt >) at /home/patrick/code/gcc/gcc/cp/optimize.cc:592 #5 0x0000000000a678f8 in post_load_processing () at /home/patrick/code/gcc/gcc/cp/module.cc:17185 #6 0x0000000000a8e61a in lazy_load_binding (mod=<optimized out>, ns=ns@entry=<namespace_decl 0x7ffff7263098 std>, id=<identifier_node 0x7ffff7260b40 atomic>, mslot=mslot@entry=0x7ffff73a9d30) at /home/patrick/code/gcc/gcc/cp/module.cc:18792 #7 0x0000000000aa000f in name_lookup::search_namespace_only (this=0x7fffffffd210, scope=<namespace_decl 0x7ffff7263098 std>) at /home/patrick/code/gcc/gcc/cp/name-lookup.cc:927 #8 0x0000000000aa165c in name_lookup::search_unqualified (this=0x7fffffffd210, scope=<namespace_decl 0x7ffff7263098 std>, level=<optimized out>) at /home/patrick/code/gcc/gcc/cp/name-lookup.cc:1155 ... Using a non-static vector fixes the valgrind error. Is this a fix that's worth applying at this point?