1*71db0c75SAndroid Build Coastguard Worker //===-- A template class for testing strto* functions -----------*- C++ -*-===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker
9*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/limits.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/type_traits.h"
11*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/properties/architectures.h"
12*71db0c75SAndroid Build Coastguard Worker #include "src/errno/libc_errno.h"
13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
14*71db0c75SAndroid Build Coastguard Worker
15*71db0c75SAndroid Build Coastguard Worker #include <stddef.h>
16*71db0c75SAndroid Build Coastguard Worker
17*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::cpp::is_signed_v;
18*71db0c75SAndroid Build Coastguard Worker
int_to_b36_char(int input)19*71db0c75SAndroid Build Coastguard Worker static inline char int_to_b36_char(int input) {
20*71db0c75SAndroid Build Coastguard Worker if (input < 0 || input > 36)
21*71db0c75SAndroid Build Coastguard Worker return '0';
22*71db0c75SAndroid Build Coastguard Worker if (input < 10)
23*71db0c75SAndroid Build Coastguard Worker return static_cast<char>('0' + input);
24*71db0c75SAndroid Build Coastguard Worker return static_cast<char>('A' + input - 10);
25*71db0c75SAndroid Build Coastguard Worker }
26*71db0c75SAndroid Build Coastguard Worker
27*71db0c75SAndroid Build Coastguard Worker template <typename ReturnT>
28*71db0c75SAndroid Build Coastguard Worker struct StrtoTest : public LIBC_NAMESPACE::testing::Test {
29*71db0c75SAndroid Build Coastguard Worker using FunctionT = ReturnT (*)(const char *, char **, int);
30*71db0c75SAndroid Build Coastguard Worker
31*71db0c75SAndroid Build Coastguard Worker static constexpr ReturnT T_MAX =
32*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::cpp::numeric_limits<ReturnT>::max();
33*71db0c75SAndroid Build Coastguard Worker static constexpr ReturnT T_MIN =
34*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::cpp::numeric_limits<ReturnT>::min();
35*71db0c75SAndroid Build Coastguard Worker
InvalidBaseStrtoTest36*71db0c75SAndroid Build Coastguard Worker void InvalidBase(FunctionT func) {
37*71db0c75SAndroid Build Coastguard Worker const char *ten = "10";
38*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
39*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(ten, nullptr, -1), ReturnT(0));
40*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(EINVAL);
41*71db0c75SAndroid Build Coastguard Worker }
42*71db0c75SAndroid Build Coastguard Worker
CleanBaseTenDecodeStrtoTest43*71db0c75SAndroid Build Coastguard Worker void CleanBaseTenDecode(FunctionT func) {
44*71db0c75SAndroid Build Coastguard Worker char *str_end = nullptr;
45*71db0c75SAndroid Build Coastguard Worker
46*71db0c75SAndroid Build Coastguard Worker // TODO: Look into collapsing these repeated segments.
47*71db0c75SAndroid Build Coastguard Worker const char *ten = "10";
48*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
49*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(ten, &str_end, 10), ReturnT(10));
50*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
51*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - ten, ptrdiff_t(2));
52*71db0c75SAndroid Build Coastguard Worker
53*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
54*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(ten, nullptr, 10), ReturnT(10));
55*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
56*71db0c75SAndroid Build Coastguard Worker
57*71db0c75SAndroid Build Coastguard Worker const char *hundred = "100";
58*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
59*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(hundred, &str_end, 10), ReturnT(100));
60*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
61*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - hundred, ptrdiff_t(3));
62*71db0c75SAndroid Build Coastguard Worker
63*71db0c75SAndroid Build Coastguard Worker const char *big_number = "1234567890";
64*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
65*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(big_number, &str_end, 10), ReturnT(1234567890));
66*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
67*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - big_number, ptrdiff_t(10));
68*71db0c75SAndroid Build Coastguard Worker
69*71db0c75SAndroid Build Coastguard Worker // This number is larger than 2^32, meaning that if long is only 32 bits
70*71db0c75SAndroid Build Coastguard Worker // wide, strtol will return LONG_MAX.
71*71db0c75SAndroid Build Coastguard Worker const char *bigger_number = "12345678900";
72*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
73*71db0c75SAndroid Build Coastguard Worker if constexpr (sizeof(ReturnT) < 8) {
74*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(bigger_number, &str_end, 10), T_MAX);
75*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(ERANGE);
76*71db0c75SAndroid Build Coastguard Worker } else {
77*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(bigger_number, &str_end, 10), ReturnT(12345678900));
78*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
79*71db0c75SAndroid Build Coastguard Worker }
80*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - bigger_number, ptrdiff_t(11));
81*71db0c75SAndroid Build Coastguard Worker
82*71db0c75SAndroid Build Coastguard Worker const char *too_big_number = "123456789012345678901";
83*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
84*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(too_big_number, &str_end, 10), T_MAX);
85*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(ERANGE);
86*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - too_big_number, ptrdiff_t(21));
87*71db0c75SAndroid Build Coastguard Worker
88*71db0c75SAndroid Build Coastguard Worker const char *long_number_range_test =
89*71db0c75SAndroid Build Coastguard Worker "10000000000000000000000000000000000000000000000000";
90*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
91*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(long_number_range_test, &str_end, 10), T_MAX);
92*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(ERANGE);
93*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - long_number_range_test, ptrdiff_t(50));
94*71db0c75SAndroid Build Coastguard Worker
95*71db0c75SAndroid Build Coastguard Worker // For most negative numbers, the unsigned functions treat it the same as
96*71db0c75SAndroid Build Coastguard Worker // casting a negative variable to an unsigned type.
97*71db0c75SAndroid Build Coastguard Worker const char *negative = "-100";
98*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
99*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(negative, &str_end, 10), ReturnT(-100));
100*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
101*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - negative, ptrdiff_t(4));
102*71db0c75SAndroid Build Coastguard Worker
103*71db0c75SAndroid Build Coastguard Worker const char *big_negative_number = "-1234567890";
104*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
105*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(big_negative_number, &str_end, 10), ReturnT(-1234567890));
106*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
107*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - big_negative_number, ptrdiff_t(11));
108*71db0c75SAndroid Build Coastguard Worker
109*71db0c75SAndroid Build Coastguard Worker const char *too_big_negative_number = "-123456789012345678901";
110*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
111*71db0c75SAndroid Build Coastguard Worker // If the number is signed, it should return the smallest negative number
112*71db0c75SAndroid Build Coastguard Worker // for the current type, but if it's unsigned it should max out and return
113*71db0c75SAndroid Build Coastguard Worker // the largest positive number for the current type. From the standard:
114*71db0c75SAndroid Build Coastguard Worker // "If the correct value is outside the range of representable values,
115*71db0c75SAndroid Build Coastguard Worker // LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, ULONG_MAX, or ULLONG_MAX is
116*71db0c75SAndroid Build Coastguard Worker // returned"
117*71db0c75SAndroid Build Coastguard Worker // Note that 0 is not on that list.
118*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(too_big_negative_number, &str_end, 10),
119*71db0c75SAndroid Build Coastguard Worker (is_signed_v<ReturnT> ? T_MIN : T_MAX));
120*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(ERANGE);
121*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - too_big_negative_number, ptrdiff_t(22));
122*71db0c75SAndroid Build Coastguard Worker }
123*71db0c75SAndroid Build Coastguard Worker
MessyBaseTenDecodeStrtoTest124*71db0c75SAndroid Build Coastguard Worker void MessyBaseTenDecode(FunctionT func) {
125*71db0c75SAndroid Build Coastguard Worker char *str_end = nullptr;
126*71db0c75SAndroid Build Coastguard Worker
127*71db0c75SAndroid Build Coastguard Worker const char *spaces_before = " 10";
128*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
129*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(spaces_before, &str_end, 10), ReturnT(10));
130*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
131*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - spaces_before, ptrdiff_t(7));
132*71db0c75SAndroid Build Coastguard Worker
133*71db0c75SAndroid Build Coastguard Worker const char *spaces_after = "10 ";
134*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
135*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(spaces_after, &str_end, 10), ReturnT(10));
136*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
137*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - spaces_after, ptrdiff_t(2));
138*71db0c75SAndroid Build Coastguard Worker
139*71db0c75SAndroid Build Coastguard Worker const char *word_before = "word10";
140*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
141*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(word_before, &str_end, 10), ReturnT(0));
142*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
143*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - word_before, ptrdiff_t(0));
144*71db0c75SAndroid Build Coastguard Worker
145*71db0c75SAndroid Build Coastguard Worker const char *word_after = "10word";
146*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
147*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(word_after, &str_end, 10), ReturnT(10));
148*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
149*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - word_after, ptrdiff_t(2));
150*71db0c75SAndroid Build Coastguard Worker
151*71db0c75SAndroid Build Coastguard Worker const char *two_numbers = "10 999";
152*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
153*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(two_numbers, &str_end, 10), ReturnT(10));
154*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
155*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - two_numbers, ptrdiff_t(2));
156*71db0c75SAndroid Build Coastguard Worker
157*71db0c75SAndroid Build Coastguard Worker const char *two_signs = "--10 999";
158*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
159*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(two_signs, &str_end, 10), ReturnT(0));
160*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
161*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - two_signs, ptrdiff_t(0));
162*71db0c75SAndroid Build Coastguard Worker
163*71db0c75SAndroid Build Coastguard Worker const char *sign_before = "+2=4";
164*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
165*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(sign_before, &str_end, 10), ReturnT(2));
166*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
167*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - sign_before, ptrdiff_t(2));
168*71db0c75SAndroid Build Coastguard Worker
169*71db0c75SAndroid Build Coastguard Worker const char *sign_after = "2+2=4";
170*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
171*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(sign_after, &str_end, 10), ReturnT(2));
172*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
173*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - sign_after, ptrdiff_t(1));
174*71db0c75SAndroid Build Coastguard Worker
175*71db0c75SAndroid Build Coastguard Worker const char *tab_before = "\t10";
176*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
177*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(tab_before, &str_end, 10), ReturnT(10));
178*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
179*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - tab_before, ptrdiff_t(3));
180*71db0c75SAndroid Build Coastguard Worker
181*71db0c75SAndroid Build Coastguard Worker const char *all_together = "\t -12345and+67890";
182*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
183*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(all_together, &str_end, 10), ReturnT(-12345));
184*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
185*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - all_together, ptrdiff_t(9));
186*71db0c75SAndroid Build Coastguard Worker
187*71db0c75SAndroid Build Coastguard Worker const char *just_spaces = " ";
188*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
189*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(just_spaces, &str_end, 10), ReturnT(0));
190*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
191*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - just_spaces, ptrdiff_t(0));
192*71db0c75SAndroid Build Coastguard Worker
193*71db0c75SAndroid Build Coastguard Worker const char *just_space_and_sign = " +";
194*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
195*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(just_space_and_sign, &str_end, 10), ReturnT(0));
196*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
197*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - just_space_and_sign, ptrdiff_t(0));
198*71db0c75SAndroid Build Coastguard Worker }
199*71db0c75SAndroid Build Coastguard Worker
DecodeInOtherBasesStrtoTest200*71db0c75SAndroid Build Coastguard Worker void DecodeInOtherBases(FunctionT func) {
201*71db0c75SAndroid Build Coastguard Worker // This test is excessively slow on the GPU, so we limit the innermost loop.
202*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TARGET_ARCH_IS_GPU)
203*71db0c75SAndroid Build Coastguard Worker constexpr int limit = 0;
204*71db0c75SAndroid Build Coastguard Worker #else
205*71db0c75SAndroid Build Coastguard Worker constexpr int limit = 36;
206*71db0c75SAndroid Build Coastguard Worker #endif
207*71db0c75SAndroid Build Coastguard Worker char small_string[4] = {'\0', '\0', '\0', '\0'};
208*71db0c75SAndroid Build Coastguard Worker for (int base = 2; base <= 36; ++base) {
209*71db0c75SAndroid Build Coastguard Worker for (int first_digit = 0; first_digit <= 36; ++first_digit) {
210*71db0c75SAndroid Build Coastguard Worker small_string[0] = int_to_b36_char(first_digit);
211*71db0c75SAndroid Build Coastguard Worker if (first_digit < base) {
212*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
213*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base),
214*71db0c75SAndroid Build Coastguard Worker static_cast<ReturnT>(first_digit));
215*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
216*71db0c75SAndroid Build Coastguard Worker } else {
217*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
218*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base), ReturnT(0));
219*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
220*71db0c75SAndroid Build Coastguard Worker }
221*71db0c75SAndroid Build Coastguard Worker }
222*71db0c75SAndroid Build Coastguard Worker }
223*71db0c75SAndroid Build Coastguard Worker
224*71db0c75SAndroid Build Coastguard Worker for (int base = 2; base <= 36; ++base) {
225*71db0c75SAndroid Build Coastguard Worker for (int first_digit = 0; first_digit <= 36; ++first_digit) {
226*71db0c75SAndroid Build Coastguard Worker small_string[0] = int_to_b36_char(first_digit);
227*71db0c75SAndroid Build Coastguard Worker for (int second_digit = 0; second_digit <= 36; ++second_digit) {
228*71db0c75SAndroid Build Coastguard Worker small_string[1] = int_to_b36_char(second_digit);
229*71db0c75SAndroid Build Coastguard Worker if (first_digit < base && second_digit < base) {
230*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
231*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(
232*71db0c75SAndroid Build Coastguard Worker func(small_string, nullptr, base),
233*71db0c75SAndroid Build Coastguard Worker static_cast<ReturnT>(second_digit + (first_digit * base)));
234*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
235*71db0c75SAndroid Build Coastguard Worker } else if (first_digit < base) {
236*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
237*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base),
238*71db0c75SAndroid Build Coastguard Worker static_cast<ReturnT>(first_digit));
239*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
240*71db0c75SAndroid Build Coastguard Worker } else {
241*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
242*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base), ReturnT(0));
243*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
244*71db0c75SAndroid Build Coastguard Worker }
245*71db0c75SAndroid Build Coastguard Worker }
246*71db0c75SAndroid Build Coastguard Worker }
247*71db0c75SAndroid Build Coastguard Worker }
248*71db0c75SAndroid Build Coastguard Worker
249*71db0c75SAndroid Build Coastguard Worker for (int base = 2; base <= 36; ++base) {
250*71db0c75SAndroid Build Coastguard Worker for (int first_digit = 0; first_digit <= 36; ++first_digit) {
251*71db0c75SAndroid Build Coastguard Worker small_string[0] = int_to_b36_char(first_digit);
252*71db0c75SAndroid Build Coastguard Worker for (int second_digit = 0; second_digit <= 36; ++second_digit) {
253*71db0c75SAndroid Build Coastguard Worker small_string[1] = int_to_b36_char(second_digit);
254*71db0c75SAndroid Build Coastguard Worker for (int third_digit = 0; third_digit <= limit; ++third_digit) {
255*71db0c75SAndroid Build Coastguard Worker small_string[2] = int_to_b36_char(third_digit);
256*71db0c75SAndroid Build Coastguard Worker
257*71db0c75SAndroid Build Coastguard Worker if (first_digit < base && second_digit < base &&
258*71db0c75SAndroid Build Coastguard Worker third_digit < base) {
259*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
260*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base),
261*71db0c75SAndroid Build Coastguard Worker static_cast<ReturnT>(third_digit +
262*71db0c75SAndroid Build Coastguard Worker (second_digit * base) +
263*71db0c75SAndroid Build Coastguard Worker (first_digit * base * base)));
264*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
265*71db0c75SAndroid Build Coastguard Worker } else if (first_digit < base && second_digit < base) {
266*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
267*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(
268*71db0c75SAndroid Build Coastguard Worker func(small_string, nullptr, base),
269*71db0c75SAndroid Build Coastguard Worker static_cast<ReturnT>(second_digit + (first_digit * base)));
270*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
271*71db0c75SAndroid Build Coastguard Worker } else if (first_digit < base) {
272*71db0c75SAndroid Build Coastguard Worker // if the base is 16 there is a special case for the prefix 0X.
273*71db0c75SAndroid Build Coastguard Worker // The number is treated as a one digit hexadecimal.
274*71db0c75SAndroid Build Coastguard Worker if (base == 16 && first_digit == 0 && second_digit == 33) {
275*71db0c75SAndroid Build Coastguard Worker if (third_digit < base) {
276*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
277*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base),
278*71db0c75SAndroid Build Coastguard Worker static_cast<ReturnT>(third_digit));
279*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
280*71db0c75SAndroid Build Coastguard Worker } else {
281*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
282*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base), ReturnT(0));
283*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
284*71db0c75SAndroid Build Coastguard Worker }
285*71db0c75SAndroid Build Coastguard Worker } else {
286*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
287*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base),
288*71db0c75SAndroid Build Coastguard Worker static_cast<ReturnT>(first_digit));
289*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
290*71db0c75SAndroid Build Coastguard Worker }
291*71db0c75SAndroid Build Coastguard Worker } else {
292*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
293*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(small_string, nullptr, base), ReturnT(0));
294*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
295*71db0c75SAndroid Build Coastguard Worker }
296*71db0c75SAndroid Build Coastguard Worker }
297*71db0c75SAndroid Build Coastguard Worker }
298*71db0c75SAndroid Build Coastguard Worker }
299*71db0c75SAndroid Build Coastguard Worker }
300*71db0c75SAndroid Build Coastguard Worker }
301*71db0c75SAndroid Build Coastguard Worker
CleanBaseSixteenDecodeStrtoTest302*71db0c75SAndroid Build Coastguard Worker void CleanBaseSixteenDecode(FunctionT func) {
303*71db0c75SAndroid Build Coastguard Worker char *str_end = nullptr;
304*71db0c75SAndroid Build Coastguard Worker
305*71db0c75SAndroid Build Coastguard Worker const char *no_prefix = "123abc";
306*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
307*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(no_prefix, &str_end, 16), ReturnT(0x123abc));
308*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
309*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - no_prefix, ptrdiff_t(6));
310*71db0c75SAndroid Build Coastguard Worker
311*71db0c75SAndroid Build Coastguard Worker const char *yes_prefix = "0x456def";
312*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
313*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(yes_prefix, &str_end, 16), ReturnT(0x456def));
314*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
315*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - yes_prefix, ptrdiff_t(8));
316*71db0c75SAndroid Build Coastguard Worker
317*71db0c75SAndroid Build Coastguard Worker const char *letter_after_prefix = "0xabc123";
318*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
319*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(letter_after_prefix, &str_end, 16), ReturnT(0xabc123));
320*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
321*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - letter_after_prefix, ptrdiff_t(8));
322*71db0c75SAndroid Build Coastguard Worker
323*71db0c75SAndroid Build Coastguard Worker // These tests check what happens when the number passed is exactly the max
324*71db0c75SAndroid Build Coastguard Worker // value for the conversion.
325*71db0c75SAndroid Build Coastguard Worker
326*71db0c75SAndroid Build Coastguard Worker // Max size for unsigned 32 bit numbers
327*71db0c75SAndroid Build Coastguard Worker
328*71db0c75SAndroid Build Coastguard Worker const char *max_32_bit_value = "0xFFFFFFFF";
329*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
330*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(max_32_bit_value, &str_end, 0),
331*71db0c75SAndroid Build Coastguard Worker ((is_signed_v<ReturnT> && sizeof(ReturnT) == 4)
332*71db0c75SAndroid Build Coastguard Worker ? T_MAX
333*71db0c75SAndroid Build Coastguard Worker : ReturnT(0xFFFFFFFF)));
334*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(is_signed_v<ReturnT> && sizeof(ReturnT) == 4 ? ERANGE : 0);
335*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - max_32_bit_value, ptrdiff_t(10));
336*71db0c75SAndroid Build Coastguard Worker
337*71db0c75SAndroid Build Coastguard Worker const char *negative_max_32_bit_value = "-0xFFFFFFFF";
338*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
339*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(negative_max_32_bit_value, &str_end, 0),
340*71db0c75SAndroid Build Coastguard Worker ((is_signed_v<ReturnT> && sizeof(ReturnT) == 4)
341*71db0c75SAndroid Build Coastguard Worker ? T_MIN
342*71db0c75SAndroid Build Coastguard Worker : -ReturnT(0xFFFFFFFF)));
343*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(is_signed_v<ReturnT> && sizeof(ReturnT) == 4 ? ERANGE : 0);
344*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - negative_max_32_bit_value, ptrdiff_t(11));
345*71db0c75SAndroid Build Coastguard Worker
346*71db0c75SAndroid Build Coastguard Worker // Max size for signed 32 bit numbers
347*71db0c75SAndroid Build Coastguard Worker
348*71db0c75SAndroid Build Coastguard Worker const char *max_31_bit_value = "0x7FFFFFFF";
349*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
350*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(max_31_bit_value, &str_end, 0), ReturnT(0x7FFFFFFF));
351*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
352*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - max_31_bit_value, ptrdiff_t(10));
353*71db0c75SAndroid Build Coastguard Worker
354*71db0c75SAndroid Build Coastguard Worker const char *negative_max_31_bit_value = "-0x7FFFFFFF";
355*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
356*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(negative_max_31_bit_value, &str_end, 0),
357*71db0c75SAndroid Build Coastguard Worker -ReturnT(0x7FFFFFFF));
358*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
359*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - negative_max_31_bit_value, ptrdiff_t(11));
360*71db0c75SAndroid Build Coastguard Worker
361*71db0c75SAndroid Build Coastguard Worker // Max size for unsigned 64 bit numbers
362*71db0c75SAndroid Build Coastguard Worker
363*71db0c75SAndroid Build Coastguard Worker const char *max_64_bit_value = "0xFFFFFFFFFFFFFFFF";
364*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
365*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(max_64_bit_value, &str_end, 0),
366*71db0c75SAndroid Build Coastguard Worker (is_signed_v<ReturnT> || sizeof(ReturnT) < 8
367*71db0c75SAndroid Build Coastguard Worker ? T_MAX
368*71db0c75SAndroid Build Coastguard Worker : ReturnT(0xFFFFFFFFFFFFFFFF)));
369*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ((is_signed_v<ReturnT> || sizeof(ReturnT) < 8 ? ERANGE : 0));
370*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - max_64_bit_value, ptrdiff_t(18));
371*71db0c75SAndroid Build Coastguard Worker
372*71db0c75SAndroid Build Coastguard Worker // See the end of CleanBase10Decode for an explanation of how this large
373*71db0c75SAndroid Build Coastguard Worker // negative number can end up as T_MAX.
374*71db0c75SAndroid Build Coastguard Worker const char *negative_max_64_bit_value = "-0xFFFFFFFFFFFFFFFF";
375*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
376*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(
377*71db0c75SAndroid Build Coastguard Worker func(negative_max_64_bit_value, &str_end, 0),
378*71db0c75SAndroid Build Coastguard Worker (is_signed_v<ReturnT>
379*71db0c75SAndroid Build Coastguard Worker ? T_MIN
380*71db0c75SAndroid Build Coastguard Worker : (sizeof(ReturnT) < 8 ? T_MAX : -ReturnT(0xFFFFFFFFFFFFFFFF))));
381*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ((is_signed_v<ReturnT> || sizeof(ReturnT) < 8 ? ERANGE : 0));
382*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - negative_max_64_bit_value, ptrdiff_t(19));
383*71db0c75SAndroid Build Coastguard Worker
384*71db0c75SAndroid Build Coastguard Worker // Max size for signed 64 bit numbers
385*71db0c75SAndroid Build Coastguard Worker
386*71db0c75SAndroid Build Coastguard Worker const char *max_63_bit_value = "0x7FFFFFFFFFFFFFFF";
387*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
388*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(max_63_bit_value, &str_end, 0),
389*71db0c75SAndroid Build Coastguard Worker (sizeof(ReturnT) < 8 ? T_MAX : ReturnT(0x7FFFFFFFFFFFFFFF)));
390*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(sizeof(ReturnT) < 8 ? ERANGE : 0);
391*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - max_63_bit_value, ptrdiff_t(18));
392*71db0c75SAndroid Build Coastguard Worker
393*71db0c75SAndroid Build Coastguard Worker const char *negative_max_63_bit_value = "-0x7FFFFFFFFFFFFFFF";
394*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
395*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(negative_max_63_bit_value, &str_end, 0),
396*71db0c75SAndroid Build Coastguard Worker (sizeof(ReturnT) >= 8 ? -ReturnT(0x7FFFFFFFFFFFFFFF)
397*71db0c75SAndroid Build Coastguard Worker : (is_signed_v<ReturnT> ? T_MIN : T_MAX)));
398*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(sizeof(ReturnT) < 8 ? ERANGE : 0);
399*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - negative_max_63_bit_value, ptrdiff_t(19));
400*71db0c75SAndroid Build Coastguard Worker }
401*71db0c75SAndroid Build Coastguard Worker
MessyBaseSixteenDecodeStrtoTest402*71db0c75SAndroid Build Coastguard Worker void MessyBaseSixteenDecode(FunctionT func) {
403*71db0c75SAndroid Build Coastguard Worker char *str_end = nullptr;
404*71db0c75SAndroid Build Coastguard Worker
405*71db0c75SAndroid Build Coastguard Worker const char *just_prefix = "0x";
406*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
407*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(just_prefix, &str_end, 16), ReturnT(0));
408*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
409*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
410*71db0c75SAndroid Build Coastguard Worker
411*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
412*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(just_prefix, &str_end, 0), ReturnT(0));
413*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
414*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - just_prefix, ptrdiff_t(1));
415*71db0c75SAndroid Build Coastguard Worker
416*71db0c75SAndroid Build Coastguard Worker const char *prefix_with_x_after = "0xx";
417*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
418*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(prefix_with_x_after, &str_end, 16), ReturnT(0));
419*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
420*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
421*71db0c75SAndroid Build Coastguard Worker
422*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
423*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(prefix_with_x_after, &str_end, 0), ReturnT(0));
424*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
425*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - prefix_with_x_after, ptrdiff_t(1));
426*71db0c75SAndroid Build Coastguard Worker }
427*71db0c75SAndroid Build Coastguard Worker
AutomaticBaseSelectionStrtoTest428*71db0c75SAndroid Build Coastguard Worker void AutomaticBaseSelection(FunctionT func) {
429*71db0c75SAndroid Build Coastguard Worker char *str_end = nullptr;
430*71db0c75SAndroid Build Coastguard Worker
431*71db0c75SAndroid Build Coastguard Worker const char *base_ten = "12345";
432*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
433*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(base_ten, &str_end, 0), ReturnT(12345));
434*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
435*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - base_ten, ptrdiff_t(5));
436*71db0c75SAndroid Build Coastguard Worker
437*71db0c75SAndroid Build Coastguard Worker const char *base_sixteen_no_prefix = "123abc";
438*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
439*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(base_sixteen_no_prefix, &str_end, 0), ReturnT(123));
440*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
441*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - base_sixteen_no_prefix, ptrdiff_t(3));
442*71db0c75SAndroid Build Coastguard Worker
443*71db0c75SAndroid Build Coastguard Worker const char *base_sixteen_with_prefix = "0x456def";
444*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
445*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(base_sixteen_with_prefix, &str_end, 0), ReturnT(0x456def));
446*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
447*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - base_sixteen_with_prefix, ptrdiff_t(8));
448*71db0c75SAndroid Build Coastguard Worker
449*71db0c75SAndroid Build Coastguard Worker const char *base_eight_with_prefix = "012345";
450*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
451*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(base_eight_with_prefix, &str_end, 0), ReturnT(012345));
452*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
453*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - base_eight_with_prefix, ptrdiff_t(6));
454*71db0c75SAndroid Build Coastguard Worker
455*71db0c75SAndroid Build Coastguard Worker const char *just_zero = "0";
456*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
457*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(just_zero, &str_end, 0), ReturnT(0));
458*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
459*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - just_zero, ptrdiff_t(1));
460*71db0c75SAndroid Build Coastguard Worker
461*71db0c75SAndroid Build Coastguard Worker const char *just_zero_x = "0x";
462*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
463*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(just_zero_x, &str_end, 0), ReturnT(0));
464*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
465*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - just_zero_x, ptrdiff_t(1));
466*71db0c75SAndroid Build Coastguard Worker
467*71db0c75SAndroid Build Coastguard Worker const char *just_zero_eight = "08";
468*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
469*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(func(just_zero_eight, &str_end, 0), ReturnT(0));
470*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_SUCCESS();
471*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - just_zero_eight, ptrdiff_t(1));
472*71db0c75SAndroid Build Coastguard Worker }
473*71db0c75SAndroid Build Coastguard Worker };
474*71db0c75SAndroid Build Coastguard Worker
475*71db0c75SAndroid Build Coastguard Worker template <typename ReturnType>
476*71db0c75SAndroid Build Coastguard Worker StrtoTest(ReturnType (*)(const char *)) -> StrtoTest<ReturnType>;
477*71db0c75SAndroid Build Coastguard Worker
478*71db0c75SAndroid Build Coastguard Worker #define STRTOL_TEST(name, func) \
479*71db0c75SAndroid Build Coastguard Worker using LlvmLibc##name##Test = StrtoTest<decltype(func("", nullptr, 0))>; \
480*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, InvalidBase) { InvalidBase(func); } \
481*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, CleanBaseTenDecode) { \
482*71db0c75SAndroid Build Coastguard Worker CleanBaseTenDecode(func); \
483*71db0c75SAndroid Build Coastguard Worker } \
484*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, MessyBaseTenDecode) { \
485*71db0c75SAndroid Build Coastguard Worker MessyBaseTenDecode(func); \
486*71db0c75SAndroid Build Coastguard Worker } \
487*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, DecodeInOtherBases) { \
488*71db0c75SAndroid Build Coastguard Worker DecodeInOtherBases(func); \
489*71db0c75SAndroid Build Coastguard Worker } \
490*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, CleanBaseSixteenDecode) { \
491*71db0c75SAndroid Build Coastguard Worker CleanBaseSixteenDecode(func); \
492*71db0c75SAndroid Build Coastguard Worker } \
493*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, MessyBaseSixteenDecode) { \
494*71db0c75SAndroid Build Coastguard Worker MessyBaseSixteenDecode(func); \
495*71db0c75SAndroid Build Coastguard Worker } \
496*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, AutomaticBaseSelection) { \
497*71db0c75SAndroid Build Coastguard Worker AutomaticBaseSelection(func); \
498*71db0c75SAndroid Build Coastguard Worker }
499