[libcxx-commits] [libcxx] [libc++][test] Don't pass ill-formed UTF-8 to MAKE_STRING_VIEW (PR #136403)
S. B. Tam via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Apr 18 21:32:53 PDT 2025
https://github.com/cpplearner created https://github.com/llvm/llvm-project/pull/136403
The tests `escaped_output.unicode.pass.cpp` and `fill.unicode.pass.cpp` use `SV` (which expands to `MAKE_STRING_VIEW`) to create a string view of `CharT`. [`MAKE_STRING_VIEW`](https://github.com/llvm/llvm-project/blob/c239acb5b6b80ddb3c6407ffc9e051f636ae41c1/libcxx/test/support/make_string.h#L99) internally creates a u8 string literal, which is potentially non-portable when there's a numeric escape sequence (see [CWG 1656](https://cplusplus.github.io/CWG/issues/1656.html)). Latest MSVC preview (v17.14.0-pre.3.0) produces warning C5321 for this.
These tests don't actually need to produce a u8 string literal. (In fact, the affected lines are exercised only if `CharT` is `char`.) It seems possible to simply avoid `SV` in these places.
>From eef05ca7b1e895c0049703c2a4af5efca6e58724 Mon Sep 17 00:00:00 2001
From: cpplearner <cpplearner at outlook.com>
Date: Sat, 19 Apr 2025 11:50:14 +0800
Subject: [PATCH] [libc++][test] Don't pass ill-formed UTF-8 to
MAKE_STRING_VIEW
---
.../escaped_output.unicode.pass.cpp | 2 +-
.../format.functions/fill.unicode.pass.cpp | 36 ++++++++++++-------
2 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/libcxx/test/std/utilities/format/format.functions/escaped_output.unicode.pass.cpp b/libcxx/test/std/utilities/format/format.functions/escaped_output.unicode.pass.cpp
index c4adf601c40af..eb27c70954664 100644
--- a/libcxx/test/std/utilities/format/format.functions/escaped_output.unicode.pass.cpp
+++ b/libcxx/test/std/utilities/format/format.functions/escaped_output.unicode.pass.cpp
@@ -337,7 +337,7 @@ void test_string() {
// Ill-formed
if constexpr (sizeof(CharT) == 1)
- test_format(SV(R"("\x{80}")"), SV("{:?}"), SV("\x80"));
+ test_format(SV(R"("\x{80}")"), SV("{:?}"), "\x80");
// *** P2713R1 examples ***
test_format(SV(R"(["\u{301}"])"), SV("[{:?}]"), SV("\u0301"));
diff --git a/libcxx/test/std/utilities/format/format.functions/fill.unicode.pass.cpp b/libcxx/test/std/utilities/format/format.functions/fill.unicode.pass.cpp
index cd555e1ab9ce8..76f756ae91483 100644
--- a/libcxx/test/std/utilities/format/format.functions/fill.unicode.pass.cpp
+++ b/libcxx/test/std/utilities/format/format.functions/fill.unicode.pass.cpp
@@ -75,30 +75,40 @@ void test() {
// Invalid Unicode Scalar Values
if constexpr (std::same_as<CharT, char>) {
- check_exception("The format specifier contains malformed Unicode characters", SV("{:\xed\xa0\x80^}"), 42); // U+D800
- check_exception("The format specifier contains malformed Unicode characters", SV("{:\xed\xa0\xbf^}"), 42); // U+DBFF
- check_exception("The format specifier contains malformed Unicode characters", SV("{:\xed\xbf\x80^}"), 42); // U+DC00
- check_exception("The format specifier contains malformed Unicode characters", SV("{:\xed\xbf\xbf^}"), 42); // U+DFFF
+ check_exception("The format specifier contains malformed Unicode characters",
+ std::string_view{"{:\xed\xa0\x80^}"},
+ 42); // U+D800
+ check_exception("The format specifier contains malformed Unicode characters",
+ std::string_view{"{:\xed\xa0\xbf^}"},
+ 42); // U+DBFF
+ check_exception("The format specifier contains malformed Unicode characters",
+ std::string_view{"{:\xed\xbf\x80^}"},
+ 42); // U+DC00
+ check_exception("The format specifier contains malformed Unicode characters",
+ std::string_view{"{:\xed\xbf\xbf^}"},
+ 42); // U+DFFF
- check_exception(
- "The format specifier contains malformed Unicode characters", SV("{:\xf4\x90\x80\x80^}"), 42); // U+110000
- check_exception(
- "The format specifier contains malformed Unicode characters", SV("{:\xf4\x90\xbf\xbf^}"), 42); // U+11FFFF
+ check_exception("The format specifier contains malformed Unicode characters",
+ std::string_view{"{:\xf4\x90\x80\x80^}"},
+ 42); // U+110000
+ check_exception("The format specifier contains malformed Unicode characters",
+ std::string_view{"{:\xf4\x90\xbf\xbf^}"},
+ 42); // U+11FFFF
check_exception("The format specifier contains malformed Unicode characters",
- SV("{:\x80^}"),
+ std::string_view{"{:\x80^}"},
42); // Trailing code unit with no leading one.
check_exception("The format specifier contains malformed Unicode characters",
- SV("{:\xc0^}"),
+ std::string_view{"{:\xc0^}"},
42); // Missing trailing code unit.
check_exception("The format specifier contains malformed Unicode characters",
- SV("{:\xe0\x80^}"),
+ std::string_view{"{:\xe0\x80^}"},
42); // Missing trailing code unit.
check_exception("The format specifier contains malformed Unicode characters",
- SV("{:\xf0\x80^}"),
+ std::string_view{"{:\xf0\x80^}"},
42); // Missing two trailing code units.
check_exception("The format specifier contains malformed Unicode characters",
- SV("{:\xf0\x80\x80^}"),
+ std::string_view{"{:\xf0\x80\x80^}"},
42); // Missing trailing code unit.
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
More information about the libcxx-commits
mailing list