]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/20_util/to_chars/float16_c++23.cc
1 // Copyright (C) 2022-2023 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-do run { target c++23 } }
19 // { dg-require-effective-target ieee_floats }
20 // { dg-require-effective-target size32plus }
21 // { dg-add-options ieee }
27 #include <testsuite_hooks.h>
31 test(std::chars_format fmt
= std::chars_format
{})
33 char str1
[128], str2
[128], str3
[128];
34 union U
{ unsigned short s
; T f
; } u
, v
;
35 for (int i
= 0; i
<= (unsigned short) ~0; ++i
)
38 auto [ptr1
, ec1
] = (fmt
== std::chars_format
{}
39 ? std::to_chars(str1
, str1
+ sizeof(str1
), u
.f
)
40 : std::to_chars(str1
, str1
+ sizeof(str1
), u
.f
,
42 auto [ptr2
, ec2
] = (fmt
== std::chars_format
{}
43 ? std::to_chars(str2
, str2
+ sizeof(str2
),
45 : std::to_chars(str2
, str2
+ sizeof(str2
),
46 std::float32_t(u
.f
), fmt
));
47 VERIFY( ec1
== std::errc() && ec2
== std::errc() );
48 // std::cout << i << ' ' << std::string_view (str1, ptr1)
49 // << '\t' << std::string_view (str2, ptr2) << '\n';
50 if (fmt
== std::chars_format::fixed
)
52 auto [ptr3
, ec3
] = std::to_chars(str3
, str3
+ (ptr1
- str1
), u
.f
, fmt
);
53 VERIFY( ec3
== std::errc() && ptr3
- str3
== ptr1
- str1
);
54 auto [ptr4
, ec4
] = std::to_chars(str3
, str3
+ (ptr1
- str1
- 1), u
.f
, fmt
);
55 VERIFY( ec4
!= std::errc() );
57 auto [ptr5
, ec5
] = std::from_chars(str1
, ptr1
, v
.f
,
58 fmt
== std::chars_format
{}
59 ? std::chars_format::general
: fmt
);
60 VERIFY( ec5
== std::errc() && ptr5
== ptr1
);
61 VERIFY( u
.s
== v
.s
|| (std::isnan(u
.f
) && std::isnan(v
.f
)) );
68 #ifdef __STDCPP_FLOAT16_T__
69 test
<std::float16_t
>();
70 test
<std::float16_t
>(std::chars_format::fixed
);
71 test
<std::float16_t
>(std::chars_format::scientific
);
72 test
<std::float16_t
>(std::chars_format::general
);
73 test
<std::float16_t
>(std::chars_format::hex
);
75 #ifdef __STDCPP_BFLOAT16_T__
76 test
<std::bfloat16_t
>();
77 test
<std::bfloat16_t
>(std::chars_format::fixed
);
78 test
<std::bfloat16_t
>(std::chars_format::scientific
);
79 test
<std::bfloat16_t
>(std::chars_format::general
);
80 test
<std::bfloat16_t
>(std::chars_format::hex
);