forked from OSchip/llvm-project
[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:
parent
53d8687a13
commit
2694234c29
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue