================ @@ -404,29 +691,126 @@ constexpr unsigned char identity3b = __builtin_bit_cast(unsigned char, identity3 namespace test_bool { -constexpr bool test_bad_bool = bit_cast<bool>('A'); // expected-error {{must be initialized by a constant expression}} expected-note{{in call}} +// expected-note@+1 {{cannot be represented in type 'bool'}} +constexpr bool test_bad_bool = __builtin_bit_cast(bool, 'A'); // expected-error {{must be initialized by a constant expression}} + +static_assert(round_trip<signed char>(true)); +static_assert(round_trip<unsigned char>(true)); ---------------- sethp wrote:
These tests document the existing behavior, but both this and the `bit_cast<uint8_t>(false)` below are somewhat troublesome in that we're promoting the `bool`'s padding bits to "real" bits (by zero-extension). As I understand it, that's allowed by the spec (padding bits are "unspecified"), but it does mean that we've got to "over-read" `bool`s as being a full `i8` when we convert `bit_cast<bool>((uint8_t)N)` so that we can refuse to produce a constant value if the top bits are non-zero. It would be more consistent and simplify the implementation a bit to throw an error on `bit_cast<char>(false)` in a constexpr context complaining about attempting to read padding bits, but I've chosen to preserve the existing behavior here in service of backwards compatibility and usability. https://github.com/llvm/llvm-project/pull/74775 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits