Skip to content

Commit

Permalink
AK+Toolchain: Make char and wchar_t behave on AARCH64
Browse files Browse the repository at this point in the history
By default char and wchar_t are unsigned on AARCH64. This fixes a
bunch of related compiler errors.
  • Loading branch information
gunnarbeutner authored and linusg committed Oct 14, 2022
1 parent 31bd5b1 commit a650c74
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 10 deletions.
12 changes: 12 additions & 0 deletions AK/StdLibExtraDetails.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,12 @@ template<>
struct __MakeUnsigned<bool> {
using Type = bool;
};
#ifdef AK_ARCH_AARCH64
template<>
struct __MakeUnsigned<wchar_t> {
using Type = wchar_t;
};
#endif

template<typename T>
using MakeUnsigned = typename __MakeUnsigned<T>::Type;
Expand Down Expand Up @@ -326,6 +332,12 @@ template<>
struct __MakeSigned<char> {
using Type = char;
};
#ifdef AK_ARCH_AARCH64
template<>
struct __MakeSigned<wchar_t> {
using Type = void;
};
#endif

template<typename T>
using MakeSigned = typename __MakeSigned<T>::Type;
Expand Down
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,11 @@ if (ENABLE_COMPILETIME_FORMAT_CHECK)
add_compile_definitions(ENABLE_COMPILETIME_FORMAT_CHECK)
endif()

if("${SERENITY_ARCH}" STREQUAL "aarch64")
# FIXME: re-enable this warning
add_compile_options(-Wno-type-limits)
endif()

add_link_options(-Wno-unused-command-line-argument)

include_directories(.)
Expand Down
14 changes: 7 additions & 7 deletions Tests/LibC/TestWchar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,17 +239,17 @@ TEST_CASE(mbrtowc)
// Ensure that we can parse normal ASCII characters.
ret = mbrtowc(&wc, "Hello", 5, &state);
EXPECT_EQ(ret, 1ul);
EXPECT_EQ(wc, 'H');
EXPECT_EQ(wc, static_cast<wchar_t>('H'));

// Try two three-byte codepoints (™™), only one of which should be consumed.
ret = mbrtowc(&wc, "\xe2\x84\xa2\xe2\x84\xa2", 6, &state);
EXPECT_EQ(ret, 3ul);
EXPECT_EQ(wc, 0x2122);
EXPECT_EQ(wc, static_cast<wchar_t>(0x2122));

// Try a null character, which should return 0 and reset the state to the initial state.
ret = mbrtowc(&wc, "\x00\x00", 2, &state);
EXPECT_EQ(ret, 0ul);
EXPECT_EQ(wc, 0);
EXPECT_EQ(wc, static_cast<wchar_t>(0));
EXPECT_NE(mbsinit(&state), 0);

// Try an incomplete multibyte character.
Expand All @@ -262,7 +262,7 @@ TEST_CASE(mbrtowc)
// Finish the previous multibyte character.
ret = mbrtowc(&wc, "\xa2", 1, &state);
EXPECT_EQ(ret, 1ul);
EXPECT_EQ(wc, 0x2122);
EXPECT_EQ(wc, static_cast<wchar_t>(0x2122));

// Try an invalid multibyte sequence.
// Reset the state afterwards because the effects are undefined.
Expand Down Expand Up @@ -550,17 +550,17 @@ TEST_CASE(mbtowc)
// Ensure that we can parse normal ASCII characters.
ret = mbtowc(&wc, "Hello", 5);
EXPECT_EQ(ret, 1);
EXPECT_EQ(wc, 'H');
EXPECT_EQ(wc, static_cast<wchar_t>('H'));

// Try two three-byte codepoints (™™), only one of which should be consumed.
ret = mbtowc(&wc, "\xe2\x84\xa2\xe2\x84\xa2", 6);
EXPECT_EQ(ret, 3);
EXPECT_EQ(wc, 0x2122);
EXPECT_EQ(wc, static_cast<wchar_t>(0x2122));

// Try a null character, which should return 0.
ret = mbtowc(&wc, "\x00\x00", 2);
EXPECT_EQ(ret, 0);
EXPECT_EQ(wc, 0);
EXPECT_EQ(wc, static_cast<wchar_t>(0));

// Try an incomplete multibyte character.
ret = mbtowc(&wc, "\xe2\x84", 2);
Expand Down
8 changes: 5 additions & 3 deletions Userland/Libraries/LibRegex/RegexMatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,9 +270,11 @@ class RegexStringView {
return m_view.visit(
[&](StringView view) -> u32 {
auto ch = view[index];
if (ch < 0)
return 256u + ch;
return ch;
if constexpr (IsSigned<char>) {
if (ch < 0)
return 256u + ch;
return ch;
}
},
[&](Utf32View const& view) -> u32 { return view[index]; },
[&](Utf16View const& view) -> u32 { return view.code_point_at(index); },
Expand Down

0 comments on commit a650c74

Please sign in to comment.