Rollup merge of #137548 - compiler-errors:asm-ty, r=oli-obk
Pass correct `TypingEnv` to `InlineAsmCtxt` Fixes #137512 r? oli-obk
This commit is contained in:
commit
87f3908066
5 changed files with 71 additions and 6 deletions
|
@ -27,20 +27,19 @@ enum NonAsmTypeReason<'tcx> {
|
||||||
UnevaluatedSIMDArrayLength(DefId, ty::Const<'tcx>),
|
UnevaluatedSIMDArrayLength(DefId, ty::Const<'tcx>),
|
||||||
Invalid(Ty<'tcx>),
|
Invalid(Ty<'tcx>),
|
||||||
InvalidElement(DefId, Ty<'tcx>),
|
InvalidElement(DefId, Ty<'tcx>),
|
||||||
|
NotSizedPtr(Ty<'tcx>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
|
impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def_id: LocalDefId,
|
def_id: LocalDefId,
|
||||||
|
typing_env: ty::TypingEnv<'tcx>,
|
||||||
get_operand_ty: impl Fn(&hir::Expr<'tcx>) -> Ty<'tcx> + 'a,
|
get_operand_ty: impl Fn(&hir::Expr<'tcx>) -> Ty<'tcx> + 'a,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
InlineAsmCtxt {
|
InlineAsmCtxt {
|
||||||
tcx,
|
tcx,
|
||||||
typing_env: ty::TypingEnv {
|
typing_env,
|
||||||
typing_mode: ty::TypingMode::non_body_analysis(),
|
|
||||||
param_env: ty::ParamEnv::empty(),
|
|
||||||
},
|
|
||||||
target_features: tcx.asm_target_features(def_id),
|
target_features: tcx.asm_target_features(def_id),
|
||||||
expr_ty: Box::new(get_operand_ty),
|
expr_ty: Box::new(get_operand_ty),
|
||||||
}
|
}
|
||||||
|
@ -83,7 +82,13 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
|
||||||
ty::Float(FloatTy::F64) => Ok(InlineAsmType::F64),
|
ty::Float(FloatTy::F64) => Ok(InlineAsmType::F64),
|
||||||
ty::Float(FloatTy::F128) => Ok(InlineAsmType::F128),
|
ty::Float(FloatTy::F128) => Ok(InlineAsmType::F128),
|
||||||
ty::FnPtr(..) => Ok(asm_ty_isize),
|
ty::FnPtr(..) => Ok(asm_ty_isize),
|
||||||
ty::RawPtr(ty, _) if self.is_thin_ptr_ty(ty) => Ok(asm_ty_isize),
|
ty::RawPtr(elem_ty, _) => {
|
||||||
|
if self.is_thin_ptr_ty(elem_ty) {
|
||||||
|
Ok(asm_ty_isize)
|
||||||
|
} else {
|
||||||
|
Err(NonAsmTypeReason::NotSizedPtr(ty))
|
||||||
|
}
|
||||||
|
}
|
||||||
ty::Adt(adt, args) if adt.repr().simd() => {
|
ty::Adt(adt, args) if adt.repr().simd() => {
|
||||||
let fields = &adt.non_enum_variant().fields;
|
let fields = &adt.non_enum_variant().fields;
|
||||||
let field = &fields[FieldIdx::ZERO];
|
let field = &fields[FieldIdx::ZERO];
|
||||||
|
@ -189,6 +194,16 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
|
||||||
can be used as arguments for inline assembly",
|
can be used as arguments for inline assembly",
|
||||||
).emit();
|
).emit();
|
||||||
}
|
}
|
||||||
|
NonAsmTypeReason::NotSizedPtr(ty) => {
|
||||||
|
let msg = format!(
|
||||||
|
"cannot use value of unsized pointer type `{ty}` for inline assembly"
|
||||||
|
);
|
||||||
|
self.tcx
|
||||||
|
.dcx()
|
||||||
|
.struct_span_err(expr.span, msg)
|
||||||
|
.with_note("only sized pointers can be used in inline assembly")
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
NonAsmTypeReason::InvalidElement(did, ty) => {
|
NonAsmTypeReason::InvalidElement(did, ty) => {
|
||||||
let msg = format!(
|
let msg = format!(
|
||||||
"cannot use SIMD vector with element type `{ty}` for inline assembly"
|
"cannot use SIMD vector with element type `{ty}` for inline assembly"
|
||||||
|
|
|
@ -110,7 +110,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
self.tcx.erase_regions(ty)
|
self.tcx.erase_regions(ty)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
InlineAsmCtxt::new(self.tcx, enclosing_id, expr_ty).check_asm(asm);
|
InlineAsmCtxt::new(self.tcx, enclosing_id, self.typing_env(self.param_env), expr_ty)
|
||||||
|
.check_asm(asm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
19
tests/ui/asm/conditionally-sized-ptr-fail.rs
Normal file
19
tests/ui/asm/conditionally-sized-ptr-fail.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
//@ needs-asm-support
|
||||||
|
|
||||||
|
use std::arch::asm;
|
||||||
|
|
||||||
|
fn _f<T: ?Sized>(p: *mut T) {
|
||||||
|
unsafe {
|
||||||
|
asm!("/* {} */", in(reg) p);
|
||||||
|
//~^ ERROR cannot use value of unsized pointer type `*mut T` for inline assembly
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _g(p: *mut [u8]) {
|
||||||
|
unsafe {
|
||||||
|
asm!("/* {} */", in(reg) p);
|
||||||
|
//~^ ERROR cannot use value of unsized pointer type `*mut [u8]` for inline assembly
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
18
tests/ui/asm/conditionally-sized-ptr-fail.stderr
Normal file
18
tests/ui/asm/conditionally-sized-ptr-fail.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
error: cannot use value of unsized pointer type `*mut T` for inline assembly
|
||||||
|
--> $DIR/conditionally-sized-ptr-fail.rs:7:34
|
||||||
|
|
|
||||||
|
LL | asm!("/* {} */", in(reg) p);
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: only sized pointers can be used in inline assembly
|
||||||
|
|
||||||
|
error: cannot use value of unsized pointer type `*mut [u8]` for inline assembly
|
||||||
|
--> $DIR/conditionally-sized-ptr-fail.rs:14:34
|
||||||
|
|
|
||||||
|
LL | asm!("/* {} */", in(reg) p);
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: only sized pointers can be used in inline assembly
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
12
tests/ui/asm/conditionally-sized-ptr.rs
Normal file
12
tests/ui/asm/conditionally-sized-ptr.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
//@ check-pass
|
||||||
|
//@ needs-asm-support
|
||||||
|
|
||||||
|
use std::arch::asm;
|
||||||
|
|
||||||
|
fn _f<T>(p: *mut T) {
|
||||||
|
unsafe {
|
||||||
|
asm!("/* {} */", in(reg) p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue