Rollup merge of #114670 - compiler-errors:issue-114660, r=cjgillot
Don't use `type_of` to determine if item has intrinsic shim When we're calling `resolve_instance` on an inline const, we were previously looking at the `type_of` for that const, seeing that it was an `extern "intrinsic"` fn def, and treating it as if we were computing the instance of that intrinsic itself. This is incorrect. Instead, we should be using the def-id of the item we're computing to determine if it's an intrinsic. Fixes #114660
This commit is contained in:
commit
a87dda3b3d
@ -1,4 +1,5 @@
|
|||||||
use rustc_errors::ErrorGuaranteed;
|
use rustc_errors::ErrorGuaranteed;
|
||||||
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_infer::infer::TyCtxtInferExt;
|
use rustc_infer::infer::TyCtxtInferExt;
|
||||||
use rustc_middle::query::Providers;
|
use rustc_middle::query::Providers;
|
||||||
@ -15,27 +16,22 @@ fn resolve_instance<'tcx>(
|
|||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
key: ty::ParamEnvAnd<'tcx, (DefId, GenericArgsRef<'tcx>)>,
|
key: ty::ParamEnvAnd<'tcx, (DefId, GenericArgsRef<'tcx>)>,
|
||||||
) -> Result<Option<Instance<'tcx>>, ErrorGuaranteed> {
|
) -> Result<Option<Instance<'tcx>>, ErrorGuaranteed> {
|
||||||
let (param_env, (def, args)) = key.into_parts();
|
let (param_env, (def_id, args)) = key.into_parts();
|
||||||
|
|
||||||
let result = if let Some(trait_def_id) = tcx.trait_of_item(def) {
|
let result = if let Some(trait_def_id) = tcx.trait_of_item(def_id) {
|
||||||
debug!(" => associated item, attempting to find impl in param_env {:#?}", param_env);
|
debug!(" => associated item, attempting to find impl in param_env {:#?}", param_env);
|
||||||
resolve_associated_item(
|
resolve_associated_item(
|
||||||
tcx,
|
tcx,
|
||||||
def,
|
def_id,
|
||||||
param_env,
|
param_env,
|
||||||
trait_def_id,
|
trait_def_id,
|
||||||
tcx.normalize_erasing_regions(param_env, args),
|
tcx.normalize_erasing_regions(param_env, args),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
let ty = tcx.type_of(def);
|
let def = if matches!(tcx.def_kind(def_id), DefKind::Fn) && tcx.is_intrinsic(def_id) {
|
||||||
let item_type = tcx.subst_and_normalize_erasing_regions(args, param_env, ty);
|
|
||||||
|
|
||||||
let def = match *item_type.kind() {
|
|
||||||
ty::FnDef(def_id, ..) if tcx.is_intrinsic(def_id) => {
|
|
||||||
debug!(" => intrinsic");
|
debug!(" => intrinsic");
|
||||||
ty::InstanceDef::Intrinsic(def)
|
ty::InstanceDef::Intrinsic(def_id)
|
||||||
}
|
} else if Some(def_id) == tcx.lang_items().drop_in_place_fn() {
|
||||||
ty::FnDef(def_id, args) if Some(def_id) == tcx.lang_items().drop_in_place_fn() => {
|
|
||||||
let ty = args.type_at(0);
|
let ty = args.type_at(0);
|
||||||
|
|
||||||
if ty.needs_drop(tcx, param_env) {
|
if ty.needs_drop(tcx, param_env) {
|
||||||
@ -57,12 +53,11 @@ fn resolve_instance<'tcx>(
|
|||||||
debug!(" => trivial drop glue");
|
debug!(" => trivial drop glue");
|
||||||
ty::InstanceDef::DropGlue(def_id, None)
|
ty::InstanceDef::DropGlue(def_id, None)
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
_ => {
|
|
||||||
debug!(" => free item");
|
debug!(" => free item");
|
||||||
ty::InstanceDef::Item(def)
|
ty::InstanceDef::Item(def_id)
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Some(Instance { def, args }))
|
Ok(Some(Instance { def, args }))
|
||||||
};
|
};
|
||||||
debug!("inner_resolve_instance: result={:?}", result);
|
debug!("inner_resolve_instance: result={:?}", result);
|
||||||
|
10
tests/ui/inline-const/instance-doesnt-depend-on-type.rs
Normal file
10
tests/ui/inline-const/instance-doesnt-depend-on-type.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// check-pass
|
||||||
|
// issue: 114660
|
||||||
|
|
||||||
|
#![feature(inline_const)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
const { core::mem::transmute::<u8, u8> };
|
||||||
|
// Don't resolve the instance of this inline constant to be an intrinsic,
|
||||||
|
// even if the type of the constant is `extern "intrinsic" fn(u8) -> u8`.
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user