]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/20_util/from_chars/2.cc
libstdc++: Restore ability to use <charconv> in C++14 (PR 94520)
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 20_util / from_chars / 2.cc
CommitLineData
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
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
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
92void
93test02()
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
200int
201main()
202{
203 test01();
204 test02();
205}