[libcxx-commits] [libcxx] [libc++] Add test to ensure that the mangling of types stays the same (PR #143556)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jun 12 08:06:56 PDT 2025
================
@@ -0,0 +1,72 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// We're using `std::from_chars` in this test
+// UNSUPPORTED: c++03, c++11, c++14
+
+// Make sure that the mangling of our public types stays the same
+
+#include <cassert>
+#include <charconv>
+#include <iostream>
+#include <map>
+#include <typeinfo>
+#include <string_view>
+
+template <class>
+struct mangling {};
+
+struct test_struct {};
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+struct ns_mangling {};
+_LIBCPP_END_NAMESPACE_STD
+
+namespace std::__name {
+struct ns_mangling {};
+} // namespace std::__name
+
+namespace std::__long_name_to_make_sure_multiple_digits_work {
+struct ns_mangling {};
+} // namespace std::__long_name_to_make_sure_multiple_digits_work
+
+std::string get_std_inline_namespace_mangling(const std::type_info& info) {
+ std::string name = info.name();
+ assert(name.starts_with("NSt"));
+ unsigned name_len;
+ auto res = std::from_chars(name.data() + 3, name.data() + name.size(), name_len);
+ assert(res.ec == std::errc{});
+ return std::move(name).substr(0, (res.ptr + name_len) - name.data());
+}
+
+void expect_mangling(const std::type_info& info, std::string expected_name) {
+ if (expected_name != info.name())
+ std::__libcpp_verbose_abort("Expected: '%s'\n Got: '%s'\n", expected_name.c_str(), info.name());
+}
+
+#define EXPECT_MANGLING(expected_mangling, ...) expect_mangling(typeid(__VA_ARGS__), expected_mangling)
+
+// Mangling names are really long, but splitting it up into multiple lines doesn't make it any more readable
+// clang-format off
+int main(int, char**) {
+ // self-test inline namespace recovery
+ assert(get_std_inline_namespace_mangling(typeid(std::__name::ns_mangling)) == "NSt6__name");
+ assert(get_std_inline_namespace_mangling(typeid(std::__long_name_to_make_sure_multiple_digits_work::ns_mangling)) == "NSt45__long_name_to_make_sure_multiple_digits_work");
+
+ // selftest
+ EXPECT_MANGLING("11test_struct", test_struct);
+
+ std::string ns_std = get_std_inline_namespace_mangling(typeid(std::ns_mangling));
+
+ // std::map
----------------
philnik777 wrote:
At some point I'd like to add an automated test, yes. I'm not quite sure how to do that yet though.
For now my plan is to just pin down manglings where we think it's easy to mess up. I don't expect we'd miss a mangling change in most places, so I don't think it makes a ton of sense to add stuff like `vector::iterator`.
https://github.com/llvm/llvm-project/pull/143556
More information about the libcxx-commits
mailing list