rsmith added a comment.

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

> In D62825#1542374 <https://reviews.llvm.org/D62825#1542374>, @rsmith wrote:
>
> > 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.)
>
>
> I agree that the problem is that the object representation of `nullptr_t` is 
> wrong, but it seems absurd to me that we're going to bake in an absurd 
> special case (from the user's perspective) to `bit_cast` because we consider 
> that representation unfixable.


Note that `bit_cast` supports casting not just from fundamental types but also 
from aggregates (which might contain a `nullptr_t`). At runtime, we're going to 
`memcpy` from the source object, which will leave the bits in the destination 
corresponding to `nullptr_t` subobjects in the source uninitialized (if they 
were in fact uninitialized in the source object, which they might be). It would 
be unreasonable to initialize the bits in the `bit_cast` result during 
compile-time evaluation but not during runtime evaluation -- compile-time 
evaluation is supposed to diagnose cases that would be undefined at runtime, 
not define them.

In my view, the mistake was specifying `nullptr_t` to have the same size and 
alignment as `void*`; it should instead be an empty type. Only confusion 
results from making it "look like" a pointer type rather than just being an 
empty tag type.


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

https://reviews.llvm.org/D62825



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to