[PATCH] D62825: [C++2a] Add __builtin_bit_cast, used to implement std::bit_cast

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 13 12:02:50 PDT 2019


rsmith added a comment.

In D62825#1542309 <https://reviews.llvm.org/D62825#1542309>, @rjmccall wrote:

> In D62825#1542301 <https://reviews.llvm.org/D62825#1542301>, @rsmith wrote:
>
> > In D62825#1542247 <https://reviews.llvm.org/D62825#1542247>, @rjmccall wrote:
> >
> > > In what sense is the bit-pattern of a null pointer indeterminate?
> >
> >
> > The problem is not null pointers, it's `nullptr_t`, which is required to have the same size and alignment as `void*` but which comprises only padding bits. (Loads of `nullptr_t` are not even permitted to touch memory...).
>
>
> I mean, I know this is C++ and the committee loves tying itself in knots to make the language unnecessarily unusable, but surely the semantics of bitcasting an r-value of type `nullptr_t` are intended to be equivalent to bitcasting an r-value of type `void*` that happens to be a null pointer.


I don't follow -- why would they be? `bit_cast` reads the object representation, which for `nullptr_t` is likely to be uninitialized, because the type contains only padding bits. (Note that there is formally no such thing as "bitcasting an rvalue". `bit_cast` takes an lvalue, and reinterprets its storage.)

`nullptr_t` is modeled roughly as if:

  struct alignas(void*) nullptr_t {
    template<typename T> operator T*() { return nullptr; }
  }

and as with that struct type,`bit_cast` of `nullptr_t` to some other type should (presumably) result in an uninitialized value.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62825/new/

https://reviews.llvm.org/D62825





More information about the cfe-commits mailing list