// RUN: %clang_cc1 -triple aarch64-unknown-unknown -std=c2x -fsyntax-only -verify -Wno-unused %s

// Test that the preprocessor behavior makes sense.
#if 1wb != 1
#error "wb suffix must be recognized by preprocessor"
#endif
#if 1uwb != 1
#error "uwb suffix must be recognized by preprocessor"
#endif
#if !(-1wb < 0)
#error "wb suffix must be interpreted as signed"
#endif
#if !(-1uwb > 0)
#error "uwb suffix must be interpreted as unsigned"
#endif

#if 18446744073709551615uwb != 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 18446744073709551616wb != 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 18446744073709551616uwb != 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 18446744073709551615uwb + 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 18446744073709551615wb + 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 = 18446744073709551616uwb;

void ValidSuffix(void) {
  // Decimal literals.
  1wb;
  1WB;
  -1wb;
  _Static_assert((int)1wb == 1, "not 1?");
  _Static_assert((int)-1wb == -1, "not -1?");

  1uwb;
  1uWB;
  1Uwb;
  1UWB;
  _Static_assert((unsigned int)1uwb == 1u, "not 1?");

  1'2wb;
  1'2uwb;
  _Static_assert((int)1'2wb == 12, "not 12?");
  _Static_assert((unsigned int)1'2uwb == 12u, "not 12?");

  // Hexadecimal literals.
  0x1wb;
  0x1uwb;
  0x0'1'2'3wb;
  0xA'B'c'duwb;
  _Static_assert((int)0x0'1'2'3wb == 0x0123, "not 0x0123");
  _Static_assert((unsigned int)0xA'B'c'duwb == 0xABCDu, "not 0xABCD");

  // Binary literals.
  0b1wb;
  0b1uwb;
  0b1'0'1'0'0'1wb;
  0b0'1'0'1'1'0uwb;
  _Static_assert((int)0b1wb == 1, "not 1?");
  _Static_assert((unsigned int)0b1uwb == 1u, "not 1?");

  // Octal literals.
  01wb;
  01uwb;
  0'6'0wb;
  0'0'1uwb;
  0wbu;
  0WBu;
  0wbU;
  0WBU;
  0wb;
  _Static_assert((int)0wb == 0, "not 0?");
  _Static_assert((unsigned int)0wbu == 0u, "not 0?");

  // Imaginary or Complex. These are allowed because _Complex can work with any
  // integer type, and that includes _BitInt.
  1iwb;
  1wbj;
}

void InvalidSuffix(void) {
  // Can't mix the case of wb or WB, and can't rearrange the letters.
  0wB; // expected-error {{invalid suffix 'wB' on integer constant}}
  0Wb; // expected-error {{invalid suffix 'Wb' on integer constant}}
  0bw; // expected-error {{invalid digit 'b' in octal constant}}
  0BW; // expected-error {{invalid digit 'B' in octal 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.
  1lwb; // expected-error {{invalid suffix}}
  1wbl; // expected-error {{invalid suffix}}
  1luwb; // expected-error {{invalid suffix}}
  1ulwb;  // expected-error {{invalid suffix}}

  // Long long.
  1llwb; // expected-error {{invalid suffix}}
  1uwbll; // expected-error {{invalid suffix}}

  // Floating point.
  0.1wb;   // expected-error {{invalid suffix}}
  0.1fwb;   // expected-error {{invalid suffix}}

  // Repetitive suffix.
  1wbwb; // expected-error {{invalid suffix}}
  1uwbuwb; // expected-error {{invalid suffix}}
  1wbuwb; // expected-error {{invalid suffix}}
  1uwbwb; // 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'1wb; // expected-error {{integer literal is too large to be represented in any signed integer type}}
  0xFFFF'FFFF'FFFF'FFFF'FFFF'FFFF'FFFF'FFFF'1uwb; // 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(__builtin_types_compatible_p(__typeof__(3wb), _BitInt(3)));
  // 2 value bits, one sign bit
  _Static_assert(__builtin_types_compatible_p(__typeof__(-3wb), _BitInt(3)));
  // 2 value bits, no sign bit
  _Static_assert(__builtin_types_compatible_p(__typeof__(3uwb), unsigned _BitInt(2)));
  // 4 value bits, one sign bit
  _Static_assert(__builtin_types_compatible_p(__typeof__(0xFwb), _BitInt(5)));
  // 4 value bits, one sign bit
  _Static_assert(__builtin_types_compatible_p(__typeof__(-0xFwb), _BitInt(5)));
  // 4 value bits, no sign bit
  _Static_assert(__builtin_types_compatible_p(__typeof__(0xFuwb), unsigned _BitInt(4)));
}
