Auto merge of #93670 - erikdesjardins:noundef, r=nikic
Apply noundef attribute to &T, &mut T, Box<T>, bool This doesn't handle `char` because it's a bit awkward to distinguish it from `u32` at this point in codegen. Note that this _does not_ change whether or not it is UB for `&`, `&mut`, or `Box` to point to undef. It only applies to the pointer itself, not the pointed-to memory. Fixes (partially) #74378. r? `@nikic` cc `@RalfJung`
This commit is contained in:
commit
5c30d65683
13 changed files with 94 additions and 91 deletions
|
@ -3051,9 +3051,10 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
|||
layout: TyAndLayout<'tcx>,
|
||||
offset: Size,
|
||||
is_return: bool| {
|
||||
// Booleans are always an i1 that needs to be zero-extended.
|
||||
// Booleans are always a noundef i1 that needs to be zero-extended.
|
||||
if scalar.is_bool() {
|
||||
attrs.ext(ArgExtension::Zext);
|
||||
attrs.set(ArgAttribute::NoUndef);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3078,6 +3079,11 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
|
|||
_ => pointee.size,
|
||||
};
|
||||
|
||||
// `Box`, `&T`, and `&mut T` cannot be undef.
|
||||
// Note that this only applies to the value of the pointer itself;
|
||||
// this attribute doesn't make it UB for the pointed-to data to be undef.
|
||||
attrs.set(ArgAttribute::NoUndef);
|
||||
|
||||
// `Box` pointer parameters never alias because ownership is transferred
|
||||
// `&mut` pointer parameters never alias other parameters,
|
||||
// or mutable global data
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue