https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105600
--- Comment #9 from Martin Liška <marxin at gcc dot gnu.org> --- So what happens in WPA: 1) we read IPA ICF summary and the variable has definition: (gdb) p vnode->debug() _ZN8nlohmann6detail12static_constINS0_10to_json_fnEE5valueE/10 (value) @0x7ffff7fb3200 Type: variable definition analyzed Visibility: externally_visible semantic_interposition preempted_reg public weak comdat comdat_group:_ZN8nlohmann6detail12static_constINS0_10to_json_fnEE5valueE one_only References: Referring: _Z7to_jsonRN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmiSaNS_14adl_serializerES2_IhSaIhEEEERK8Settings/1 (addr) _Z7to_jsonRN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmiSaNS_14adl_serializerES2_IhSaIhEEEERK8Settings/1 (addr) Read from file: a.o Availability: not-ready Varpool flags: initialized read-only const-value-known $1 = void 2) the symbols is removed in unreachable nodes: #0 symbol_table::remove_unreachable_nodes (this=<optimized out>, file=<optimized out>) at /home/marxin/Programming/gcc/gcc/ipa.cc:639 #1 0x00000000008e1277 in read_cgraph_and_symbols (nfiles=<optimized out>, fnames=<optimized out>) at /home/marxin/Programming/gcc/gcc/lto/lto-common.cc:2959 #2 0x00000000008c7540 in lto_main () at /home/marxin/Programming/gcc/gcc/lto/lto.cc:626 #3 0x0000000000e229d4 in compile_file () at /home/marxin/Programming/gcc/gcc/toplev.cc:452 #4 0x00000000008a0822 in do_compile (no_backend=false) at /home/marxin/Programming/gcc/gcc/toplev.cc:2144 #5 toplev::main (this=this@entry=0x7fffffffd93e, argc=<optimized out>, argc@entry=17, argv=<optimized out>, argv@entry=0x7fffffffda68) at /home/marxin/Programming/gcc/gcc/toplev.cc:2296 #6 0x00000000008a1f32 in main (argc=17, argv=0x7fffffffda68) at /home/marxin/Programming/gcc/gcc/main.cc:39 3) IPA ICF loads the body: (gdb) p item->node->debug() _ZN8nlohmann6detail12static_constINS0_10to_json_fnEE5valueE/10 (value) @0x7ffff7fb3200 Type: variable Body removed by symtab_remove_unreachable_nodes Visibility: externally_visible semantic_interposition preempted_reg external public weak comdat comdat_group:_ZN8nlohmann6detail12static_constINS0_10to_json_fnEE5valueE one_only References: Referring: _Z7to_jsonRN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmiSaNS_14adl_serializerES2_IhSaIhEEEERK8Settings/1 (addr) _Z7to_jsonRN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmiSaNS_14adl_serializerES2_IhSaIhEEEERK8Settings/1 (addr) Read from file: a.o Availability: not_available Varpool flags: initialized read-only $8 = void So we need to filter our such symbols.