]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/20_util/from_chars/2.cc
1 // Copyright (C) 2017-2021 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 // <charconv> is supported in C++14 as a GNU extension
19 // { dg-do run { target c++14 } }
23 #include <testsuite_hooks.h>
25 // Test std::from_chars error handling.
30 std::from_chars_result r
;
35 r
= std::from_chars(s
.data(), s
.data() + s
.length(), i
);
36 VERIFY( r
.ec
== std::errc::invalid_argument
);
37 VERIFY( r
.ptr
== s
.data() );
41 r
= std::from_chars(s
.data(), s
.data() + s
.length(), i
);
42 VERIFY( r
.ec
== std::errc::invalid_argument
);
43 VERIFY( r
.ptr
== s
.data() );
47 r
= std::from_chars(s
.data(), s
.data() + s
.length(), i
);
48 VERIFY( r
.ec
== std::errc::invalid_argument
);
49 VERIFY( r
.ptr
== s
.data() );
53 r
= std::from_chars(s
.data(), s
.data() + s
.length(), i
);
54 VERIFY( r
.ec
== std::errc::invalid_argument
);
55 VERIFY( r
.ptr
== s
.data() );
59 r
= std::from_chars(s
.data(), s
.data() + s
.length(), i
);
60 VERIFY( r
.ec
== std::errc::invalid_argument
);
61 VERIFY( r
.ptr
== s
.data() );
66 r
= std::from_chars(s
.data(), s
.data() + s
.length(), u
);
67 VERIFY( r
.ec
== std::errc::invalid_argument
);
68 VERIFY( r
.ptr
== s
.data() );
70 r
= std::from_chars(s
.data(), s
.data() + s
.length(), u
);
71 VERIFY( r
.ec
== std::errc::invalid_argument
);
72 VERIFY( r
.ptr
== s
.data() );
74 r
= std::from_chars(s
.data(), s
.data() + s
.length(), u
);
75 VERIFY( r
.ec
== std::errc::invalid_argument
);
76 VERIFY( r
.ptr
== s
.data() );
79 r
= std::from_chars(s
.data(), s
.data() + s
.length(), u
);
80 VERIFY( r
.ec
== std::errc::invalid_argument
);
81 VERIFY( r
.ptr
== s
.data() );
84 for (int base
= 2; base
<= 36; ++base
)
86 const char digits
[] = "0123456789abcdefghijklmnopqrstuvwxyz*";
87 const char buf
[2] = { '-', digits
[base
] };
88 r
= std::from_chars(buf
, buf
+ 1, i
, base
);
89 VERIFY( r
.ec
== std::errc::invalid_argument
);
90 VERIFY( r
.ptr
== buf
);
92 r
= std::from_chars(buf
+ 1, buf
+ 2, i
, base
);
93 VERIFY( r
.ec
== std::errc::invalid_argument
);
94 VERIFY( r
.ptr
== buf
+ 1 );
96 r
= std::from_chars(buf
, buf
+ 2, i
, base
);
97 VERIFY( r
.ec
== std::errc::invalid_argument
);
98 VERIFY( r
.ptr
== buf
);
106 std::from_chars_result r
;
111 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 2);
112 VERIFY( r
.ec
== std::errc::result_out_of_range
);
113 VERIFY( r
.ptr
== s
.data() + s
.length() );
115 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 2);
116 VERIFY( r
.ec
== std::errc::result_out_of_range
);
117 VERIFY( r
.ptr
== s
.data() + 9 );
119 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 2);
120 VERIFY( r
.ec
== std::errc::result_out_of_range
);
121 VERIFY( r
.ptr
== s
.data() + 12 );
123 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
124 VERIFY( r
.ec
== std::errc::result_out_of_range
);
125 VERIFY( r
.ptr
== s
.data() + s
.length() );
127 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
128 VERIFY( r
.ec
== std::errc::result_out_of_range
);
129 VERIFY( r
.ptr
== s
.data() + 4 );
131 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
132 VERIFY( r
.ec
== std::errc::result_out_of_range
);
133 VERIFY( r
.ptr
== s
.data() + s
.length() );
135 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
136 VERIFY( r
.ec
== std::errc::result_out_of_range
);
137 VERIFY( r
.ptr
== s
.data() + 4 );
139 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
140 VERIFY( r
.ec
== std::errc::result_out_of_range
);
141 VERIFY( r
.ptr
== s
.data() + s
.length() );
143 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
144 VERIFY( r
.ec
== std::errc::result_out_of_range
);
145 VERIFY( r
.ptr
== s
.data() + 3 );
147 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
148 VERIFY( r
.ec
== std::errc::result_out_of_range
);
149 VERIFY( r
.ptr
== s
.data() + s
.length() );
151 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
152 VERIFY( r
.ec
== std::errc::result_out_of_range
);
153 VERIFY( r
.ptr
== s
.data() + 3 );
155 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
156 VERIFY( r
.ec
== std::errc::result_out_of_range
);
157 VERIFY( r
.ptr
== s
.data() + s
.length() );
159 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
160 VERIFY( r
.ec
== std::errc::result_out_of_range
);
161 VERIFY( r
.ptr
== s
.data() + 2 );
164 unsigned char uc
= 9;
166 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 2);
167 VERIFY( r
.ec
== std::errc::result_out_of_range
);
168 VERIFY( r
.ptr
== s
.data() + s
.length() );
170 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 2);
171 VERIFY( r
.ec
== std::errc::result_out_of_range
);
172 VERIFY( r
.ptr
== s
.data() + 9 );
174 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 2);
175 VERIFY( r
.ec
== std::errc::result_out_of_range
);
176 VERIFY( r
.ptr
== s
.data() + 12 );
178 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 10);
179 VERIFY( r
.ec
== std::errc::result_out_of_range
);
180 VERIFY( r
.ptr
== s
.data() + s
.length() );
182 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 10);
183 VERIFY( r
.ec
== std::errc::result_out_of_range
);
184 VERIFY( r
.ptr
== s
.data() + 3 );
186 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 10);
187 VERIFY( r
.ec
== std::errc::result_out_of_range
);
188 VERIFY( r
.ptr
== s
.data() + 6 );
190 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 16);
191 VERIFY( r
.ec
== std::errc::result_out_of_range
);
192 VERIFY( r
.ptr
== s
.data() + s
.length() );
194 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 16);
195 VERIFY( r
.ec
== std::errc::result_out_of_range
);
196 VERIFY( r
.ptr
== s
.data() + 3 );
198 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 16);
199 VERIFY( r
.ec
== std::errc::result_out_of_range
);
200 VERIFY( r
.ptr
== s
.data() + 6 );
203 unsigned long long ull
= 123;
204 s
= "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz****";
205 r
= std::from_chars(s
.data(), s
.data() + s
.length(), ull
, 36);
206 VERIFY( r
.ec
== std::errc::result_out_of_range
);
207 VERIFY( r
.ptr
== s
.data() + 42 );
208 VERIFY( ull
== 123 );