Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tests/tests/iconv.cpp no longer compiles with libcxx 19 #181

Open
al3xtjames opened this issue Jan 11, 2025 · 0 comments · May be fixed by #182
Open

tests/tests/iconv.cpp no longer compiles with libcxx 19 #181

al3xtjames opened this issue Jan 11, 2025 · 0 comments · May be fixed by #182

Comments

@al3xtjames
Copy link

The std::basic_string template specialization for int16_t was deprecated in libcxx 18 and removed in libcxx 19, which broke compilation of the iconv test:

FAILED: tests/gtest-main.p/tests_iconv.cpp.o
clang++ -Itests/gtest-main.p -Itests -I../tests -I../tests/support -I../libaegisub/include -I/nix/store/wa87rn29fm9crmp20n976b1cl2b3r5cd-vapoursynth-70/include/vapoursynth -I/nix/store
/7x766s543q8zsgbnqgpnl90a3bs7c508-gtest-1.15.2-dev/include -I/nix/store/b2az10j09qfkbkr98nqp3z330dqqgal1-boost-1.86.0-dev/include -fdiagnostics-color=always -D_LIBCPP_HARDENING_MODE=_L
IBCPP_HARDENING_MODE_FAST -Wall -Winvalid-pch -std=c++17 -DGL_SILENCE_DEPRECATION -DBOOST_CHRONO_STATIC_LINK=1 -DBOOST_FILESYSTEM_STATIC_LINK=1 -DBOOST_THREAD_BUILD_LIB=1 -DBOOST_THREA
D_USE_LIB=1 -DBOOST_SYSTEM_STATIC_LINK=1 -DBOOST_ALL_NO_LIB -DGTEST_HAS_PTHREAD=1 -MD -MQ tests/gtest-main.p/tests_iconv.cpp.o -MF tests/gtest-main.p/tests_iconv.cpp.o.d -o tests/gtest
-main.p/tests_iconv.cpp.o -c ../tests/tests/iconv.cpp
In file included from ../tests/tests/iconv.cpp:15:
In file included from ../libaegisub/include/libaegisub/charset_conv.h:22:
/nix/store/r3wiygrch2ynqxd8ky7hlb7wdw939cxr-libcxx-19.1.5-dev/include/c++/v1/string:820:42: error: implicit instantiation of undefined template 'std::char_traits<short>'
  820 |   static_assert(is_same<_CharT, typename traits_type::char_type>::value,
      |                                          ^
../tests/tests/iconv.cpp:45:30: note: in instantiation of template class 'std::basic_string<short>' requested here
   45 |                 std::basic_string<int16_t> str(i, ' ');
      |                                            ^
/nix/store/r3wiygrch2ynqxd8ky7hlb7wdw939cxr-libcxx-19.1.5-dev/include/c++/v1/__fwd/string.h:23:29: note: template is declared here
   23 | struct _LIBCPP_TEMPLATE_VIS char_traits;
      |                             ^

I worked around this by using char16_t and char32_t (std::u16string and std::u32string also work):

diff --git a/tests/tests/iconv.cpp b/tests/tests/iconv.cpp
index 91d512b1b..919f6facf 100644
--- a/tests/tests/iconv.cpp
+++ b/tests/tests/iconv.cpp
@@ -42,7 +42,8 @@ TEST(lagi_iconv, StrLen1) {
 TEST(lagi_iconv, StrLen2) {
 	IconvWrapper conv("UTF-16LE", "UTF-16LE", false);
 	for (int i = 0; i < 10; i++) {
-		std::basic_string<int16_t> str(i, ' ');
+		std::basic_string<char16_t> str(i, ' ');
+		static_assert(sizeof(char16_t) == sizeof(int16_t));
 		ASSERT_EQ(2*i, conv.SrcStrLen((const char *)str.c_str()));
 		ASSERT_EQ(2*i, conv.DstStrLen((const char *)str.c_str()));
 	}
@@ -50,7 +51,8 @@ TEST(lagi_iconv, StrLen2) {
 TEST(lagi_iconv, StrLen4) {
 	IconvWrapper conv("UTF-32LE", "UTF-32LE", false);
 	for (int i = 0; i < 10; i++) {
-		std::basic_string<int32_t> str(i, ' ');
+		std::basic_string<char32_t> str(i, ' ');
+		static_assert(sizeof(char32_t) == sizeof(int32_t));
 		ASSERT_EQ(4*i, conv.SrcStrLen((const char *)str.c_str()));
 		ASSERT_EQ(4*i, conv.DstStrLen((const char *)str.c_str()));
 	}

The standard defines char16_t and char32_t to be at least (but not exactly) 16 or 32 bits, which is why I added the static_assert.

@al3xtjames al3xtjames linked a pull request Jan 15, 2025 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant