]>
Commit | Line | Data |
---|---|---|
7adcbafe | 1 | // Copyright (C) 2017-2022 Free Software Foundation, Inc. |
804b7cc4 JW |
2 | // |
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) | |
7 | // any later version. | |
8 | ||
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. | |
13 | ||
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/>. | |
17 | ||
c104e8f1 JW |
18 | // <charconv> is supported in C++14 as a GNU extension |
19 | // { dg-do run { target c++14 } } | |
804b7cc4 JW |
20 | |
21 | #include <charconv> | |
c104e8f1 | 22 | #include <string> |
804b7cc4 JW |
23 | #include <testsuite_hooks.h> |
24 | ||
25 | // Test std::from_chars error handling. | |
26 | ||
27 | void | |
28 | test01() | |
29 | { | |
30 | std::from_chars_result r; | |
31 | int i = 999; | |
c104e8f1 | 32 | std::string s; |
804b7cc4 JW |
33 | |
34 | s = ""; | |
c104e8f1 | 35 | r = std::from_chars(s.data(), s.data() + s.length(), i); |
804b7cc4 | 36 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 37 | VERIFY( r.ptr == s.data() ); |
804b7cc4 JW |
38 | VERIFY( i == 999 ); |
39 | ||
40 | s = "*"; | |
c104e8f1 | 41 | r = std::from_chars(s.data(), s.data() + s.length(), i); |
804b7cc4 | 42 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 43 | VERIFY( r.ptr == s.data() ); |
804b7cc4 JW |
44 | VERIFY( i == 999 ); |
45 | ||
46 | s = "-"; | |
c104e8f1 | 47 | r = std::from_chars(s.data(), s.data() + s.length(), i); |
804b7cc4 | 48 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 49 | VERIFY( r.ptr == s.data() ); |
804b7cc4 JW |
50 | VERIFY( i == 999 ); |
51 | ||
52 | s = "-*"; | |
c104e8f1 | 53 | r = std::from_chars(s.data(), s.data() + s.length(), i); |
804b7cc4 | 54 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 55 | VERIFY( r.ptr == s.data() ); |
804b7cc4 JW |
56 | VERIFY( i == 999 ); |
57 | ||
932fbc86 JW |
58 | s = "+1"; |
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() ); | |
62 | VERIFY( i == 999 ); | |
63 | ||
804b7cc4 JW |
64 | unsigned u = 888; |
65 | s = "-1"; | |
c104e8f1 | 66 | r = std::from_chars(s.data(), s.data() + s.length(), u); |
804b7cc4 | 67 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 68 | VERIFY( r.ptr == s.data() ); |
804b7cc4 | 69 | s = "-a"; |
c104e8f1 | 70 | r = std::from_chars(s.data(), s.data() + s.length(), u); |
804b7cc4 | 71 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 72 | VERIFY( r.ptr == s.data() ); |
804b7cc4 | 73 | s = "-"; |
c104e8f1 | 74 | r = std::from_chars(s.data(), s.data() + s.length(), u); |
804b7cc4 | 75 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 76 | VERIFY( r.ptr == s.data() ); |
804b7cc4 | 77 | VERIFY( u == 888 ); |
932fbc86 JW |
78 | s = "+1"; |
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() ); | |
82 | VERIFY( u == 888 ); | |
804b7cc4 JW |
83 | |
84 | for (int base = 2; base <= 36; ++base) | |
85 | { | |
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 ); | |
91 | VERIFY( i == 999 ); | |
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 ); | |
95 | VERIFY( i == 999 ); | |
96 | r = std::from_chars(buf, buf + 2, i, base); | |
97 | VERIFY( r.ec == std::errc::invalid_argument ); | |
98 | VERIFY( r.ptr == buf ); | |
99 | VERIFY( i == 999 ); | |
100 | } | |
101 | } | |
102 | ||
103 | void | |
104 | test02() | |
105 | { | |
106 | std::from_chars_result r; | |
c104e8f1 | 107 | std::string s; |
804b7cc4 JW |
108 | |
109 | signed char c = -5; | |
110 | s = "-10000001"; | |
c104e8f1 | 111 | r = std::from_chars(s.data(), s.data() + s.length(), c, 2); |
804b7cc4 | 112 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 113 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 114 | s = "-10000001*"; |
c104e8f1 | 115 | r = std::from_chars(s.data(), s.data() + s.length(), c, 2); |
804b7cc4 | 116 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 117 | VERIFY( r.ptr == s.data() + 9 ); |
804b7cc4 | 118 | s = "-10000001000*"; |
c104e8f1 | 119 | r = std::from_chars(s.data(), s.data() + s.length(), c, 2); |
804b7cc4 | 120 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 121 | VERIFY( r.ptr == s.data() + 12 ); |
804b7cc4 | 122 | s = "-129"; |
c104e8f1 | 123 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 124 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 125 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 126 | s = "-129*"; |
c104e8f1 | 127 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 128 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 129 | VERIFY( r.ptr == s.data() + 4 ); |
804b7cc4 | 130 | s = "-100"; |
c104e8f1 | 131 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 132 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 133 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 134 | s = "-100*"; |
c104e8f1 | 135 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 136 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 137 | VERIFY( r.ptr == s.data() + 4 ); |
804b7cc4 | 138 | s = "-81"; |
c104e8f1 | 139 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 140 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 141 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 142 | s = "-81*"; |
c104e8f1 | 143 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 144 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 145 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 146 | s = "128"; |
c104e8f1 | 147 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 148 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 149 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 150 | s = "128*"; |
c104e8f1 | 151 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 152 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 153 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 154 | s = "80"; |
c104e8f1 | 155 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 156 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 157 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 158 | s = "80*"; |
c104e8f1 | 159 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 160 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 161 | VERIFY( r.ptr == s.data() + 2 ); |
804b7cc4 JW |
162 | VERIFY( c == -5 ); |
163 | ||
164 | unsigned char uc = 9; | |
165 | s = "100000000"; | |
c104e8f1 | 166 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 2); |
804b7cc4 | 167 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 168 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 169 | s = "100000000*"; |
c104e8f1 | 170 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 2); |
804b7cc4 | 171 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 172 | VERIFY( r.ptr == s.data() + 9 ); |
804b7cc4 | 173 | s = "100000000000*"; |
c104e8f1 | 174 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 2); |
804b7cc4 | 175 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 176 | VERIFY( r.ptr == s.data() + 12 ); |
804b7cc4 | 177 | s = "256"; |
c104e8f1 | 178 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 10); |
804b7cc4 | 179 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 180 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 181 | s = "256**"; |
c104e8f1 | 182 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 10); |
804b7cc4 | 183 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 184 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 185 | s = "256000**"; |
c104e8f1 | 186 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 10); |
804b7cc4 | 187 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 188 | VERIFY( r.ptr == s.data() + 6 ); |
804b7cc4 | 189 | s = "100"; |
c104e8f1 | 190 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 16); |
804b7cc4 | 191 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 192 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 193 | s = "100**"; |
c104e8f1 | 194 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 16); |
804b7cc4 | 195 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 196 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 197 | s = "100000**"; |
c104e8f1 | 198 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 16); |
804b7cc4 | 199 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 200 | VERIFY( r.ptr == s.data() + 6 ); |
804b7cc4 JW |
201 | VERIFY( uc == 9 ); |
202 | ||
203 | unsigned long long ull = 123; | |
204 | s = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz****"; | |
c104e8f1 | 205 | r = std::from_chars(s.data(), s.data() + s.length(), ull, 36); |
804b7cc4 | 206 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 207 | VERIFY( r.ptr == s.data() + 42 ); |
804b7cc4 JW |
208 | VERIFY( ull == 123 ); |
209 | } | |
210 | ||
211 | int | |
212 | main() | |
213 | { | |
214 | test01(); | |
215 | test02(); | |
216 | } |