mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
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>
57 lines
1.3 KiB
C++
57 lines
1.3 KiB
C++
// { 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"));
|
|
}
|