#if __GXX_MERGED_TYPEINFO_NAMES
return name () < arg.name ();
#else
- return (name ()[0] == '*') ? name () < arg.name ()
+ /* The name() method will strip any leading '*' prefix. Therefore
+ take care to look at __name rather than name() when looking for
+ the "pointer" prefix. */
+ return (__name[0] == '*') ? name () < arg.name ()
: __builtin_strcmp (name (), arg.name ()) < 0;
#endif
}
--- /dev/null
+// { dg-do run }
+// { dg-require-sharedlib "" }
+// { dg-options "./testsuite_shared.so" }
+
+#include <typeinfo>
+#include <testsuite_hooks.h>
+
+namespace __gnu_test
+{
+namespace
+{
+ struct S { };
+ struct T { };
+}
+
+// Defined in testsuite_shared.so, referring to private type in that library
+// with the same mangled name as __gnu_test::<anonymous>::S defined here.
+extern const std::type_info& pr103240_private_S;
+}
+
+const std::type_info& private_S = __gnu_test::pr103240_private_S;
+const std::type_info& local_S = typeid(__gnu_test::S);
+const std::type_info& local_T = typeid(__gnu_test::T);
+
+int main()
+{
+ VERIFY( local_S == local_S );
+ VERIFY( ! local_S.before(local_S) );
+
+ VERIFY( local_S != local_T );
+ VERIFY( local_S.before(local_T) || local_T.before(local_S) );
+
+ VERIFY( local_S != private_S );
+ // PR libstdc++/103240
+ VERIFY( local_S.before(private_S) || private_S.before(local_S) );
+}
#include <map>
#include <ext/mt_allocator.h>
#include <bits/functexcept.h>
+#if __cpp_rtti
+# include <typeinfo>
+#endif
namespace __gnu_test
{
}
#endif
+#if __cpp_rtti
+// PR libstdc++/103240
+namespace
+{
+ struct S { };
+}
+const std::type_info& pr103240_private_S = typeid(S);
+#endif
+
} // end namepace __gnu_test