libstdc++: Make std::type_info::operator== always_inline for C++23 [PR110572]

Commit r12-6266-g3633cc54284450 implemented P1328 for C++23, making
std::type_info::operator== usable in constant expressions. For targets
such as mingw-w64 where that function was not previously inline, making
it constexpr required making it inline for C++23 and later. For
statically linked programs this can result in multiple definition
errors, because there's a non-inline definition in libstdc++.a as well.

For those targets make it always_inline for C++23, so that there is no
symbol generated for the inline definition, and the non-inline
definition in libstdc++.a will be the only definition.

libstdc++-v3/ChangeLog:

	PR libstdc++/110572
	* libsupc++/typeinfo (type_info::operator==): Add always_inline
	attribute for targets where the ABI requries equality to be
	non-inline.
	* testsuite/18_support/type_info/110572.cc: New test.
This commit is contained in:
Jonathan Wakely 2024-06-11 15:52:30 +01:00
parent 161efd6774
commit 6af8d8e618
No known key found for this signature in database
2 changed files with 14 additions and 0 deletions

View File

@ -188,6 +188,9 @@ namespace std
#endif
#if __GXX_TYPEINFO_EQUALITY_INLINE || __cplusplus > 202002L
# if ! __GXX_TYPEINFO_EQUALITY_INLINE
[[__gnu__::__always_inline__]]
# endif
_GLIBCXX23_CONSTEXPR inline bool
type_info::operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
{

View File

@ -0,0 +1,11 @@
// { dg-options "-static-libstdc++" }
// { dg-require-static-libstdcxx }
// { dg-require-cpp-feature-test __cpp_rtti }
// { dg-do link }
#include <typeinfo>
int main()
{
return typeid(0) == typeid(0u);
}