cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
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)));
|
|
}
|