[PATCH] D76323: [AST] Fix handling of long double and bool in __builtin_bit_cast
Erik Pilkington via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 23 07:36:28 PDT 2020
erik.pilkington added inline comments.
================
Comment at: clang/lib/AST/ExprConstant.cpp:6365
+ const llvm::fltSemantics &Semantics = Info.Ctx.getFloatTypeSemantics(Ty);
+ unsigned NumBits = APFloat::semanticsSizeInBits(Semantics);
+ assert(NumBits % 8 == 0);
----------------
ldionne wrote:
> `semanticsSizeInBits` is the number of bits actually used in the type?
Yeah
================
Comment at: clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:226-250
typedef decltype(nullptr) nullptr_t;
#ifdef __CHAR_UNSIGNED__
// expected-note at +5 {{indeterminate value can only initialize an object of type 'unsigned char', 'char', or 'std::byte'; 'unsigned long' is invalid}}
#else
// expected-note at +3 {{indeterminate value can only initialize an object of type 'unsigned char' or 'std::byte'; 'unsigned long' is invalid}}
#endif
----------------
>>! In D76323#1933791, @jfb wrote:
> Maybe you should test `nullptr` as well, given that it's all padding?
There are some existing `nullptr` padding tests here ^^^, which seem to cover this.
================
Comment at: clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:407
+
+constexpr bool test_bad_bool = bit_cast<bool>('A'); // expected-error {{must be initialized by a constant expression}} expected-note{{in call}}
+
----------------
jfb wrote:
> Sanity-check: `0` and `1` work? IIRC we had a discussion about whether `false` was `0` and `true` was `1`, and we concluded that `false` was indeed `0` but `true` wasn't specified to be `1`.
Yeah, they work, I added a test in the update. I don't think it really matters that `true` could technically be `2` in the standard here, since the representation on our implementation is always `1`.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D76323/new/
https://reviews.llvm.org/D76323
More information about the cfe-commits
mailing list