[flang][runtime] ensure character compares to blank are unsigned

CompareToBlankPadding was doing signed compare on architecture where
`char` is signed. This caused `'abc'//char(128) > 'abc'` to evaluate
to false at runtime instead of true.

Differential Revision: https://reviews.llvm.org/D133693
This commit is contained in:
Jean Perier 2022-09-13 10:39:33 +02:00
parent 53d8687a13
commit 2694234c29
2 changed files with 7 additions and 2 deletions

View File

@ -20,11 +20,14 @@ namespace Fortran::runtime {
template <typename CHAR>
inline int CompareToBlankPadding(const CHAR *x, std::size_t chars) {
using UNSIGNED_CHAR = std::make_unsigned_t<CHAR>;
const auto blank{static_cast<UNSIGNED_CHAR>(' ')};
for (; chars-- > 0; ++x) {
if (*x < ' ') {
const UNSIGNED_CHAR ux{*reinterpret_cast<const UNSIGNED_CHAR *>(x)};
if (ux < blank) {
return -1;
}
if (*x > ' ') {
if (ux > blank) {
return 1;
}
}

View File

@ -171,6 +171,8 @@ static ComparisonTestCasesTy comparisonTestCases{
std::make_tuple("abc", "def", 3, 3, -1),
std::make_tuple("ab ", "abc", 3, 2, 0),
std::make_tuple("abc", "abc", 2, 3, -1),
std::make_tuple("ab\xff", "ab ", 3, 2, 1),
std::make_tuple("ab ", "ab\xff", 2, 3, -1),
},
{
std::make_tuple(u"abc", u"abc", 3, 3, 0),