diff mbox series

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

Message ID 20240614145628.1366316-1-jwakely@redhat.com
State New
Headers show
Series [committed] libstdc++: Make std::type_info::operator== always_inline for C++23 [PR110572] | expand

Commit Message

Jonathan Wakely June 14, 2024, 2:54 p.m. UTC
Tested x86_64-linux, and lightly tested on x86_64-w64-mingw32 too, where
it fixes the linker error.

Pushed to trunk. Backports needed for 12, 13 and 14.

-- >8 --

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.
---
 libstdc++-v3/libsupc++/typeinfo                       |  3 +++
 libstdc++-v3/testsuite/18_support/type_info/110572.cc | 11 +++++++++++
 2 files changed, 14 insertions(+)
 create mode 100644 libstdc++-v3/testsuite/18_support/type_info/110572.cc
diff mbox series

Patch

diff --git a/libstdc++-v3/libsupc++/typeinfo b/libstdc++-v3/libsupc++/typeinfo
index fcc3077d060..35e72bb18ee 100644
--- a/libstdc++-v3/libsupc++/typeinfo
+++ b/libstdc++-v3/libsupc++/typeinfo
@@ -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
   {
diff --git a/libstdc++-v3/testsuite/18_support/type_info/110572.cc b/libstdc++-v3/testsuite/18_support/type_info/110572.cc
new file mode 100644
index 00000000000..64081879b77
--- /dev/null
+++ b/libstdc++-v3/testsuite/18_support/type_info/110572.cc
@@ -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);
+}