xref: /llvm-project/libc/test/src/__support/integer_literals_test.cpp (revision 04aaa35d40d8c5ff030014866691f9a56e59c142)
103232350SGuillaume Chatelet //===-- Unittests for user defined integer literals -----------------------===//
203232350SGuillaume Chatelet //
303232350SGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
403232350SGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information.
503232350SGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
603232350SGuillaume Chatelet //
703232350SGuillaume Chatelet //===----------------------------------------------------------------------===//
803232350SGuillaume Chatelet 
903232350SGuillaume Chatelet #include "src/__support/integer_literals.h"
1023c397c7SGuillaume Chatelet #include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128
1103232350SGuillaume Chatelet #include "test/UnitTest/Test.h"
1203232350SGuillaume Chatelet 
1303232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u8;
1403232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u16;
1503232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u32;
1603232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u64;
1703232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u128;
1803232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u256;
1903232350SGuillaume Chatelet 
2003232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u8) {
2103232350SGuillaume Chatelet   EXPECT_EQ(uint8_t(0), 0_u8);
2203232350SGuillaume Chatelet   EXPECT_EQ(uint8_t(UINT8_MAX), 255_u8);
2303232350SGuillaume Chatelet   EXPECT_EQ(uint8_t(UINT8_MAX), 0xFF_u8);
2403232350SGuillaume Chatelet   EXPECT_EQ(uint8_t(UINT8_MAX), 0b11111111_u8);
2503232350SGuillaume Chatelet }
2603232350SGuillaume Chatelet 
2703232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u16) {
2803232350SGuillaume Chatelet   EXPECT_EQ(uint16_t(0), 0_u16);
2903232350SGuillaume Chatelet   EXPECT_EQ(uint16_t(UINT8_MAX), 255_u16);
3003232350SGuillaume Chatelet   EXPECT_EQ(uint16_t(UINT8_MAX), 0xFF_u16);
3103232350SGuillaume Chatelet   EXPECT_EQ(uint16_t(UINT8_MAX), 0b11111111_u16);
3203232350SGuillaume Chatelet   EXPECT_EQ(uint16_t(UINT16_MAX), 65535_u16);
3303232350SGuillaume Chatelet   EXPECT_EQ(uint16_t(UINT16_MAX), 0xFFFF_u16);
3403232350SGuillaume Chatelet   EXPECT_EQ(uint16_t(UINT16_MAX), 0b11111111'11111111_u16);
3503232350SGuillaume Chatelet }
3603232350SGuillaume Chatelet 
3703232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u32) {
3803232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(0), 0_u32);
3903232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT8_MAX), 255_u32);
4003232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT8_MAX), 0xFF_u32);
4103232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT8_MAX), 0b11111111_u32);
4203232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT16_MAX), 65535_u32);
4303232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT16_MAX), 0xFFFF_u32);
4403232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT16_MAX), 0b11111111'11111111_u32);
4503232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT32_MAX), 4294967295_u32);
4603232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT32_MAX), 0xFFFFFFFF_u32);
4703232350SGuillaume Chatelet   EXPECT_EQ(uint32_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u32);
4803232350SGuillaume Chatelet }
4903232350SGuillaume Chatelet 
5003232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u64) {
5103232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(0), 0_u64);
5203232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT8_MAX), 255_u64);
5303232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT8_MAX), 0xFF_u64);
5403232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT8_MAX), 0b11111111_u64);
5503232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT16_MAX), 65535_u64);
5603232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT16_MAX), 0xFFFF_u64);
5703232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT16_MAX), 0b11111111'11111111_u64);
5803232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT32_MAX), 4294967295_u64);
5903232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT32_MAX), 0xFFFFFFFF_u64);
6003232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u64);
6103232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT64_MAX), 18446744073709551615_u64);
6203232350SGuillaume Chatelet   EXPECT_EQ(uint64_t(UINT64_MAX), 0xFFFFFFFF'FFFFFFFF_u64);
6303232350SGuillaume Chatelet   EXPECT_EQ(
6403232350SGuillaume Chatelet       uint64_t(UINT64_MAX),
6503232350SGuillaume Chatelet       0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u64);
6603232350SGuillaume Chatelet }
6703232350SGuillaume Chatelet 
6803232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u128) {
6923c397c7SGuillaume Chatelet #ifdef LIBC_TYPES_HAS_INT128
7003232350SGuillaume Chatelet   const __uint128_t ZERO = 0;
7103232350SGuillaume Chatelet   const __uint128_t U8_MAX = UINT8_MAX;
7203232350SGuillaume Chatelet   const __uint128_t U16_MAX = UINT16_MAX;
7303232350SGuillaume Chatelet   const __uint128_t U32_MAX = UINT32_MAX;
7403232350SGuillaume Chatelet   const __uint128_t U64_MAX = UINT64_MAX;
7503232350SGuillaume Chatelet   const __uint128_t U128_MAX = (U64_MAX << 64) | U64_MAX;
7603232350SGuillaume Chatelet #else
7703232350SGuillaume Chatelet   const UInt128 ZERO = 0;
7803232350SGuillaume Chatelet   const UInt128 U8_MAX = UINT8_MAX;
7903232350SGuillaume Chatelet   const UInt128 U16_MAX = UINT16_MAX;
8003232350SGuillaume Chatelet   const UInt128 U32_MAX = UINT32_MAX;
8103232350SGuillaume Chatelet   const UInt128 U64_MAX = UINT64_MAX;
8203232350SGuillaume Chatelet   const UInt128 U128_MAX = (U64_MAX << 64) | U64_MAX;
8323c397c7SGuillaume Chatelet #endif // LIBC_TYPES_HAS_INT128
8403232350SGuillaume Chatelet   EXPECT_EQ(ZERO, 0_u128);
8503232350SGuillaume Chatelet   EXPECT_EQ(U8_MAX, 255_u128);
8603232350SGuillaume Chatelet   EXPECT_EQ(U8_MAX, 0xFF_u128);
8703232350SGuillaume Chatelet   EXPECT_EQ(U8_MAX, 0b11111111_u128);
8803232350SGuillaume Chatelet   EXPECT_EQ(U16_MAX, 65535_u128);
8903232350SGuillaume Chatelet   EXPECT_EQ(U16_MAX, 0xFFFF_u128);
9003232350SGuillaume Chatelet   EXPECT_EQ(U16_MAX, 0b11111111'11111111_u128);
9103232350SGuillaume Chatelet   EXPECT_EQ(U32_MAX, 4294967295_u128);
9203232350SGuillaume Chatelet   EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u128);
9303232350SGuillaume Chatelet   EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u128);
9403232350SGuillaume Chatelet   EXPECT_EQ(U64_MAX, 18446744073709551615_u128);
9503232350SGuillaume Chatelet   EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u128);
9603232350SGuillaume Chatelet   EXPECT_EQ(
9703232350SGuillaume Chatelet       U64_MAX,
9803232350SGuillaume Chatelet       0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128);
9903232350SGuillaume Chatelet   EXPECT_EQ(U128_MAX, 340282366920938463463374607431768211455_u128);
10003232350SGuillaume Chatelet   EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u128);
10103232350SGuillaume Chatelet   EXPECT_EQ(
10203232350SGuillaume Chatelet       U128_MAX,
10303232350SGuillaume Chatelet       0b1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128);
10403232350SGuillaume Chatelet }
10503232350SGuillaume Chatelet 
10603232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u256) {
1076a8e6c9aSGuillaume Chatelet   using UInt256 = LIBC_NAMESPACE::UInt<256>;
10803232350SGuillaume Chatelet   const UInt256 ZERO = 0;
10903232350SGuillaume Chatelet   const UInt256 U8_MAX = UINT8_MAX;
11003232350SGuillaume Chatelet   const UInt256 U16_MAX = UINT16_MAX;
11103232350SGuillaume Chatelet   const UInt256 U32_MAX = UINT32_MAX;
11203232350SGuillaume Chatelet   const UInt256 U64_MAX = UINT64_MAX;
11303232350SGuillaume Chatelet   const UInt256 U128_MAX = (U64_MAX << 64) | U64_MAX;
11403232350SGuillaume Chatelet   const UInt256 U256_MAX = (U128_MAX << 128) | U128_MAX;
11503232350SGuillaume Chatelet   EXPECT_EQ(ZERO, 0_u256);
11603232350SGuillaume Chatelet   EXPECT_EQ(U8_MAX, 255_u256);
11703232350SGuillaume Chatelet   EXPECT_EQ(U8_MAX, 0xFF_u256);
11803232350SGuillaume Chatelet   EXPECT_EQ(U8_MAX, 0b11111111_u256);
11903232350SGuillaume Chatelet   EXPECT_EQ(U16_MAX, 65535_u256);
12003232350SGuillaume Chatelet   EXPECT_EQ(U16_MAX, 0xFFFF_u256);
12103232350SGuillaume Chatelet   EXPECT_EQ(U16_MAX, 0b11111111'11111111_u256);
12203232350SGuillaume Chatelet   EXPECT_EQ(U32_MAX, 4294967295_u256);
12303232350SGuillaume Chatelet   EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u256);
12403232350SGuillaume Chatelet   EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u256);
12503232350SGuillaume Chatelet   EXPECT_EQ(U64_MAX, 18446744073709551615_u256);
12603232350SGuillaume Chatelet   EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u256);
12703232350SGuillaume Chatelet   EXPECT_EQ(
12803232350SGuillaume Chatelet       U64_MAX,
12903232350SGuillaume Chatelet       0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u256);
13003232350SGuillaume Chatelet   EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256);
13103232350SGuillaume Chatelet   EXPECT_EQ(
13203232350SGuillaume Chatelet       U256_MAX,
13303232350SGuillaume Chatelet       0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256);
13403232350SGuillaume Chatelet }
135*71c3f5d6SGuillaume Chatelet 
136*71c3f5d6SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, parse_bigint) {
137*71c3f5d6SGuillaume Chatelet   using T = LIBC_NAMESPACE::Int<128>;
138*71c3f5d6SGuillaume Chatelet   struct {
139*71c3f5d6SGuillaume Chatelet     const char *str;
140*71c3f5d6SGuillaume Chatelet     T expected;
141*71c3f5d6SGuillaume Chatelet   } constexpr TEST_CASES[] = {
142*71c3f5d6SGuillaume Chatelet       {"0", 0}, {"-1", -1}, {"+1", 1}, {"-0xFF", -255}, {"-0b11", -3},
143*71c3f5d6SGuillaume Chatelet   };
144*71c3f5d6SGuillaume Chatelet   for (auto tc : TEST_CASES) {
145*71c3f5d6SGuillaume Chatelet     T actual = LIBC_NAMESPACE::parse_bigint<T>(tc.str);
146*71c3f5d6SGuillaume Chatelet     EXPECT_EQ(actual, tc.expected);
147*71c3f5d6SGuillaume Chatelet   }
148*71c3f5d6SGuillaume Chatelet }
149*71c3f5d6SGuillaume Chatelet 
150*71c3f5d6SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, parse_bigint_invalid) {
151*71c3f5d6SGuillaume Chatelet   using T = LIBC_NAMESPACE::Int<128>;
152*71c3f5d6SGuillaume Chatelet   const T expected; // default construction
153*71c3f5d6SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(nullptr), expected);
154*71c3f5d6SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(""), expected);
155*71c3f5d6SGuillaume Chatelet }
156