
This exposes _BitInt literal suffixes __wb and u__wb as an extension in C++. There is a new Extension warning, and the tests are essentially the same as the existing _BitInt literal tests for C but with a few additional cases. Fixes #85223
179 lines
6.3 KiB
C++
179 lines
6.3 KiB
C++
// RUN: %clang_cc1 -triple aarch64-unknown-unknown -fsyntax-only -verify -Wno-unused %s
|
|
|
|
// Test that the preprocessor behavior makes sense.
|
|
#if 1__wb != 1
|
|
#error "wb suffix must be recognized by preprocessor"
|
|
#endif
|
|
#if 1__uwb != 1
|
|
#error "uwb suffix must be recognized by preprocessor"
|
|
#endif
|
|
#if !(-1__wb < 0)
|
|
#error "wb suffix must be interpreted as signed"
|
|
#endif
|
|
#if !(-1__uwb > 0)
|
|
#error "uwb suffix must be interpreted as unsigned"
|
|
#endif
|
|
|
|
#if 18446744073709551615__uwb != 18446744073709551615ULL
|
|
#error "expected the max value for uintmax_t to compare equal"
|
|
#endif
|
|
|
|
// Test that the preprocessor gives appropriate diagnostics when the
|
|
// literal value is larger than what can be stored in a [u]intmax_t.
|
|
#if 18446744073709551616__wb != 0ULL // expected-error {{integer literal is too large to be represented in any integer type}}
|
|
#error "never expected to get here due to error"
|
|
#endif
|
|
#if 18446744073709551616__uwb != 0ULL // expected-error {{integer literal is too large to be represented in any integer type}}
|
|
#error "never expected to get here due to error"
|
|
#endif
|
|
|
|
// Despite using a bit-precise integer, this is expected to overflow
|
|
// because all preprocessor arithmetic is done in [u]intmax_t, so this
|
|
// should result in the value 0.
|
|
#if 18446744073709551615__uwb + 1 != 0ULL
|
|
#error "expected modulo arithmetic with uintmax_t width"
|
|
#endif
|
|
|
|
// Because this bit-precise integer is signed, it will also overflow,
|
|
// but Clang handles that by converting to uintmax_t instead of
|
|
// intmax_t.
|
|
#if 18446744073709551615__wb + 1 != 0LL // expected-warning {{integer literal is too large to be represented in a signed integer type, interpreting as unsigned}}
|
|
#error "expected modulo arithmetic with uintmax_t width"
|
|
#endif
|
|
|
|
// Test that just because the preprocessor can't figure out the bit
|
|
// width doesn't mean we can't form the constant, it just means we
|
|
// can't use the value in a preprocessor conditional.
|
|
unsigned _BitInt(65) Val = 18446744073709551616__uwb;
|
|
// UDL test to make sure underscore parsing is correct
|
|
unsigned operator ""_(const char *);
|
|
|
|
void ValidSuffix(void) {
|
|
// Decimal literals.
|
|
1__wb;
|
|
1__WB;
|
|
-1__wb;
|
|
_Static_assert((int)1__wb == 1, "not 1?");
|
|
_Static_assert((int)-1__wb == -1, "not -1?");
|
|
|
|
1__uwb;
|
|
1__uWB;
|
|
1__Uwb;
|
|
1__UWB;
|
|
1u__wb;
|
|
1__WBu;
|
|
1U__WB;
|
|
_Static_assert((unsigned int)1__uwb == 1u, "not 1?");
|
|
|
|
1'2__wb;
|
|
1'2__uwb;
|
|
_Static_assert((int)1'2__wb == 12, "not 12?");
|
|
_Static_assert((unsigned int)1'2__uwb == 12u, "not 12?");
|
|
|
|
// Hexadecimal literals.
|
|
0x1__wb;
|
|
0x1__uwb;
|
|
0x0'1'2'3__wb;
|
|
0xA'B'c'd__uwb;
|
|
_Static_assert((int)0x0'1'2'3__wb == 0x0123, "not 0x0123");
|
|
_Static_assert((unsigned int)0xA'B'c'd__uwb == 0xABCDu, "not 0xABCD");
|
|
|
|
// Binary literals.
|
|
0b1__wb;
|
|
0b1__uwb;
|
|
0b1'0'1'0'0'1__wb;
|
|
0b0'1'0'1'1'0__uwb;
|
|
_Static_assert((int)0b1__wb == 1, "not 1?");
|
|
_Static_assert((unsigned int)0b1__uwb == 1u, "not 1?");
|
|
|
|
// Octal literals.
|
|
01__wb;
|
|
01__uwb;
|
|
0'6'0__wb;
|
|
0'0'1__uwb;
|
|
0__wbu;
|
|
0__WBu;
|
|
0U__wb;
|
|
0U__WB;
|
|
0__wb;
|
|
_Static_assert((int)0__wb == 0, "not 0?");
|
|
_Static_assert((unsigned int)0__wbu == 0u, "not 0?");
|
|
|
|
// Imaginary or Complex. These are allowed because _Complex can work with any
|
|
// integer type, and that includes _BitInt.
|
|
1__wbi;
|
|
1i__wb;
|
|
1__wbj;
|
|
|
|
//UDL test as single underscore
|
|
unsigned i = 1.0_;
|
|
}
|
|
|
|
void InvalidSuffix(void) {
|
|
// Can't mix the case of wb or WB, and can't rearrange the letters.
|
|
0__wB; // expected-error {{invalid suffix '__wB' on integer constant}}
|
|
0__Wb; // expected-error {{invalid suffix '__Wb' on integer constant}}
|
|
0__bw; // expected-error {{invalid suffix '__bw' on integer constant}}
|
|
0__BW; // expected-error {{invalid suffix '__BW' on integer constant}}
|
|
|
|
// Trailing digit separators should still diagnose.
|
|
1'2'__wb; // expected-error {{digit separator cannot appear at end of digit sequence}}
|
|
1'2'__uwb; // expected-error {{digit separator cannot appear at end of digit sequence}}
|
|
|
|
// Long.
|
|
1l__wb; // expected-error {{invalid suffix}}
|
|
1__wbl; // expected-error {{invalid suffix}}
|
|
1l__uwb; // expected-error {{invalid suffix}}
|
|
1__l; // expected-error {{invalid suffix}}
|
|
1ul__wb; // expected-error {{invalid suffix}}
|
|
|
|
// Long long.
|
|
1ll__wb; // expected-error {{invalid suffix}}
|
|
1__uwbll; // expected-error {{invalid suffix}}
|
|
|
|
// Floating point.
|
|
0.1__wb; // expected-error {{invalid suffix}}
|
|
0.1f__wb; // expected-error {{invalid suffix}}
|
|
|
|
// Repetitive suffix.
|
|
1__wb__wb; // expected-error {{invalid suffix}}
|
|
1__uwbuwb; // expected-error {{invalid suffix}}
|
|
1__wbuwb; // expected-error {{invalid suffix}}
|
|
1__uwbwb; // expected-error {{invalid suffix}}
|
|
|
|
// Missing or extra characters in suffix.
|
|
1__; // expected-error {{invalid suffix}}
|
|
1__u; // expected-error {{invalid suffix}}
|
|
1___; // expected-error {{invalid suffix}}
|
|
1___WB; // expected-error {{invalid suffix}}
|
|
1__wb__; // expected-error {{invalid suffix}}
|
|
1__w; // expected-error {{invalid suffix}}
|
|
1__b; // expected-error {{invalid suffix}}
|
|
}
|
|
|
|
void ValidSuffixInvalidValue(void) {
|
|
// This is a valid suffix, but the value is larger than one that fits within
|
|
// the width of BITINT_MAXWIDTH. When this value changes in the future, the
|
|
// test cases should pick a new value that can't be represented by a _BitInt,
|
|
// but also add a test case that a 129-bit literal still behaves as-expected.
|
|
_Static_assert(__BITINT_MAXWIDTH__ <= 128,
|
|
"Need to pick a bigger constant for the test case below.");
|
|
0xFFFF'FFFF'FFFF'FFFF'FFFF'FFFF'FFFF'FFFF'1__wb; // expected-error {{integer literal is too large to be represented in any signed integer type}}
|
|
0xFFFF'FFFF'FFFF'FFFF'FFFF'FFFF'FFFF'FFFF'1__uwb; // expected-error {{integer literal is too large to be represented in any integer type}}
|
|
}
|
|
|
|
void TestTypes(void) {
|
|
// 2 value bits, one sign bit
|
|
_Static_assert(__is_same(decltype(3__wb), _BitInt(3)));
|
|
// 2 value bits, one sign bit
|
|
_Static_assert(__is_same(decltype(-3__wb), _BitInt(3)));
|
|
// 2 value bits, no sign bit
|
|
_Static_assert(__is_same(decltype(3__uwb), unsigned _BitInt(2)));
|
|
// 4 value bits, one sign bit
|
|
_Static_assert(__is_same(decltype(0xF__wb), _BitInt(5)));
|
|
// 4 value bits, one sign bit
|
|
_Static_assert(__is_same(decltype(-0xF__wb), _BitInt(5)));
|
|
// 4 value bits, no sign bit
|
|
_Static_assert(__is_same(decltype(0xF__uwb), unsigned _BitInt(4)));
|
|
}
|