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>
This commit is contained in:
Tomasz Kamiński
2026-04-10 10:24:19 +02:00
parent 31b012f760
commit 9184dd1746
2 changed files with 61 additions and 0 deletions

View File

@@ -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"));
}

View File

@@ -0,0 +1,5 @@
// { dg-options "-fexec-charset=ISO8859-1" }
// { dg-do run { target c++20 } }
// { dg-add-options no_pch }
#include "fill.cc"