]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Test for using non-ascii unicode fill with non-unicode encoding.
authorTomasz Kamiński <tkaminsk@redhat.com>
Fri, 10 Apr 2026 08:24:19 +0000 (10:24 +0200)
committerTomasz Kamiński <tkaminsk@redhat.com>
Tue, 14 Apr 2026 14:02:42 +0000 (16:02 +0200)
This checks if format string using as fill character an Unicode code-point,
that is encoded as multiple code units, is rejected when literal encoding
is not Unicode.

libstdc++-v3/ChangeLog:

* testsuite/std/format/fill.cc: New test.
* testsuite/std/format/fill_nonunicode.cc: New test.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
libstdc++-v3/testsuite/std/format/fill.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/format/fill_nonunicode.cc [new file with mode: 0644]

diff --git a/libstdc++-v3/testsuite/std/format/fill.cc b/libstdc++-v3/testsuite/std/format/fill.cc
new file mode 100644 (file)
index 0000000..d281ec1
--- /dev/null
@@ -0,0 +1,56 @@
+// { dg-options "-fexec-charset=UTF-8 -DUNICODE_ENC" }
+// { dg-do run { target c++20 } }
+
+#include <format>
+#include <testsuite_hooks.h>
+
+template<typename... Args>
+bool
+is_format_string_for(const char* str, Args&&... args)
+{
+  try {
+    (void) std::vformat(str, std::make_format_args(args...));
+    return true;
+  } catch (const std::format_error&) {
+    return false;
+  }
+}
+
+template<typename T>
+void
+test_fill(T t)
+{
+  constexpr bool accept_utf8_nonascii
+#ifdef UNICODE_ENC
+   = true;
+#else
+   = false;
+#endif
+
+   VERIFY(is_format_string_for("{: <}", t));
+   VERIFY(is_format_string_for("{:Å<}", t));
+   // U+0119 Latin Small Letter E with Ogonek
+   VERIFY(is_format_string_for("{:\xC4\x99<}", t) == accept_utf8_nonascii);
+   // U+2705 White Heavy Check Mark
+   VERIFY(is_format_string_for("{:\xE2\x9C\x85<}", t) == accept_utf8_nonascii);
+   // U+1F602 Face with Tears of Joy
+   VERIFY(is_format_string_for("{:\xF0\x9F\x98\x82<}", t) == accept_utf8_nonascii);
+}
+
+struct MyStringView : std::string_view
+{
+  using std::string_view::string_view;
+};
+
+template<>
+struct std::formatter<MyStringView, char>
+  : std::formatter<std::string_view, char>
+{};
+
+int main()
+{
+  test_fill(10);
+  test_fill(std::string_view("test"));
+  // Test with type stored by handle
+  test_fill(MyStringView("test"));
+}
diff --git a/libstdc++-v3/testsuite/std/format/fill_nonunicode.cc b/libstdc++-v3/testsuite/std/format/fill_nonunicode.cc
new file mode 100644 (file)
index 0000000..1370cf5
--- /dev/null
@@ -0,0 +1,5 @@
+// { dg-options "-fexec-charset=ISO8859-1" }
+// { dg-do run { target c++20 } }
+// { dg-add-options no_pch }
+
+#include "fill.cc"