Skip to content
Snippets Groups Projects
Unverified Commit 6af8d8e6 authored by Jonathan Wakely's avatar Jonathan Wakely
Browse files

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.
parent 161efd67
No related branches found
No related tags found
No related merge requests found
...@@ -188,6 +188,9 @@ namespace std ...@@ -188,6 +188,9 @@ namespace std
#endif #endif
#if __GXX_TYPEINFO_EQUALITY_INLINE || __cplusplus > 202002L #if __GXX_TYPEINFO_EQUALITY_INLINE || __cplusplus > 202002L
# if ! __GXX_TYPEINFO_EQUALITY_INLINE
[[__gnu__::__always_inline__]]
# endif
_GLIBCXX23_CONSTEXPR inline bool _GLIBCXX23_CONSTEXPR inline bool
type_info::operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT type_info::operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
{ {
......
// { 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);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment