zatrazz created this revision. zatrazz added reviewers: jroelofs, danalbert, EricWF. zatrazz added subscribers: rmaprath, aemerson, rengolin, cfe-commits.
The expected 'filesystem::path::compare' result states that for different only the sign of result integer contains the information about passed arguments. This is because it uses the output of other compare function (basic_string_view and char_traits) without further handling and char_traits uses memcmp for final buffer comparison. However for GLIBC on AArch64 the code: int ret = memcmp ("b/a/c", "a/b/c", 1); Results in '64' where for x86_64 it results in '1'. This patch fixes the expected 'filesystem::path::compare' by normalizing all the results before assert comparison. https://reviews.llvm.org/D23449 Files: test/std/experimental/filesystem/class.path/path.member/path.compare.pass.cpp Index: test/std/experimental/filesystem/class.path/path.member/path.compare.pass.cpp =================================================================== --- test/std/experimental/filesystem/class.path/path.member/path.compare.pass.cpp +++ test/std/experimental/filesystem/class.path/path.member/path.compare.pass.cpp @@ -73,6 +73,11 @@ #undef LONGC #undef LONGD +static inline int normalize_ret(int ret) +{ + return ret < 0 ? -1 : (ret > 0 ? 1 : 0); +} + int main() { using namespace fs; @@ -86,13 +91,12 @@ DisableAllocationGuard g; // none of these operations should allocate // check runtime results - int ret1 = p1.compare(p2); - int ret2 = p1.compare(R); - int ret3 = p1.compare(TC.RHS); - int ret4 = p1.compare(RV); + int ret1 = normalize_ret(p1.compare(p2)); + int ret2 = normalize_ret(p1.compare(R)); + int ret3 = normalize_ret(p1.compare(TC.RHS)); + int ret4 = normalize_ret(p1.compare(RV)); assert(ret1 == ret2 && ret1 == ret3 && ret1 == ret4); - int normalized_ret = ret1 < 0 ? -1 : (ret1 > 0 ? 1 : 0); - assert(normalized_ret == E); + assert(ret1 == E); // check signatures ASSERT_NOEXCEPT(p1.compare(p2));
Index: test/std/experimental/filesystem/class.path/path.member/path.compare.pass.cpp =================================================================== --- test/std/experimental/filesystem/class.path/path.member/path.compare.pass.cpp +++ test/std/experimental/filesystem/class.path/path.member/path.compare.pass.cpp @@ -73,6 +73,11 @@ #undef LONGC #undef LONGD +static inline int normalize_ret(int ret) +{ + return ret < 0 ? -1 : (ret > 0 ? 1 : 0); +} + int main() { using namespace fs; @@ -86,13 +91,12 @@ DisableAllocationGuard g; // none of these operations should allocate // check runtime results - int ret1 = p1.compare(p2); - int ret2 = p1.compare(R); - int ret3 = p1.compare(TC.RHS); - int ret4 = p1.compare(RV); + int ret1 = normalize_ret(p1.compare(p2)); + int ret2 = normalize_ret(p1.compare(R)); + int ret3 = normalize_ret(p1.compare(TC.RHS)); + int ret4 = normalize_ret(p1.compare(RV)); assert(ret1 == ret2 && ret1 == ret3 && ret1 == ret4); - int normalized_ret = ret1 < 0 ? -1 : (ret1 > 0 ? 1 : 0); - assert(normalized_ret == E); + assert(ret1 == E); // check signatures ASSERT_NOEXCEPT(p1.compare(p2));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits