[libcxx-commits] [libcxx] ca69f51 - [libcxx] [test] Detect the UCRT printf("%a") formatting bug (#99846)
via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jul 26 10:29:18 PDT 2024
Author: Martin Storsjö
Date: 2024-07-26T20:29:14+03:00
New Revision: ca69f515fe29fa98b7ab52e49c5b401bb22f64f6
URL: https://github.com/llvm/llvm-project/commit/ca69f515fe29fa98b7ab52e49c5b401bb22f64f6
DIFF: https://github.com/llvm/llvm-project/commit/ca69f515fe29fa98b7ab52e49c5b401bb22f64f6.diff
LOG: [libcxx] [test] Detect the UCRT printf("%a") formatting bug (#99846)
This fixes testing with MinGW, if built without
__USE_MINGW_ANSI_STDIO=1.
On x86 MinGW, such a configuration fails printf tests with long doubles
due to mismatches between 80 and 64 bit long doubles - but on ARM,
there's no such issue, so building without __USE_MINGW_ANSI_STDIO=1 is
perfectly valid there.
Add another similar XFAIL to a libcxxabi test; this test isn't executed
in MSVC environments, so no XFAIL has been needed so far.
Added:
Modified:
libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_double.hex.pass.cpp
libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.hex.pass.cpp
libcxx/utils/libcxx/test/features.py
libcxxabi/test/test_demangle.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_double.hex.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_double.hex.pass.cpp
index 21efa978abdcc..946c26398fcb8 100644
--- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_double.hex.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_double.hex.pass.cpp
@@ -12,10 +12,7 @@
// iter_type put(iter_type s, ios_base& iob, char_type fill, double v) const;
-// With the Microsoft UCRT, printf("%a", 0.0) produces "0x0.0000000000000p+0"
-// while other C runtimes produce just "0x0p+0".
-// https://developercommunity.visualstudio.com/t/Printf-formatting-of-float-as-hex-prints/1660844
-// XFAIL: msvc
+// XFAIL: win32-broken-printf-a-precision
// XFAIL: LIBCXX-AIX-FIXME
diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.hex.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.hex.pass.cpp
index c97c9a0c40369..a195c34e5f8e8 100644
--- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.hex.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.hex.pass.cpp
@@ -12,10 +12,7 @@
// iter_type put(iter_type s, ios_base& iob, char_type fill, long double v) const;
-// With the Microsoft UCRT, printf("%a", 0.0) produces "0x0.0000000000000p+0"
-// while other C runtimes produce just "0x0p+0".
-// https://developercommunity.visualstudio.com/t/Printf-formatting-of-float-as-hex-prints/1660844
-// XFAIL: msvc
+// XFAIL: win32-broken-printf-a-precision
// XFAIL: LIBCXX-AIX-FIXME
diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py
index e978875d543f3..97cdb0349885d 100644
--- a/libcxx/utils/libcxx/test/features.py
+++ b/libcxx/utils/libcxx/test/features.py
@@ -263,6 +263,26 @@ def _mingwSupportsModules(cfg):
""",
),
),
+ # Check for a Windows UCRT bug (not fixed upstream yet).
+ # With UCRT, printf("%a", 0.0) produces "0x0.0000000000000p+0",
+ # while other C runtimes produce just "0x0p+0".
+ # https://developercommunity.visualstudio.com/t/Printf-formatting-of-float-as-hex-prints/1660844
+ Feature(
+ name="win32-broken-printf-a-precision",
+ when=lambda cfg: "_WIN32" in compilerMacros(cfg)
+ and not programSucceeds(
+ cfg,
+ """
+ #include <stdio.h>
+ #include <string.h>
+ int main(int, char**) {
+ char buf[100];
+ snprintf(buf, sizeof(buf), "%a", 0.0);
+ return strcmp(buf, "0x0p+0");
+ }
+ """,
+ ),
+ ),
# Check for Glibc < 2.27, where the ru_RU.UTF-8 locale had
# mon_decimal_point == ".", which our tests don't handle.
Feature(
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index fe5598991b831..ab783cf9d96f2 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -17,6 +17,8 @@
// 80-bit format, and this demangling test is failing on it.
// XFAIL: LIBCXX-ANDROID-FIXME && target={{i686|x86_64}}-{{.+}}-android{{.*}}
+// XFAIL: win32-broken-printf-a-precision
+
#include "support/timer.h"
#include <algorithm>
#include <cassert>
More information about the libcxx-commits
mailing list