1
Fork 0

Make check_intrinsic_type not require ForeignItems anymore

This commit is contained in:
Oli Scherer 2024-01-31 14:09:42 +00:00
parent 79daf6107c
commit 09fd556962
2 changed files with 24 additions and 19 deletions

View file

@ -533,15 +533,18 @@ pub(crate) fn check_item_type(tcx: TyCtxt<'_>, def_id: LocalDefId) {
match abi { match abi {
Abi::RustIntrinsic => { Abi::RustIntrinsic => {
for item in items { for item in items {
let item = tcx.hir().foreign_item(item.id); intrinsic::check_intrinsic_type(tcx, item.id.owner_id.def_id, item.span);
intrinsic::check_intrinsic_type(tcx, item);
} }
} }
Abi::PlatformIntrinsic => { Abi::PlatformIntrinsic => {
for item in items { for item in items {
let item = tcx.hir().foreign_item(item.id); intrinsic::check_platform_intrinsic_type(
intrinsic::check_platform_intrinsic_type(tcx, item); tcx,
item.id.owner_id.def_id,
item.span,
item.ident.name,
);
} }
} }

View file

@ -13,7 +13,7 @@ use rustc_middle::traits::{ObligationCause, ObligationCauseCode};
use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_span::def_id::LocalDefId; use rustc_span::def_id::LocalDefId;
use rustc_span::symbol::{kw, sym}; use rustc_span::symbol::{kw, sym};
use rustc_span::Span; use rustc_span::{Span, Symbol};
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi;
fn equate_intrinsic_type<'tcx>( fn equate_intrinsic_type<'tcx>(
@ -136,8 +136,8 @@ pub fn intrinsic_operation_unsafety(tcx: TyCtxt<'_>, intrinsic_id: LocalDefId) -
/// Remember to add all intrinsics here, in `compiler/rustc_codegen_llvm/src/intrinsic.rs`, /// Remember to add all intrinsics here, in `compiler/rustc_codegen_llvm/src/intrinsic.rs`,
/// and in `library/core/src/intrinsics.rs`. /// and in `library/core/src/intrinsics.rs`.
pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) { pub fn check_intrinsic_type(tcx: TyCtxt<'_>, intrinsic_id: LocalDefId, span: Span) {
let generics = tcx.generics_of(it.owner_id); let generics = tcx.generics_of(intrinsic_id);
let param = |n| { let param = |n| {
if let Some(&ty::GenericParamDef { if let Some(&ty::GenericParamDef {
name, kind: ty::GenericParamDefKind::Type { .. }, .. name, kind: ty::GenericParamDefKind::Type { .. }, ..
@ -145,10 +145,9 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
{ {
Ty::new_param(tcx, n, name) Ty::new_param(tcx, n, name)
} else { } else {
Ty::new_error_with_message(tcx, tcx.def_span(it.owner_id), "expected param") Ty::new_error_with_message(tcx, span, "expected param")
} }
}; };
let intrinsic_id = it.owner_id.def_id;
let intrinsic_name = tcx.item_name(intrinsic_id.into()); let intrinsic_name = tcx.item_name(intrinsic_id.into());
let name_str = intrinsic_name.as_str(); let name_str = intrinsic_name.as_str();
@ -191,7 +190,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
| "umin" => (1, vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], param(0)), | "umin" => (1, vec![Ty::new_mut_ptr(tcx, param(0)), param(0)], param(0)),
"fence" | "singlethreadfence" => (0, Vec::new(), Ty::new_unit(tcx)), "fence" | "singlethreadfence" => (0, Vec::new(), Ty::new_unit(tcx)),
op => { op => {
tcx.dcx().emit_err(UnrecognizedAtomicOperation { span: it.span, op }); tcx.dcx().emit_err(UnrecognizedAtomicOperation { span, op });
return; return;
} }
}; };
@ -479,7 +478,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
sym::debug_assertions => (0, Vec::new(), tcx.types.bool), sym::debug_assertions => (0, Vec::new(), tcx.types.bool),
other => { other => {
tcx.dcx().emit_err(UnrecognizedIntrinsicFunction { span: it.span, name: other }); tcx.dcx().emit_err(UnrecognizedIntrinsicFunction { span, name: other });
return; return;
} }
}; };
@ -487,12 +486,17 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
}; };
let sig = tcx.mk_fn_sig(inputs, output, false, unsafety, Abi::RustIntrinsic); let sig = tcx.mk_fn_sig(inputs, output, false, unsafety, Abi::RustIntrinsic);
let sig = ty::Binder::bind_with_vars(sig, bound_vars); let sig = ty::Binder::bind_with_vars(sig, bound_vars);
equate_intrinsic_type(tcx, it.span, intrinsic_id, n_tps, n_lts, 0, sig) equate_intrinsic_type(tcx, span, intrinsic_id, n_tps, n_lts, 0, sig)
} }
/// Type-check `extern "platform-intrinsic" { ... }` functions. /// Type-check `extern "platform-intrinsic" { ... }` functions.
pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) { pub fn check_platform_intrinsic_type(
let generics = tcx.generics_of(it.owner_id); tcx: TyCtxt<'_>,
intrinsic_id: LocalDefId,
span: Span,
name: Symbol,
) {
let generics = tcx.generics_of(intrinsic_id);
let param = |n| { let param = |n| {
if let Some(&ty::GenericParamDef { if let Some(&ty::GenericParamDef {
name, kind: ty::GenericParamDefKind::Type { .. }, .. name, kind: ty::GenericParamDefKind::Type { .. }, ..
@ -500,12 +504,10 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
{ {
Ty::new_param(tcx, n, name) Ty::new_param(tcx, n, name)
} else { } else {
Ty::new_error_with_message(tcx, tcx.def_span(it.owner_id), "expected param") Ty::new_error_with_message(tcx, span, "expected param")
} }
}; };
let name = it.ident.name;
let (n_tps, n_cts, inputs, output) = match name { let (n_tps, n_cts, inputs, output) = match name {
sym::simd_eq | sym::simd_ne | sym::simd_lt | sym::simd_le | sym::simd_gt | sym::simd_ge => { sym::simd_eq | sym::simd_ne | sym::simd_lt | sym::simd_le | sym::simd_gt | sym::simd_ge => {
(2, 0, vec![param(0), param(0)], param(1)) (2, 0, vec![param(0), param(0)], param(1))
@ -578,12 +580,12 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>)
sym::simd_shuffle_generic => (2, 1, vec![param(0), param(0)], param(1)), sym::simd_shuffle_generic => (2, 1, vec![param(0), param(0)], param(1)),
_ => { _ => {
let msg = format!("unrecognized platform-specific intrinsic function: `{name}`"); let msg = format!("unrecognized platform-specific intrinsic function: `{name}`");
tcx.dcx().span_err(it.span, msg); tcx.dcx().span_err(span, msg);
return; return;
} }
}; };
let sig = tcx.mk_fn_sig(inputs, output, false, hir::Unsafety::Unsafe, Abi::PlatformIntrinsic); let sig = tcx.mk_fn_sig(inputs, output, false, hir::Unsafety::Unsafe, Abi::PlatformIntrinsic);
let sig = ty::Binder::dummy(sig); let sig = ty::Binder::dummy(sig);
equate_intrinsic_type(tcx, it.span, it.owner_id.def_id, n_tps, 0, n_cts, sig) equate_intrinsic_type(tcx, span, intrinsic_id, n_tps, 0, n_cts, sig)
} }