]>
Commit | Line | Data |
---|---|---|
8d9254fc | 1 | // Copyright (C) 2017-2020 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 | ||
58 | unsigned u = 888; | |
59 | s = "-1"; | |
c104e8f1 | 60 | r = std::from_chars(s.data(), s.data() + s.length(), u); |
804b7cc4 | 61 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 62 | VERIFY( r.ptr == s.data() ); |
804b7cc4 | 63 | s = "-a"; |
c104e8f1 | 64 | r = std::from_chars(s.data(), s.data() + s.length(), u); |
804b7cc4 | 65 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 66 | VERIFY( r.ptr == s.data() ); |
804b7cc4 | 67 | s = "-"; |
c104e8f1 | 68 | r = std::from_chars(s.data(), s.data() + s.length(), u); |
804b7cc4 | 69 | VERIFY( r.ec == std::errc::invalid_argument ); |
c104e8f1 | 70 | VERIFY( r.ptr == s.data() ); |
804b7cc4 JW |
71 | VERIFY( u == 888 ); |
72 | ||
73 | for (int base = 2; base <= 36; ++base) | |
74 | { | |
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 ); | |
80 | VERIFY( i == 999 ); | |
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 ); | |
84 | VERIFY( i == 999 ); | |
85 | r = std::from_chars(buf, buf + 2, i, base); | |
86 | VERIFY( r.ec == std::errc::invalid_argument ); | |
87 | VERIFY( r.ptr == buf ); | |
88 | VERIFY( i == 999 ); | |
89 | } | |
90 | } | |
91 | ||
92 | void | |
93 | test02() | |
94 | { | |
95 | std::from_chars_result r; | |
c104e8f1 | 96 | std::string s; |
804b7cc4 JW |
97 | |
98 | signed char c = -5; | |
99 | s = "-10000001"; | |
c104e8f1 | 100 | r = std::from_chars(s.data(), s.data() + s.length(), c, 2); |
804b7cc4 | 101 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 102 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 103 | s = "-10000001*"; |
c104e8f1 | 104 | r = std::from_chars(s.data(), s.data() + s.length(), c, 2); |
804b7cc4 | 105 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 106 | VERIFY( r.ptr == s.data() + 9 ); |
804b7cc4 | 107 | s = "-10000001000*"; |
c104e8f1 | 108 | r = std::from_chars(s.data(), s.data() + s.length(), c, 2); |
804b7cc4 | 109 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 110 | VERIFY( r.ptr == s.data() + 12 ); |
804b7cc4 | 111 | s = "-129"; |
c104e8f1 | 112 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 113 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 114 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 115 | s = "-129*"; |
c104e8f1 | 116 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 117 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 118 | VERIFY( r.ptr == s.data() + 4 ); |
804b7cc4 | 119 | s = "-100"; |
c104e8f1 | 120 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 121 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 122 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 123 | s = "-100*"; |
c104e8f1 | 124 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 125 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 126 | VERIFY( r.ptr == s.data() + 4 ); |
804b7cc4 | 127 | s = "-81"; |
c104e8f1 | 128 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 129 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 130 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 131 | s = "-81*"; |
c104e8f1 | 132 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 133 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 134 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 135 | s = "128"; |
c104e8f1 | 136 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 137 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 138 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 139 | s = "128*"; |
c104e8f1 | 140 | r = std::from_chars(s.data(), s.data() + s.length(), c, 10); |
804b7cc4 | 141 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 142 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 143 | s = "80"; |
c104e8f1 | 144 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 145 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 146 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 147 | s = "80*"; |
c104e8f1 | 148 | r = std::from_chars(s.data(), s.data() + s.length(), c, 16); |
804b7cc4 | 149 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 150 | VERIFY( r.ptr == s.data() + 2 ); |
804b7cc4 JW |
151 | VERIFY( c == -5 ); |
152 | ||
153 | unsigned char uc = 9; | |
154 | s = "100000000"; | |
c104e8f1 | 155 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 2); |
804b7cc4 | 156 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 157 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 158 | s = "100000000*"; |
c104e8f1 | 159 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 2); |
804b7cc4 | 160 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 161 | VERIFY( r.ptr == s.data() + 9 ); |
804b7cc4 | 162 | s = "100000000000*"; |
c104e8f1 | 163 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 2); |
804b7cc4 | 164 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 165 | VERIFY( r.ptr == s.data() + 12 ); |
804b7cc4 | 166 | s = "256"; |
c104e8f1 | 167 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 10); |
804b7cc4 | 168 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 169 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 170 | s = "256**"; |
c104e8f1 | 171 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 10); |
804b7cc4 | 172 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 173 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 174 | s = "256000**"; |
c104e8f1 | 175 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 10); |
804b7cc4 | 176 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 177 | VERIFY( r.ptr == s.data() + 6 ); |
804b7cc4 | 178 | s = "100"; |
c104e8f1 | 179 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 16); |
804b7cc4 | 180 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 181 | VERIFY( r.ptr == s.data() + s.length() ); |
804b7cc4 | 182 | s = "100**"; |
c104e8f1 | 183 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 16); |
804b7cc4 | 184 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 185 | VERIFY( r.ptr == s.data() + 3 ); |
804b7cc4 | 186 | s = "100000**"; |
c104e8f1 | 187 | r = std::from_chars(s.data(), s.data() + s.length(), uc, 16); |
804b7cc4 | 188 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 189 | VERIFY( r.ptr == s.data() + 6 ); |
804b7cc4 JW |
190 | VERIFY( uc == 9 ); |
191 | ||
192 | unsigned long long ull = 123; | |
193 | s = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz****"; | |
c104e8f1 | 194 | r = std::from_chars(s.data(), s.data() + s.length(), ull, 36); |
804b7cc4 | 195 | VERIFY( r.ec == std::errc::result_out_of_range ); |
c104e8f1 | 196 | VERIFY( r.ptr == s.data() + 42 ); |
804b7cc4 JW |
197 | VERIFY( ull == 123 ); |
198 | } | |
199 | ||
200 | int | |
201 | main() | |
202 | { | |
203 | test01(); | |
204 | test02(); | |
205 | } |