[gcc r16-8606] libstdc++: Test for using non-ascii unicode fill with non-unicode encoding.

Tomasz Kaminski tkaminsk@gcc.gnu.org
Tue Apr 14 14:19:05 GMT 2026


https://gcc.gnu.org/g:9184dd174635b0ec54e97d1f794ef0c3d5147f80

commit r16-8606-g9184dd174635b0ec54e97d1f794ef0c3d5147f80
Author: Tomasz Kamiński <tkaminsk@redhat.com>
Date:   Fri Apr 10 10:24:19 2026 +0200

    libstdc++: Test for using non-ascii unicode fill with non-unicode encoding.
    
    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>

Diff:
---
 libstdc++-v3/testsuite/std/format/fill.cc          | 56 ++++++++++++++++++++++
 .../testsuite/std/format/fill_nonunicode.cc        |  5 ++
 2 files changed, 61 insertions(+)

diff --git a/libstdc++-v3/testsuite/std/format/fill.cc b/libstdc++-v3/testsuite/std/format/fill.cc
new file mode 100644
index 000000000000..d281ec1080a2
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/format/fill.cc
@@ -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
index 000000000000..1370cf57ccdc
--- /dev/null
+++ b/libstdc++-v3/testsuite/std/format/fill_nonunicode.cc
@@ -0,0 +1,5 @@
+// { dg-options "-fexec-charset=ISO8859-1" }
+// { dg-do run { target c++20 } }
+// { dg-add-options no_pch }
+
+#include "fill.cc"


More information about the Libstdc++-cvs mailing list