]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/20_util/from_chars/2.cc
1 // Copyright (C) 2017-2020 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() );
60 r
= std::from_chars(s
.data(), s
.data() + s
.length(), u
);
61 VERIFY( r
.ec
== std::errc::invalid_argument
);
62 VERIFY( r
.ptr
== s
.data() );
64 r
= std::from_chars(s
.data(), s
.data() + s
.length(), u
);
65 VERIFY( r
.ec
== std::errc::invalid_argument
);
66 VERIFY( r
.ptr
== s
.data() );
68 r
= std::from_chars(s
.data(), s
.data() + s
.length(), u
);
69 VERIFY( r
.ec
== std::errc::invalid_argument
);
70 VERIFY( r
.ptr
== s
.data() );
73 for (int base
= 2; base
<= 36; ++base
)
75 const char digits
[] = "0123456789abcdefghijklmnopqrstuvwxyz*";
76 const char buf
[2] = { '-', digits
[base
] };
77 r
= std::from_chars(buf
, buf
+ 1, i
, base
);
78 VERIFY( r
.ec
== std::errc::invalid_argument
);
79 VERIFY( r
.ptr
== buf
);
81 r
= std::from_chars(buf
+ 1, buf
+ 2, i
, base
);
82 VERIFY( r
.ec
== std::errc::invalid_argument
);
83 VERIFY( r
.ptr
== buf
+ 1 );
85 r
= std::from_chars(buf
, buf
+ 2, i
, base
);
86 VERIFY( r
.ec
== std::errc::invalid_argument
);
87 VERIFY( r
.ptr
== buf
);
95 std::from_chars_result r
;
100 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 2);
101 VERIFY( r
.ec
== std::errc::result_out_of_range
);
102 VERIFY( r
.ptr
== s
.data() + s
.length() );
104 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 2);
105 VERIFY( r
.ec
== std::errc::result_out_of_range
);
106 VERIFY( r
.ptr
== s
.data() + 9 );
108 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 2);
109 VERIFY( r
.ec
== std::errc::result_out_of_range
);
110 VERIFY( r
.ptr
== s
.data() + 12 );
112 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
113 VERIFY( r
.ec
== std::errc::result_out_of_range
);
114 VERIFY( r
.ptr
== s
.data() + s
.length() );
116 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
117 VERIFY( r
.ec
== std::errc::result_out_of_range
);
118 VERIFY( r
.ptr
== s
.data() + 4 );
120 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
121 VERIFY( r
.ec
== std::errc::result_out_of_range
);
122 VERIFY( r
.ptr
== s
.data() + s
.length() );
124 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
125 VERIFY( r
.ec
== std::errc::result_out_of_range
);
126 VERIFY( r
.ptr
== s
.data() + 4 );
128 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
129 VERIFY( r
.ec
== std::errc::result_out_of_range
);
130 VERIFY( r
.ptr
== s
.data() + s
.length() );
132 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
133 VERIFY( r
.ec
== std::errc::result_out_of_range
);
134 VERIFY( r
.ptr
== s
.data() + 3 );
136 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
137 VERIFY( r
.ec
== std::errc::result_out_of_range
);
138 VERIFY( r
.ptr
== s
.data() + s
.length() );
140 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 10);
141 VERIFY( r
.ec
== std::errc::result_out_of_range
);
142 VERIFY( r
.ptr
== s
.data() + 3 );
144 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
145 VERIFY( r
.ec
== std::errc::result_out_of_range
);
146 VERIFY( r
.ptr
== s
.data() + s
.length() );
148 r
= std::from_chars(s
.data(), s
.data() + s
.length(), c
, 16);
149 VERIFY( r
.ec
== std::errc::result_out_of_range
);
150 VERIFY( r
.ptr
== s
.data() + 2 );
153 unsigned char uc
= 9;
155 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 2);
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(), uc
, 2);
160 VERIFY( r
.ec
== std::errc::result_out_of_range
);
161 VERIFY( r
.ptr
== s
.data() + 9 );
163 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 2);
164 VERIFY( r
.ec
== std::errc::result_out_of_range
);
165 VERIFY( r
.ptr
== s
.data() + 12 );
167 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 10);
168 VERIFY( r
.ec
== std::errc::result_out_of_range
);
169 VERIFY( r
.ptr
== s
.data() + s
.length() );
171 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 10);
172 VERIFY( r
.ec
== std::errc::result_out_of_range
);
173 VERIFY( r
.ptr
== s
.data() + 3 );
175 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 10);
176 VERIFY( r
.ec
== std::errc::result_out_of_range
);
177 VERIFY( r
.ptr
== s
.data() + 6 );
179 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 16);
180 VERIFY( r
.ec
== std::errc::result_out_of_range
);
181 VERIFY( r
.ptr
== s
.data() + s
.length() );
183 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 16);
184 VERIFY( r
.ec
== std::errc::result_out_of_range
);
185 VERIFY( r
.ptr
== s
.data() + 3 );
187 r
= std::from_chars(s
.data(), s
.data() + s
.length(), uc
, 16);
188 VERIFY( r
.ec
== std::errc::result_out_of_range
);
189 VERIFY( r
.ptr
== s
.data() + 6 );
192 unsigned long long ull
= 123;
193 s
= "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz****";
194 r
= std::from_chars(s
.data(), s
.data() + s
.length(), ull
, 36);
195 VERIFY( r
.ec
== std::errc::result_out_of_range
);
196 VERIFY( r
.ptr
== s
.data() + 42 );
197 VERIFY( ull
== 123 );