mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
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:
56
libstdc++-v3/testsuite/std/format/fill.cc
Normal file
56
libstdc++-v3/testsuite/std/format/fill.cc
Normal 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"));
|
||||
}
|
||||
5
libstdc++-v3/testsuite/std/format/fill_nonunicode.cc
Normal file
5
libstdc++-v3/testsuite/std/format/fill_nonunicode.cc
Normal 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"
|
||||
Reference in New Issue
Block a user