Do not create param types that differ only by name when comparing intrinsic signatures
This commit is contained in:
parent
1d74589fac
commit
623bd5843b
2 changed files with 22 additions and 5 deletions
|
@ -12,7 +12,7 @@ use rustc_errors::{codes::*, struct_span_code_err, DiagnosticMessage};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::traits::{ObligationCause, ObligationCauseCode};
|
use rustc_middle::traits::{ObligationCause, ObligationCauseCode};
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_span::symbol::{kw, sym, Symbol};
|
use rustc_span::symbol::{kw, sym};
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
|
||||||
fn equate_intrinsic_type<'tcx>(
|
fn equate_intrinsic_type<'tcx>(
|
||||||
|
@ -132,7 +132,17 @@ pub fn intrinsic_operation_unsafety(tcx: TyCtxt<'_>, intrinsic_id: DefId) -> hir
|
||||||
/// 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<'_>, it: &hir::ForeignItem<'_>) {
|
||||||
let param = |n| Ty::new_param(tcx, n, Symbol::intern(&format!("P{n}")));
|
let generics = tcx.generics_of(it.owner_id);
|
||||||
|
let param = |n| {
|
||||||
|
if let Some(&ty::GenericParamDef {
|
||||||
|
name, kind: ty::GenericParamDefKind::Type { .. }, ..
|
||||||
|
}) = generics.opt_param_at(n as usize, tcx)
|
||||||
|
{
|
||||||
|
Ty::new_param(tcx, n, name)
|
||||||
|
} else {
|
||||||
|
Ty::new_error_with_message(tcx, tcx.def_span(it.owner_id), "expected param")
|
||||||
|
}
|
||||||
|
};
|
||||||
let intrinsic_id = it.owner_id.to_def_id();
|
let intrinsic_id = it.owner_id.to_def_id();
|
||||||
let intrinsic_name = tcx.item_name(intrinsic_id);
|
let intrinsic_name = tcx.item_name(intrinsic_id);
|
||||||
let name_str = intrinsic_name.as_str();
|
let name_str = intrinsic_name.as_str();
|
||||||
|
@ -475,9 +485,16 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
|
||||||
|
|
||||||
/// 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(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
|
||||||
|
let generics = tcx.generics_of(it.owner_id);
|
||||||
let param = |n| {
|
let param = |n| {
|
||||||
let name = Symbol::intern(&format!("P{n}"));
|
if let Some(&ty::GenericParamDef {
|
||||||
Ty::new_param(tcx, n, name)
|
name, kind: ty::GenericParamDefKind::Type { .. }, ..
|
||||||
|
}) = generics.opt_param_at(n as usize, tcx)
|
||||||
|
{
|
||||||
|
Ty::new_param(tcx, n, name)
|
||||||
|
} else {
|
||||||
|
Ty::new_error_with_message(tcx, tcx.def_span(it.owner_id), "expected param")
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let name = it.ident.name;
|
let name = it.ident.name;
|
||||||
|
|
|
@ -438,7 +438,7 @@ pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
|
||||||
(ty::Param(a_p), ty::Param(b_p)) if a_p.index == b_p.index => {
|
(ty::Param(a_p), ty::Param(b_p)) if a_p.index == b_p.index => {
|
||||||
debug_assert_eq!(a_p.name, b_p.name, "param types with same index differ in name");
|
debug_assert_eq!(a_p.name, b_p.name, "param types with same index differ in name");
|
||||||
Ok(a)
|
Ok(a)
|
||||||
},
|
}
|
||||||
|
|
||||||
(ty::Placeholder(p1), ty::Placeholder(p2)) if p1 == p2 => Ok(a),
|
(ty::Placeholder(p1), ty::Placeholder(p2)) if p1 == p2 => Ok(a),
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue