]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/20_util/from_chars/2.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 20_util / from_chars / 2.cc
CommitLineData
a945c346 1// Copyright (C) 2017-2024 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
27void
28test01()
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
103void
104test02()
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
211int
212main()
213{
214 test01();
215 test02();
216}