https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113208
--- Comment #29 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Looking at t1 (i.e. the reduced testcase with constexpr), the difference with -std=c++20 -O1 -fkeep-inline-functions is that in r14-5978 we used to emit _ZN6vectorI12QualityValueEC2ERKS1_ in _ZN6vectorI12QualityValueEC5ERKS1_ comdat section and _ZN6vectorI12QualityValueEC1ERKS1_ as an alias to it (i.e. the r0-97383-g24b3ff2c53806d3d optimization), while with r14-5979 we don't optimize it any longer, i.e. emit _ZN6vectorI12QualityValueEC2ERKS1_ in _ZN6vectorI12QualityValueEC2ERKS1_ comdat and _ZN6vectorI12QualityValueEC2ERKS1_ in _ZN6vectorI12QualityValueEC2ERKS1_ comdat. I thought that ought to be ABI compatible (the latter is what we used to emit before r0-97383), all the involved symbols are weak and either linker keeps the pair of symbols with the _ZN6vectorI12QualityValueEC5ERKS1_ comdat, or one or both of the _ZN6vectorI12QualityValueEC[12]ERKS1_ comdats (depending on if just one or both of those symbols are used), or it keeps all of them and the linker chooses between the 2 symbol definitions one that is actually used. Of course, I'd like to understand why Marek's patch changed the behavior.