Unnamed repository; edit this file 'description' to name the repository.
Upgrade rustc crates
Notable changes: - Aliases' def_id was changed to be in `AliasTyKind` and `AliasTermKind`, and be typed. - rustc now eagerly normalizes with the new solver; to aid with that, it has the `Unnormalized` helper. We currently just call `skip_norm_wip()` everywhere. We'll need to change that eventually. - Niche attributes are no longer supported by `rustc_abi`, we need to migrate to pattern types. - `FnAbi` was removed in favor of `rustc_abi::ExternAbi`. This also removes support for legacy intrinsics (`extern "rust-intrinsic"`), but they're quite old by now so it's presumably okay.
Chayim Refael Friedman 8 days ago
parent c58f7e2 · commit bd6d8d7
-rw-r--r--Cargo.lock44
-rw-r--r--Cargo.toml16
-rw-r--r--crates/hir-def/src/expr_store/lower.rs13
-rw-r--r--crates/hir-def/src/expr_store/pretty.rs7
-rw-r--r--crates/hir-def/src/hir/type_ref.rs4
-rw-r--r--crates/hir-def/src/lib.rs7
-rw-r--r--crates/hir-def/src/signatures.rs36
-rw-r--r--crates/hir-ty/src/builtin_derive.rs8
-rw-r--r--crates/hir-ty/src/consteval/tests.rs5
-rw-r--r--crates/hir-ty/src/consteval/tests/intrinsics.rs185
-rw-r--r--crates/hir-ty/src/diagnostics/decl_check.rs4
-rw-r--r--crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs2
-rw-r--r--crates/hir-ty/src/diagnostics/unsafe_check.rs2
-rw-r--r--crates/hir-ty/src/display.rs57
-rw-r--r--crates/hir-ty/src/drop.rs7
-rw-r--r--crates/hir-ty/src/dyn_compatibility.rs33
-rw-r--r--crates/hir-ty/src/infer.rs26
-rw-r--r--crates/hir-ty/src/infer/callee.rs24
-rw-r--r--crates/hir-ty/src/infer/cast.rs3
-rw-r--r--crates/hir-ty/src/infer/closure.rs46
-rw-r--r--crates/hir-ty/src/infer/closure/analysis.rs5
-rw-r--r--crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs5
-rw-r--r--crates/hir-ty/src/infer/coerce.rs7
-rw-r--r--crates/hir-ty/src/infer/expr.rs30
-rw-r--r--crates/hir-ty/src/infer/opaques.rs7
-rw-r--r--crates/hir-ty/src/infer/pat.rs7
-rw-r--r--crates/hir-ty/src/infer/path.rs17
-rw-r--r--crates/hir-ty/src/inhabitedness.rs2
-rw-r--r--crates/hir-ty/src/layout.rs10
-rw-r--r--crates/hir-ty/src/layout/adt.rs12
-rw-r--r--crates/hir-ty/src/layout/tests.rs3
-rw-r--r--crates/hir-ty/src/lib.rs135
-rw-r--r--crates/hir-ty/src/lower.rs77
-rw-r--r--crates/hir-ty/src/lower/path.rs33
-rw-r--r--crates/hir-ty/src/method_resolution.rs15
-rw-r--r--crates/hir-ty/src/method_resolution/confirm.rs15
-rw-r--r--crates/hir-ty/src/method_resolution/probe.rs15
-rw-r--r--crates/hir-ty/src/mir.rs7
-rw-r--r--crates/hir-ty/src/mir/eval.rs26
-rw-r--r--crates/hir-ty/src/mir/eval/shim.rs9
-rw-r--r--crates/hir-ty/src/mir/eval/shim/simd.rs3
-rw-r--r--crates/hir-ty/src/mir/lower.rs2
-rw-r--r--crates/hir-ty/src/next_solver.rs4
-rw-r--r--crates/hir-ty/src/next_solver/abi.rs44
-rw-r--r--crates/hir-ty/src/next_solver/binder.rs27
-rw-r--r--crates/hir-ty/src/next_solver/def_id.rs137
-rw-r--r--crates/hir-ty/src/next_solver/fulfill.rs2
-rw-r--r--crates/hir-ty/src/next_solver/generic_arg.rs4
-rw-r--r--crates/hir-ty/src/next_solver/infer/canonical/instantiate.rs2
-rw-r--r--crates/hir-ty/src/next_solver/infer/context.rs25
-rw-r--r--crates/hir-ty/src/next_solver/infer/errors.rs20
-rw-r--r--crates/hir-ty/src/next_solver/infer/mod.rs7
-rw-r--r--crates/hir-ty/src/next_solver/inspect.rs7
-rw-r--r--crates/hir-ty/src/next_solver/interner.rs399
-rw-r--r--crates/hir-ty/src/next_solver/ir_print.rs10
-rw-r--r--crates/hir-ty/src/next_solver/predicate.rs4
-rw-r--r--crates/hir-ty/src/next_solver/region.rs1
-rw-r--r--crates/hir-ty/src/next_solver/solver.rs58
-rw-r--r--crates/hir-ty/src/next_solver/structural_normalize.rs2
-rw-r--r--crates/hir-ty/src/next_solver/ty.rs38
-rw-r--r--crates/hir-ty/src/next_solver/util.rs2
-rw-r--r--crates/hir-ty/src/opaques.rs2
-rw-r--r--crates/hir-ty/src/representability.rs8
-rw-r--r--crates/hir-ty/src/specialization.rs10
-rw-r--r--crates/hir-ty/src/traits.rs4
-rw-r--r--crates/hir-ty/src/utils.rs22
-rw-r--r--crates/hir-ty/src/variance.rs2
-rw-r--r--crates/hir/src/display.rs10
-rw-r--r--crates/hir/src/lib.rs70
-rw-r--r--crates/hir/src/source_analyzer.rs53
-rw-r--r--crates/ide-completion/src/tests/flyimport.rs10
-rw-r--r--crates/ide-diagnostics/src/handlers/missing_unsafe.rs43
-rw-r--r--crates/ide/src/hover/tests.rs5
73 files changed, 1002 insertions, 1001 deletions
diff --git a/Cargo.lock b/Cargo.lock
index be9a8c4915..cbbeef0030 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2067,9 +2067,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "ra-ap-rustc_abi"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b917ab47d7036977be4c984321af3e0de089229404d68ea9a286f50aa464697"
+checksum = "2f25a779e21ca3bba6795193b16508c8ab159f96ee4b07349893fd272065b525"
dependencies = [
"bitflags 2.9.4",
"ra-ap-rustc_hashes",
@@ -2079,33 +2079,33 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_ast_ir"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "021d80bea67458b8c90cc25bfdca6f911ea818a41905e370c1f310cced1dd07e"
+checksum = "0218ca6c7b096466e85a497e6150c39be5b7bc36637fe62c1cd20370a9d9aac7"
[[package]]
name = "ra-ap-rustc_hashes"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bb89395306ecfc980d252f77a4038d8b8bb578a25c856b545cbeeb3fde8358e"
+checksum = "d6b410bacf1a7c8038f376fa6283003784d568ac012e35fc0aeefa9a5ab11a2e"
dependencies = [
"rustc-stable-hash",
]
[[package]]
name = "ra-ap-rustc_index"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84219d028a1954c4340ddde11adffe93eb83e476e942718fe926f4d99637cbbe"
+checksum = "2271b55e4a5d0cc0cbe9bdf8056c07ac69e32919a48ce66722ed0526d62588c3"
dependencies = [
"ra-ap-rustc_index_macros",
]
[[package]]
name = "ra-ap-rustc_index_macros"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3908fdfa258c663d8ee407e6b4a205b0880e323b533c0df7edceafbd54a02fb6"
+checksum = "b6a89e743fb881a1e13544e3395a5ad9ad9280d56384256a121066119abd7af2"
dependencies = [
"proc-macro2",
"quote",
@@ -2114,9 +2114,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_lexer"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34b50f19d5856b8e2b36150e89b53a6102ab096e8044e1f55fd6fef977b10d85"
+checksum = "a6d7c9cc05e0e6b72a214a455a106d9b22b0494164d50a657b17bd319534c218"
dependencies = [
"memchr",
"unicode-ident",
@@ -2125,9 +2125,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_next_trait_solver"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76f83dcc451bcee8a99e284a583d5b3d82db5a200107a256a40ef132c4988f1b"
+checksum = "cb3017c2f0ace80b8e6068b9c613aa56ed50e0374bf44a891447511f1264e40d"
dependencies = [
"derive-where",
"ra-ap-rustc_index",
@@ -2138,9 +2138,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_parse_format"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f31236bdc6cbcae8af42d0b2db2fa8d812a8715b90a2ba5afb1132b37a4d0bbc"
+checksum = "4a737f844bdef8ac5ab54dadf2f34704b4d06beef9236d71080bb34db697220b"
dependencies = [
"ra-ap-rustc_lexer",
"rustc-literal-escaper 0.0.7",
@@ -2148,9 +2148,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_pattern_analysis"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fc4edac740e896fba4b3b4d9c423083e3eac49947732561ddfb2377e1f57829"
+checksum = "6de3d4c7d6078cce3c40c55717b8b15002a80b9fa8849faea496a365324861b4"
dependencies = [
"ra-ap-rustc_index",
"rustc-hash 2.1.1",
@@ -2161,9 +2161,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_type_ir"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8efa119afc1bcadd821b27aa94332abf79c48ac0a972cb78932f63004ba4cdd9"
+checksum = "8c5d9a4d3e7bee7313599bc6d794037247ac0165f03857379cf4fc3097199e05"
dependencies = [
"arrayvec",
"bitflags 2.9.4",
@@ -2182,9 +2182,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_type_ir_macros"
-version = "0.160.0"
+version = "0.165.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6b1dc03abfabc7179393c282892c73a3f0e4bbd5f0b6c87ff42c2b142e68f57"
+checksum = "024598d1f54272acd83d28c121f8a2e82e216dd7be1e40158b66b2d12fa214c0"
dependencies = [
"proc-macro2",
"quote",
diff --git a/Cargo.toml b/Cargo.toml
index 45fc727b13..a08b2e412e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -86,14 +86,14 @@ vfs-notify = { path = "./crates/vfs-notify", version = "0.0.0" }
vfs = { path = "./crates/vfs", version = "0.0.0" }
edition = { path = "./crates/edition", version = "0.0.0" }
-ra-ap-rustc_lexer = { version = "0.160", default-features = false }
-ra-ap-rustc_parse_format = { version = "0.160", default-features = false }
-ra-ap-rustc_index = { version = "0.160", default-features = false }
-ra-ap-rustc_abi = { version = "0.160", default-features = false }
-ra-ap-rustc_pattern_analysis = { version = "0.160", default-features = false }
-ra-ap-rustc_ast_ir = { version = "0.160", default-features = false }
-ra-ap-rustc_type_ir = { version = "0.160", default-features = false }
-ra-ap-rustc_next_trait_solver = { version = "0.160", default-features = false }
+ra-ap-rustc_lexer = { version = "0.165", default-features = false }
+ra-ap-rustc_parse_format = { version = "0.165", default-features = false }
+ra-ap-rustc_index = { version = "0.165", default-features = false }
+ra-ap-rustc_abi = { version = "0.165", default-features = false }
+ra-ap-rustc_pattern_analysis = { version = "0.165", default-features = false }
+ra-ap-rustc_ast_ir = { version = "0.165", default-features = false }
+ra-ap-rustc_type_ir = { version = "0.165", default-features = false }
+ra-ap-rustc_next_trait_solver = { version = "0.165", default-features = false }
# local crates that aren't published to crates.io. These should not have versions.
diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs
index 7862cda69f..e683f06840 100644
--- a/crates/hir-def/src/expr_store/lower.rs
+++ b/crates/hir-def/src/expr_store/lower.rs
@@ -18,6 +18,7 @@ use hir_expand::{
span_map::SpanMap,
};
use intern::{Symbol, sym};
+use rustc_abi::ExternAbi;
use rustc_hash::FxHashMap;
use smallvec::SmallVec;
use stdx::never;
@@ -683,15 +684,13 @@ impl<'db> ExprCollector<'db> {
} else {
Vec::with_capacity(1)
};
- fn lower_abi(abi: ast::Abi) -> Symbol {
- match abi.abi_string() {
- Some(tok) => Symbol::intern(tok.text_without_quotes()),
- // `extern` default to be `extern "C"`.
- _ => sym::C,
- }
+ fn lower_abi(abi: ast::Abi) -> ExternAbi {
+ abi.abi_string()
+ .and_then(|abi| abi.text_without_quotes().parse().ok())
+ .unwrap_or(ExternAbi::FALLBACK)
}
- let abi = inner.abi().map(lower_abi);
+ let abi = inner.abi().map(lower_abi).unwrap_or(ExternAbi::Rust);
params.push((None, ret_ty));
TypeRef::Fn(Box::new(FnType {
is_varargs,
diff --git a/crates/hir-def/src/expr_store/pretty.rs b/crates/hir-def/src/expr_store/pretty.rs
index 3bf6a8c6a0..5afd7f38a7 100644
--- a/crates/hir-def/src/expr_store/pretty.rs
+++ b/crates/hir-def/src/expr_store/pretty.rs
@@ -8,6 +8,7 @@ use std::{
use hir_expand::{Lookup, mod_path::PathKind};
use itertools::Itertools;
+use rustc_abi::ExternAbi;
use span::Edition;
use stdx::never;
use syntax::ast::{HasName, RangeOp};
@@ -292,7 +293,7 @@ pub fn print_function(
if flags.contains(FnFlags::EXPLICIT_SAFE) {
w!(p, "safe ");
}
- if let Some(abi) = abi {
+ if *abi != ExternAbi::Rust {
w!(p, "extern \"{}\" ", abi.as_str());
}
w!(p, "fn ");
@@ -1315,9 +1316,9 @@ impl Printer<'_> {
if fn_.is_unsafe {
w!(self, "unsafe ");
}
- if let Some(abi) = &fn_.abi {
+ if fn_.abi != ExternAbi::Rust {
w!(self, "extern ");
- w!(self, "{}", abi.as_str());
+ w!(self, "{}", fn_.abi.as_str());
w!(self, " ");
}
w!(self, "fn(");
diff --git a/crates/hir-def/src/hir/type_ref.rs b/crates/hir-def/src/hir/type_ref.rs
index b64199fa26..1f48a82a89 100644
--- a/crates/hir-def/src/hir/type_ref.rs
+++ b/crates/hir-def/src/hir/type_ref.rs
@@ -2,8 +2,8 @@
//! be directly created from an ast::TypeRef, without further queries.
use hir_expand::name::Name;
-use intern::Symbol;
use la_arena::Idx;
+use rustc_abi::ExternAbi;
use thin_vec::ThinVec;
use crate::{
@@ -100,7 +100,7 @@ pub struct FnType {
pub params: Box<[(Option<Name>, TypeRefId)]>,
pub is_varargs: bool,
pub is_unsafe: bool,
- pub abi: Option<Symbol>,
+ pub abi: ExternAbi,
}
impl FnType {
diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs
index 60b1f8cc7e..1d9bf77b55 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -47,8 +47,9 @@ pub mod find_path;
pub mod import_map;
pub mod visibility;
-use intern::{Interned, Symbol};
+use intern::Interned;
pub use rustc_abi as layout;
+use rustc_abi::ExternAbi;
use thin_vec::ThinVec;
pub use crate::signatures::LocalFieldId;
@@ -360,10 +361,8 @@ impl_intern!(ExternCrateId, ExternCrateLoc, intern_extern_crate, lookup_intern_e
type ExternBlockLoc = ItemLoc<ast::ExternBlock>;
impl_intern!(ExternBlockId, ExternBlockLoc, intern_extern_block, lookup_intern_extern_block);
-#[salsa::tracked]
impl ExternBlockId {
- #[salsa::tracked]
- pub fn abi(self, db: &dyn DefDatabase) -> Option<Symbol> {
+ pub fn abi(self, db: &dyn DefDatabase) -> ExternAbi {
signatures::extern_block_abi(db, self)
}
}
diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs
index aedfaaa6aa..e58befae20 100644
--- a/crates/hir-def/src/signatures.rs
+++ b/crates/hir-def/src/signatures.rs
@@ -8,9 +8,9 @@ use hir_expand::{
InFile, Intern, Lookup,
name::{AsName, Name},
};
-use intern::{Symbol, sym};
+use intern::sym;
use la_arena::{Arena, Idx};
-use rustc_abi::{IntegerType, ReprOptions};
+use rustc_abi::{ExternAbi, IntegerType, ReprOptions};
use syntax::{
AstNode, NodeOrToken, SyntaxNodePtr, T,
ast::{self, HasGenericParams, HasName, HasVisibility, IsString},
@@ -607,7 +607,7 @@ pub struct FunctionSignature {
pub store: ExpressionStore,
pub params: Box<[TypeRefId]>,
pub ret_type: Option<TypeRefId>,
- pub abi: Option<Symbol>,
+ pub abi: ExternAbi,
pub flags: FnFlags,
}
@@ -677,14 +677,18 @@ impl FunctionSignature {
.abi()
.map(|abi| {
abi.abi_string()
- .map_or_else(|| sym::C, |it| Symbol::intern(it.text_without_quotes()))
+ .and_then(|abi| abi.text_without_quotes().parse().ok())
+ .unwrap_or(ExternAbi::FALLBACK)
})
.or_else(|| match loc.container {
- ItemContainerId::ExternBlockId(extern_block) => extern_block_abi(db, extern_block),
+ ItemContainerId::ExternBlockId(extern_block) => {
+ Some(extern_block_abi(db, extern_block))
+ }
ItemContainerId::ModuleId(_)
| ItemContainerId::ImplId(_)
| ItemContainerId::TraitId(_) => None,
- });
+ })
+ .unwrap_or(ExternAbi::Rust);
let (store, source_map, generic_params, params, ret_type, self_param, variadic) =
lower_function(db, module, source, id);
if self_param {
@@ -771,8 +775,6 @@ impl FunctionSignature {
pub fn is_intrinsic(db: &dyn DefDatabase, id: FunctionId) -> bool {
let data = FunctionSignature::of(db, id);
data.flags.contains(FnFlags::RUSTC_INTRINSIC)
- // Keep this around for a bit until extern "rustc-intrinsic" abis are no longer used
- || data.abi.as_ref().is_some_and(|abi| *abi == sym::rust_dash_intrinsic)
}
}
@@ -1136,16 +1138,12 @@ impl EnumVariants {
}
}
-pub(crate) fn extern_block_abi(
- db: &dyn DefDatabase,
- extern_block: ExternBlockId,
-) -> Option<Symbol> {
+#[salsa::tracked]
+pub(crate) fn extern_block_abi(db: &dyn DefDatabase, extern_block: ExternBlockId) -> ExternAbi {
let source = extern_block.lookup(db).source(db);
- source.value.abi().map(|abi| {
- match abi.abi_string() {
- Some(tok) => Symbol::intern(tok.text_without_quotes()),
- // `extern` default to be `extern "C"`.
- _ => sym::C,
- }
- })
+ source
+ .value
+ .abi()
+ .and_then(|abi| abi.abi_string()?.text_without_quotes().parse().ok())
+ .unwrap_or(ExternAbi::FALLBACK)
}
diff --git a/crates/hir-ty/src/builtin_derive.rs b/crates/hir-ty/src/builtin_derive.rs
index 73c0313823..fe60fbc510 100644
--- a/crates/hir-ty/src/builtin_derive.rs
+++ b/crates/hir-ty/src/builtin_derive.rs
@@ -21,7 +21,8 @@ use crate::{
db::HirDatabase,
next_solver::{
AliasTy, Clause, Clauses, DbInterner, EarlyBinder, GenericArgs, ParamEnv,
- StoredEarlyBinder, StoredTy, TraitRef, Ty, TyKind, fold::fold_tys, generics::Generics,
+ StoredEarlyBinder, StoredTy, TraitRef, Ty, TyKind, Unnormalized, fold::fold_tys,
+ generics::Generics,
},
};
@@ -197,6 +198,7 @@ pub fn predicates(db: &dyn HirDatabase, impl_: BuiltinDeriveImplId) -> GenericPr
};
let duplicated_bounds =
adt_predicates.explicit_predicates().iter_identity().filter_map(|pred| {
+ let pred = pred.skip_norm_wip();
let mentions_pointee =
pred.visit_with(&mut MentionsPointee { pointee_param_idx }).is_break();
if !mentions_pointee {
@@ -218,6 +220,7 @@ pub fn predicates(db: &dyn HirDatabase, impl_: BuiltinDeriveImplId) -> GenericPr
adt_predicates
.explicit_predicates()
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.chain(duplicated_bounds)
.chain(unsize_bound),
)
@@ -319,6 +322,7 @@ fn simple_trait_predicates<'db>(
adt_predicates
.explicit_predicates()
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.chain(extra_predicates)
.chain(assoc_type_bounds),
)
@@ -361,7 +365,7 @@ fn extend_assoc_type_bounds<'db>(
let mut visitor = ProjectionFinder { interner, assoc_type_bounds, trait_id, trait_ };
for (_, field) in fields.iter() {
- field.get().instantiate_identity().visit_with(&mut visitor);
+ field.get().instantiate_identity().skip_norm_wip().visit_with(&mut visitor);
}
}
diff --git a/crates/hir-ty/src/consteval/tests.rs b/crates/hir-ty/src/consteval/tests.rs
index 90d9a2ab62..f158661069 100644
--- a/crates/hir-ty/src/consteval/tests.rs
+++ b/crates/hir-ty/src/consteval/tests.rs
@@ -2565,9 +2565,8 @@ fn const_transfer_memory() {
fn anonymous_const_block() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn size_of<T>() -> usize;
- }
+ #[rustc_intrinsic]
+ pub fn size_of<T>() -> usize;
const fn f<T>() -> usize {
let r = const { size_of::<T>() };
diff --git a/crates/hir-ty/src/consteval/tests/intrinsics.rs b/crates/hir-ty/src/consteval/tests/intrinsics.rs
index 10282d2116..85e917fe1a 100644
--- a/crates/hir-ty/src/consteval/tests/intrinsics.rs
+++ b/crates/hir-ty/src/consteval/tests/intrinsics.rs
@@ -204,12 +204,11 @@ fn const_eval_select() {
check_number(
r#"
//- minicore: fn
- extern "rust-intrinsic" {
- pub fn const_eval_select<ARG, F, G, RET>(arg: ARG, called_in_const: F, called_at_rt: G) -> RET
- where
- G: FnOnce<ARG, Output = RET>,
- F: FnOnce<ARG, Output = RET>;
- }
+ #[rustc_intrinsic]
+ pub fn const_eval_select<ARG, F, G, RET>(arg: ARG, called_in_const: F, called_at_rt: G) -> RET
+ where
+ G: FnOnce<ARG, Output = RET>,
+ F: FnOnce<ARG, Output = RET>;
const fn in_const(x: i32, y: i32) -> i32 {
x + y
@@ -229,9 +228,8 @@ fn const_eval_select() {
fn wrapping_add() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn wrapping_add<T>(a: T, b: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn wrapping_add<T>(a: T, b: T) -> T;
const GOAL: u8 = wrapping_add(10, 250);
"#,
@@ -244,10 +242,10 @@ fn ptr_offset_from() {
check_number(
r#"
//- minicore: index, slice, coerce_unsized
- extern "rust-intrinsic" {
- pub fn ptr_offset_from<T>(ptr: *const T, base: *const T) -> isize;
- pub fn ptr_offset_from_unsigned<T>(ptr: *const T, base: *const T) -> usize;
- }
+ #[rustc_intrinsic]
+ pub fn ptr_offset_from<T>(ptr: *const T, base: *const T) -> isize;
+ #[rustc_intrinsic]
+ pub fn ptr_offset_from_unsigned<T>(ptr: *const T, base: *const T) -> usize;
const GOAL: isize = {
let x = [1, 2, 3, 4, 5i32];
@@ -265,9 +263,8 @@ fn ptr_offset_from() {
fn saturating() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn saturating_add<T>(a: T, b: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn saturating_add<T>(a: T, b: T) -> T;
const GOAL: u8 = saturating_add(10, 250);
"#,
@@ -275,9 +272,8 @@ fn saturating() {
);
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn saturating_sub<T>(a: T, b: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn saturating_sub<T>(a: T, b: T) -> T;
const GOAL: bool = saturating_sub(5u8, 7) == 0 && saturating_sub(8u8, 4) == 4;
"#,
@@ -285,9 +281,8 @@ fn saturating() {
);
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn saturating_add<T>(a: T, b: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn saturating_add<T>(a: T, b: T) -> T;
const GOAL: i8 = saturating_add(5, 8);
"#,
@@ -330,9 +325,8 @@ fn allocator() {
fn overflowing_add() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn add_with_overflow<T>(x: T, y: T) -> (T, bool);
- }
+ #[rustc_intrinsic]
+ pub fn add_with_overflow<T>(x: T, y: T) -> (T, bool);
const GOAL: u8 = add_with_overflow(1, 2).0;
"#,
@@ -340,9 +334,8 @@ fn overflowing_add() {
);
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn add_with_overflow<T>(x: T, y: T) -> (T, bool);
- }
+ #[rustc_intrinsic]
+ pub fn add_with_overflow<T>(x: T, y: T) -> (T, bool);
const GOAL: u8 = add_with_overflow(1, 2).1 as u8;
"#,
@@ -357,9 +350,8 @@ fn needs_drop() {
//- minicore: drop, manually_drop, copy, sized, phantom_data
use core::mem::ManuallyDrop;
use core::marker::PhantomData;
- extern "rust-intrinsic" {
- pub fn needs_drop<T: ?Sized>() -> bool;
- }
+ #[rustc_intrinsic]
+ pub fn needs_drop<T: ?Sized>() -> bool;
struct X;
struct NeedsDrop;
impl Drop for NeedsDrop {
@@ -405,9 +397,8 @@ fn discriminant_value() {
r#"
//- minicore: discriminant, option
use core::marker::DiscriminantKind;
- extern "rust-intrinsic" {
- pub fn discriminant_value<T>(v: &T) -> <T as DiscriminantKind>::Discriminant;
- }
+ #[rustc_intrinsic]
+ pub fn discriminant_value<T>(v: &T) -> <T as DiscriminantKind>::Discriminant;
const GOAL: bool = {
discriminant_value(&Some(2i32)) == discriminant_value(&Some(5i32))
&& discriminant_value(&Some(2i32)) != discriminant_value(&None::<i32>)
@@ -442,11 +433,12 @@ fn floating_point() {
// FIXME(#17451): Add `f16` and `f128` tests once intrinsics are added.
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn sqrtf32(x: f32) -> f32;
- pub fn powf32(a: f32, x: f32) -> f32;
- pub fn fmaf32(a: f32, b: f32, c: f32) -> f32;
- }
+ #[rustc_intrinsic]
+ pub fn sqrtf32(x: f32) -> f32;
+ #[rustc_intrinsic]
+ pub fn powf32(a: f32, x: f32) -> f32;
+ #[rustc_intrinsic]
+ pub fn fmaf32(a: f32, b: f32, c: f32) -> f32;
const GOAL: f32 = sqrtf32(1.2) + powf32(3.4, 5.6) + fmaf32(-7.8, 1.3, 2.4);
"#,
@@ -458,11 +450,12 @@ fn floating_point() {
#[allow(unknown_lints, clippy::unnecessary_min_or_max)]
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn powif64(a: f64, x: i32) -> f64;
- pub fn sinf64(x: f64) -> f64;
- pub fn minnumf64(x: f64, y: f64) -> f64;
- }
+ #[rustc_intrinsic]
+ pub fn powif64(a: f64, x: i32) -> f64;
+ #[rustc_intrinsic]
+ pub fn sinf64(x: f64) -> f64;
+ #[rustc_intrinsic]
+ pub fn minnumf64(x: f64, y: f64) -> f64;
const GOAL: f64 = powif64(1.2, 5) + sinf64(3.4) + minnumf64(-7.8, 1.3);
"#,
@@ -478,21 +471,32 @@ fn atomic() {
check_number(
r#"
//- minicore: copy
- extern "rust-intrinsic" {
- pub fn atomic_load_seqcst<T: Copy>(src: *const T) -> T;
- pub fn atomic_xchg_acquire<T: Copy>(dst: *mut T, src: T) -> T;
- pub fn atomic_cxchg_release_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
- pub fn atomic_cxchgweak_acquire_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
- pub fn atomic_store_release<T: Copy>(dst: *mut T, val: T);
- pub fn atomic_xadd_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
- pub fn atomic_xsub_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
- pub fn atomic_and_acquire<T: Copy>(dst: *mut T, src: T) -> T;
- pub fn atomic_nand_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
- pub fn atomic_or_release<T: Copy>(dst: *mut T, src: T) -> T;
- pub fn atomic_xor_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
- pub fn atomic_fence_seqcst();
- pub fn atomic_singlethreadfence_acqrel();
- }
+ #[rustc_intrinsic]
+ pub fn atomic_load_seqcst<T: Copy>(src: *const T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_xchg_acquire<T: Copy>(dst: *mut T, src: T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_cxchg_release_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
+ #[rustc_intrinsic]
+ pub fn atomic_cxchgweak_acquire_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
+ #[rustc_intrinsic]
+ pub fn atomic_store_release<T: Copy>(dst: *mut T, val: T);
+ #[rustc_intrinsic]
+ pub fn atomic_xadd_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_xsub_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_and_acquire<T: Copy>(dst: *mut T, src: T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_nand_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_or_release<T: Copy>(dst: *mut T, src: T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_xor_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
+ #[rustc_intrinsic]
+ pub fn atomic_fence_seqcst();
+ #[rustc_intrinsic]
+ pub fn atomic_singlethreadfence_acqrel();
fn should_not_reach() {
_ // fails the test if executed
@@ -528,10 +532,10 @@ fn offset() {
check_number(
r#"
//- minicore: coerce_unsized, index, slice
- extern "rust-intrinsic" {
- pub fn offset<Ptr, Delta>(dst: Ptr, offset: Delta) -> Ptr;
- pub fn arith_offset<T>(dst: *const T, offset: isize) -> *const T;
- }
+ #[rustc_intrinsic]
+ pub fn offset<Ptr, Delta>(dst: Ptr, offset: Delta) -> Ptr;
+ #[rustc_intrinsic]
+ pub fn arith_offset<T>(dst: *const T, offset: isize) -> *const T;
const GOAL: i32 = unsafe {
let ar: &[(i32, i32, i32)] = &[
@@ -557,9 +561,8 @@ fn arith_offset() {
check_number(
r#"
//- minicore: coerce_unsized, index, slice
- extern "rust-intrinsic" {
- pub fn arith_offset<T>(dst: *const T, offset: isize) -> *const T;
- }
+ #[rustc_intrinsic]
+ pub fn arith_offset<T>(dst: *const T, offset: isize) -> *const T;
const GOAL: u8 = unsafe {
let ar: &[(u8, u8, u8)] = &[
@@ -583,9 +586,8 @@ fn arith_offset() {
fn copy_nonoverlapping() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
- }
+ #[rustc_intrinsic]
+ pub fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
const GOAL: u8 = unsafe {
let mut x = 2;
@@ -602,9 +604,8 @@ fn copy_nonoverlapping() {
fn write_bytes() {
check_number(
r#"
- extern "rust-intrinsic" {
- fn write_bytes<T>(dst: *mut T, val: u8, count: usize);
- }
+ #[rustc_intrinsic]
+ fn write_bytes<T>(dst: *mut T, val: u8, count: usize);
const GOAL: i32 = unsafe {
let mut x = 2;
@@ -620,9 +621,8 @@ fn write_bytes() {
fn write_via_move() {
check_number(
r#"
- extern "rust-intrinsic" {
- fn write_via_move<T>(ptr: *mut T, value: T);
- }
+ #[rustc_intrinsic]
+ fn write_via_move<T>(ptr: *mut T, value: T);
const GOAL: i32 = unsafe {
let mut x = 2;
@@ -639,9 +639,8 @@ fn copy() {
check_number(
r#"
//- minicore: coerce_unsized, index, slice
- extern "rust-intrinsic" {
- pub fn copy<T>(src: *const T, dst: *mut T, count: usize);
- }
+ #[rustc_intrinsic]
+ pub fn copy<T>(src: *const T, dst: *mut T, count: usize);
const GOAL: i32 = unsafe {
let mut x = [1i32, 2, 3, 4, 5];
@@ -659,9 +658,8 @@ fn copy() {
fn ctpop() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn ctpop<T: Copy>(x: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn ctpop<T: Copy>(x: T) -> T;
const GOAL: i64 = ctpop(-29);
"#,
@@ -673,9 +671,8 @@ fn ctpop() {
fn ctlz() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn ctlz<T: Copy>(x: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn ctlz<T: Copy>(x: T) -> T;
const GOAL: u8 = ctlz(0b0001_1100_u8);
"#,
@@ -687,9 +684,8 @@ fn ctlz() {
fn cttz() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn cttz<T: Copy>(x: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn cttz<T: Copy>(x: T) -> T;
const GOAL: i64 = cttz(-24);
"#,
@@ -701,9 +697,8 @@ fn cttz() {
fn rotate() {
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn rotate_left<T: Copy>(x: T, y: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn rotate_left<T: Copy>(x: T, y: T) -> T;
const GOAL: i64 = rotate_left(0xaa00000000006e1i64, 12);
"#,
@@ -711,9 +706,8 @@ fn rotate() {
);
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn rotate_right<T: Copy>(x: T, y: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn rotate_right<T: Copy>(x: T, y: T) -> T;
const GOAL: i64 = rotate_right(0x6e10aa, 12);
"#,
@@ -721,9 +715,8 @@ fn rotate() {
);
check_number(
r#"
- extern "rust-intrinsic" {
- pub fn rotate_left<T: Copy>(x: T, y: T) -> T;
- }
+ #[rustc_intrinsic]
+ pub fn rotate_left<T: Copy>(x: T, y: T) -> T;
const GOAL: i8 = rotate_left(129, 2);
"#,
diff --git a/crates/hir-ty/src/diagnostics/decl_check.rs b/crates/hir-ty/src/diagnostics/decl_check.rs
index 89d8c0e91d..76fbb66b06 100644
--- a/crates/hir-ty/src/diagnostics/decl_check.rs
+++ b/crates/hir-ty/src/diagnostics/decl_check.rs
@@ -33,7 +33,7 @@ use hir_expand::{
HirFileId,
name::{AsName, Name},
};
-use intern::sym;
+use rustc_abi::ExternAbi;
use stdx::{always, never};
use syntax::{
AstNode, AstPtr, ToSmolStr,
@@ -211,7 +211,7 @@ impl<'a> DeclValidator<'a> {
// Don't run the lint on extern "[not Rust]" fn items with the
// #[no_mangle] attribute.
let no_mangle = AttrFlags::query(self.db, func.into()).contains(AttrFlags::NO_MANGLE);
- if no_mangle && data.abi.as_ref().is_some_and(|abi| *abi != sym::Rust) {
+ if no_mangle && data.abi != ExternAbi::Rust {
cov_mark::hit!(extern_func_no_mangle_ignored);
} else {
self.create_incorrect_case_diagnostic_for_item_name(
diff --git a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
index 87ffa32544..46959aaa5a 100644
--- a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
+++ b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
@@ -149,7 +149,7 @@ impl<'a, 'db> MatchCheckCtx<'a, 'db> {
let fields_len = variant.fields(self.db).fields().len() as u32;
(0..fields_len).map(|idx| LocalFieldId::from_raw(idx.into())).map(move |fid| {
- let ty = field_tys[fid].get().instantiate(self.infcx.interner, substs);
+ let ty = field_tys[fid].get().instantiate(self.infcx.interner, substs).skip_norm_wip();
let ty = self
.infcx
.at(&ObligationCause::dummy(), self.env)
diff --git a/crates/hir-ty/src/diagnostics/unsafe_check.rs b/crates/hir-ty/src/diagnostics/unsafe_check.rs
index 4db6066a56..c37a194d47 100644
--- a/crates/hir-ty/src/diagnostics/unsafe_check.rs
+++ b/crates/hir-ty/src/diagnostics/unsafe_check.rs
@@ -298,7 +298,7 @@ impl<'db> UnsafeVisitor<'db> {
self.check_call(current, func);
}
if let TyKind::FnPtr(_, hdr) = callee.kind()
- && hdr.safety == Safety::Unsafe
+ && hdr.safety() == Safety::Unsafe
{
self.on_unsafe_op(current.into(), UnsafetyReason::UnsafeFnCall);
}
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index df8ea98dd0..0728509432 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -11,7 +11,7 @@ use base_db::{Crate, FxIndexMap};
use either::Either;
use hir_def::{
ExpressionStoreOwnerId, FindPathConfig, GenericDefId, GenericParamId, HasModule,
- ItemContainerId, LocalFieldId, Lookup, ModuleDefId, ModuleId, TraitId,
+ ItemContainerId, LocalFieldId, Lookup, ModuleDefId, ModuleId, TraitId, TypeAliasId,
expr_store::{ExpressionStore, path::Path},
find_path::{self, PrefixKind},
hir::{
@@ -35,6 +35,7 @@ use hir_expand::{mod_path::PathKind, name::Name};
use intern::{Internable, Interned, sym};
use itertools::Itertools;
use la_arena::ArenaMap;
+use rustc_abi::ExternAbi;
use rustc_apfloat::{
Float,
ieee::{Half as f16, Quad as f128},
@@ -50,7 +51,7 @@ use span::Edition;
use stdx::never;
use crate::{
- CallableDefId, FnAbi, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval,
+ CallableDefId, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval,
db::{GeneralConstId, HirDatabase},
generics::{ProvenanceSplit, generics},
layout::Layout,
@@ -59,8 +60,8 @@ use crate::{
next_solver::{
AliasTy, Allocation, Clause, ClauseKind, Const, ConstKind, DbInterner,
ExistentialPredicate, FnSig, GenericArg, GenericArgKind, GenericArgs, ParamEnv, PolyFnSig,
- Region, SolverDefId, StoredEarlyBinder, StoredTy, Term, TermKind, TraitPredicate, TraitRef,
- Ty, TyKind, TypingMode, ValTree,
+ Region, StoredEarlyBinder, StoredTy, Term, TermId, TermKind, TraitPredicate, TraitRef, Ty,
+ TyKind, TypingMode, Unnormalized, ValTree,
abi::Safety,
infer::{DbInternerInferExt, traits::ObligationCause},
},
@@ -190,7 +191,7 @@ impl<'db> HirFormatter<'_, 'db> {
} else {
match target.kind {
AliasTyKind::Projection { def_id } => {
- let def_id = def_id.expect_type_alias();
+ let def_id = def_id.0;
let ItemContainerId::TraitId(trait_) = def_id.loc(self.db).container else {
panic!("expected an assoc type");
};
@@ -653,6 +654,7 @@ fn write_projection<'db>(
f: &mut HirFormatter<'_, 'db>,
alias: &AliasTy<'db>,
needs_parens_if_multi: bool,
+ def_id: TypeAliasId,
) -> Result {
f.format_bounds_with(*alias, |f| {
if f.should_truncate() {
@@ -671,6 +673,7 @@ fn write_projection<'db>(
// `GenericDefId` from the formatted type (store it inside the `HirFormatter`).
let bounds = GenericPredicates::query_all(f.db, param.id.parent())
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.filter(|wc| {
let ty = match wc.kind().skip_binder() {
ClauseKind::Trait(tr) => tr.self_ty(),
@@ -699,13 +702,7 @@ fn write_projection<'db>(
self_ty.hir_fmt(f)?;
write!(f, " as ")?;
trait_ref.hir_fmt(f)?;
- write!(
- f,
- ">::{}",
- TypeAliasSignature::of(f.db, alias.kind.def_id().expect_type_alias())
- .name
- .display(f.db, f.edition())
- )?;
+ write!(f, ">::{}", TypeAliasSignature::of(f.db, def_id).name.display(f.db, f.edition()))?;
let proj_params = &alias.args.as_slice()[trait_ref.args.len()..];
hir_fmt_generics(f, proj_params, None, None)
})
@@ -1223,7 +1220,7 @@ fn render_variant_after_name<'db>(
FieldsShape::Record | FieldsShape::Tuple => {
let render_field = |f: &mut HirFormatter<'_, 'db>, id: LocalFieldId| {
let offset = layout.fields.offset(u32::from(id.into_raw()) as usize).bytes_usize();
- let ty = field_types[id].get().instantiate(f.interner, args);
+ let ty = field_types[id].get().instantiate(f.interner, args).skip_norm_wip();
let Ok(layout) = f.db.layout_of_ty(ty.store(), param_env.store()) else {
return f.write_str("<layout-error>");
};
@@ -1334,7 +1331,8 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
}
TyKind::FnDef(def, args) => {
let def = def.0;
- let sig = db.callable_item_signature(def).instantiate(interner, args);
+ let sig =
+ db.callable_item_signature(def).instantiate(interner, args).skip_norm_wip();
if f.display_kind.is_source_code() {
// `FnDef` is anonymous and there's no surface syntax for it. Show it as a
@@ -1344,7 +1342,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
if let Safety::Unsafe = sig.safety() {
write!(f, "unsafe ")?;
}
- if !matches!(sig.abi(), FnAbi::Rust | FnAbi::RustCall) {
+ if !sig.abi().is_rustic_abi() {
f.write_str("extern \"")?;
f.write_str(sig.abi().as_str())?;
f.write_str("\" ")?;
@@ -1480,8 +1478,8 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
hir_fmt_generics(f, parameters.as_slice(), Some(def.def_id().into()), None)?;
}
- TyKind::Alias(alias_ty @ AliasTy { kind: AliasTyKind::Projection { .. }, .. }) => {
- write_projection(f, &alias_ty, trait_bounds_need_parens)?
+ TyKind::Alias(alias_ty @ AliasTy { kind: AliasTyKind::Projection { def_id }, .. }) => {
+ write_projection(f, &alias_ty, trait_bounds_need_parens, def_id.0)?
}
TyKind::Foreign(alias) => {
let type_alias = TypeAliasSignature::of(db, alias.0);
@@ -1490,10 +1488,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
f.end_location_link();
}
TyKind::Alias(alias_ty @ AliasTy { kind: AliasTyKind::Opaque { def_id }, .. }) => {
- let opaque_ty_id = match def_id {
- SolverDefId::InternedOpaqueTyId(id) => id,
- _ => unreachable!(),
- };
+ let opaque_ty_id = def_id.0;
if !f.display_kind.allows_opaque() {
return Err(HirDisplayError::DisplaySourceCodeError(
DisplaySourceCodeError::OpaqueType,
@@ -1503,6 +1498,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
let data = impl_trait_id.predicates(db);
let bounds = data
.iter_instantiated_copied(interner, alias_ty.args.as_slice())
+ .map(Unnormalized::skip_norm_wip)
.collect::<Vec<_>>();
let krate = match impl_trait_id {
ImplTraitId::ReturnTypeImplTrait(func, _) => {
@@ -1670,6 +1666,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
TypeParamProvenance::ArgumentImplTrait => {
let bounds = GenericPredicates::query_all(f.db, param.id.parent())
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.filter(|wc| match wc.kind().skip_binder() {
ClauseKind::Trait(tr) => tr.self_ty() == *self,
ClauseKind::Projection(proj) => proj.self_ty() == *self,
@@ -1878,7 +1875,9 @@ fn generic_args_sans_defaults<'ga, 'db>(
let should_show = |arg: GenericArg<'db>, i: usize| match default_parameters.get(i) {
None => true,
Some(default_parameter) => {
- arg != default_parameter.instantiate(f.interner, &parameters[..i])
+ arg != default_parameter
+ .instantiate(f.interner, &parameters[..i])
+ .skip_norm_wip()
}
};
let mut default_from = 0;
@@ -1961,8 +1960,8 @@ fn hir_fmt_tys<'db>(
impl<'db> HirDisplay<'db> for PolyFnSig<'db> {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
- let FnSig { inputs_and_output, c_variadic, safety, abi: _ } = self.skip_binder();
- if let Safety::Unsafe = safety {
+ let FnSig { inputs_and_output, fn_sig_kind } = self.skip_binder();
+ if let Safety::Unsafe = fn_sig_kind.safety() {
write!(f, "unsafe ")?;
}
// FIXME: Enable this when the FIXME on FnAbi regarding PartialEq is fixed.
@@ -1973,7 +1972,7 @@ impl<'db> HirDisplay<'db> for PolyFnSig<'db> {
// }
write!(f, "fn(")?;
f.write_joined(inputs_and_output.inputs(), ", ")?;
- if c_variadic {
+ if fn_sig_kind.c_variadic() {
if inputs_and_output.inputs().is_empty() {
write!(f, "...")?;
} else {
@@ -2176,6 +2175,9 @@ fn write_bounds_like_dyn_trait<'db>(
}
}
ClauseKind::Projection(projection) => {
+ let TermId::TypeAliasId(assoc_ty_id) = projection.def_id().0 else {
+ continue;
+ };
// in types in actual Rust, these will always come
// after the corresponding Implemented predicate
if angle_open {
@@ -2184,7 +2186,6 @@ fn write_bounds_like_dyn_trait<'db>(
write!(f, "<")?;
angle_open = true;
}
- let assoc_ty_id = projection.def_id().expect_type_alias();
let type_alias = TypeAliasSignature::of(f.db, assoc_ty_id);
f.start_location_link(assoc_ty_id.into());
write!(f, "{}", type_alias.name.display(f.db, f.edition()))?;
@@ -2490,9 +2491,9 @@ impl<'db> HirDisplayWithExpressionStore<'db> for TypeRefId {
if fn_.is_unsafe {
write!(f, "unsafe ")?;
}
- if let Some(abi) = &fn_.abi {
+ if fn_.abi != ExternAbi::Rust {
f.write_str("extern \"")?;
- f.write_str(abi.as_str())?;
+ f.write_str(fn_.abi.as_str())?;
f.write_str("\" ")?;
}
write!(f, "fn(")?;
diff --git a/crates/hir-ty/src/drop.rs b/crates/hir-ty/src/drop.rs
index 07c705ee2f..d4a948c7b2 100644
--- a/crates/hir-ty/src/drop.rs
+++ b/crates/hir-ty/src/drop.rs
@@ -87,7 +87,7 @@ fn has_drop_glue_impl<'db>(
.map(|(_, field_ty)| {
has_drop_glue_impl(
infcx,
- field_ty.get().instantiate(infcx.interner, subst),
+ field_ty.get().instantiate(infcx.interner, subst).skip_norm_wip(),
env,
visited,
)
@@ -107,7 +107,10 @@ fn has_drop_glue_impl<'db>(
.map(|(_, field_ty)| {
has_drop_glue_impl(
infcx,
- field_ty.get().instantiate(infcx.interner, subst),
+ field_ty
+ .get()
+ .instantiate(infcx.interner, subst)
+ .skip_norm_wip(),
env,
visited,
)
diff --git a/crates/hir-ty/src/dyn_compatibility.rs b/crates/hir-ty/src/dyn_compatibility.rs
index 0cf7f650f0..5ffb27af26 100644
--- a/crates/hir-ty/src/dyn_compatibility.rs
+++ b/crates/hir-ty/src/dyn_compatibility.rs
@@ -22,7 +22,7 @@ use crate::{
lower::{GenericPredicates, associated_ty_item_bounds},
next_solver::{
AliasTy, Binder, Clause, Clauses, DbInterner, EarlyBinder, GenericArgs, ParamEnv, ParamTy,
- SolverDefId, TraitPredicate, TraitRef, Ty, TypingMode,
+ SolverDefId, TraitPredicate, TraitRef, Ty, TypingMode, Unnormalized,
infer::{
DbInternerInferExt,
traits::{Obligation, ObligationCause},
@@ -146,8 +146,8 @@ pub fn generics_require_sized_self(db: &dyn HirDatabase, def: GenericDefId) -> b
// FIXME: We should use `explicit_predicates_of` here, which hasn't been implemented to
// rust-analyzer yet
// https://github.com/rust-lang/rust/blob/ddaf12390d3ffb7d5ba74491a48f3cd528e5d777/compiler/rustc_hir_analysis/src/collect/predicates_of.rs#L490
- elaborate::elaborate(interner, predicates.iter_identity()).any(|pred| {
- match pred.kind().skip_binder() {
+ elaborate::elaborate(interner, predicates.iter_identity().map(Unnormalized::skip_norm_wip)).any(
+ |pred| match pred.kind().skip_binder() {
ClauseKind::Trait(trait_pred) => {
if sized == trait_pred.def_id().0
&& let rustc_type_ir::TyKind::Param(param_ty) =
@@ -160,17 +160,17 @@ pub fn generics_require_sized_self(db: &dyn HirDatabase, def: GenericDefId) -> b
}
}
_ => false,
- }
- })
+ },
+ )
}
// rustc gathers all the spans that references `Self` for error rendering,
// but we don't have good way to render such locations.
// So, just return single boolean value for existence of such `Self` reference
fn predicates_reference_self(db: &dyn HirDatabase, trait_: TraitId) -> bool {
- GenericPredicates::query_explicit(db, trait_.into())
- .iter_identity()
- .any(|pred| predicate_references_self(db, trait_, pred, AllowSelfProjection::No))
+ GenericPredicates::query_explicit(db, trait_.into()).iter_identity().any(|pred| {
+ predicate_references_self(db, trait_, pred.skip_norm_wip(), AllowSelfProjection::No)
+ })
}
// Same as the above, `predicates_reference_self`
@@ -248,11 +248,7 @@ fn contains_illegal_self_type_reference<'db, T: rustc_type_ir::TypeVisitable<DbI
proj @ AliasTy { kind: AliasTyKind::Projection { .. }, .. },
) => match self.allow_self_projection {
AllowSelfProjection::Yes => {
- let trait_ = proj.trait_def_id(interner);
- let trait_ = match trait_ {
- SolverDefId::TraitId(id) => id,
- _ => unreachable!(),
- };
+ let trait_ = proj.trait_def_id(interner).0;
if self.super_traits.is_none() {
self.super_traits = Some(
elaborate::supertrait_def_ids(interner, self.trait_.into())
@@ -404,7 +400,7 @@ fn receiver_is_dispatchable<'db>(
func: FunctionId,
sig: &EarlyBinder<'db, Binder<'db, rustc_type_ir::FnSig<DbInterner<'db>>>>,
) -> bool {
- let sig = sig.instantiate_identity();
+ let sig = sig.instantiate_identity().skip_norm_wip();
let module = trait_.module(db);
let interner = DbInterner::new_with(db, module.krate(db));
@@ -468,6 +464,7 @@ fn receiver_is_dispatchable<'db>(
interner,
generic_predicates
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.chain([unsize_predicate.upcast(interner), trait_predicate.upcast(interner)])
.chain(meta_sized_predicate),
),
@@ -494,7 +491,7 @@ fn receiver_for_self_ty<'db>(
if index == 0 { self_ty.into() } else { mk_param(interner, index, kind) }
});
- EarlyBinder::bind(receiver_ty).instantiate(interner, args)
+ EarlyBinder::bind(receiver_ty).instantiate(interner, args).skip_norm_wip()
}
fn contains_illegal_impl_trait_in_trait<'db>(
@@ -515,11 +512,7 @@ fn contains_illegal_impl_trait_in_trait<'db>(
..
}) = ty.kind()
{
- let id = match def_id {
- SolverDefId::InternedOpaqueTyId(id) => id,
- _ => unreachable!(),
- };
- self.0.insert(id);
+ self.0.insert(def_id.0);
}
ty.super_visit_with(self)
}
diff --git a/crates/hir-ty/src/infer.rs b/crates/hir-ty/src/infer.rs
index e338548626..b399a7e0ed 100644
--- a/crates/hir-ty/src/infer.rs
+++ b/crates/hir-ty/src/infer.rs
@@ -204,7 +204,7 @@ fn infer_anon_const_query(db: &dyn HirDatabase, def: AnonConstId) -> InferenceRe
ctx.infer_expr(
loc.expr,
- &Expectation::has_type(loc.ty.get().instantiate_identity()),
+ &Expectation::has_type(loc.ty.get().instantiate_identity().skip_norm_wip()),
ExprIsRead::Yes,
);
@@ -2006,7 +2006,7 @@ impl<'body, 'db> InferenceContext<'body, 'db> {
.map(|it| it.get())
{
Some(field) => {
- ty = field.instantiate(self.interner(), substs);
+ ty = field.instantiate(self.interner(), substs).skip_norm_wip();
}
None => break,
}
@@ -2197,7 +2197,7 @@ impl<'body, 'db> InferenceContext<'body, 'db> {
if let Some(TypeNs::SelfType(impl_)) = type_ns
&& let Some(trait_ref) = self.db.impl_trait(impl_)
- && let trait_ref = trait_ref.instantiate_identity()
+ && let trait_ref = trait_ref.instantiate_identity().skip_norm_wip()
&& let Some(assoc_type) = trait_ref
.def_id
.0
@@ -2262,14 +2262,16 @@ impl<'body, 'db> InferenceContext<'body, 'db> {
let ty = self
.db
.ty(var.lookup(self.db).parent.into())
- .instantiate(interner, args);
+ .instantiate(interner, args)
+ .skip_norm_wip();
let ty = self.insert_type_vars(ty, Span::Dummy);
return (ty, Some(var.into()));
}
ValueNs::StructId(strukt) => {
let args = path_ctx.substs_from_path(strukt.into(), true, false);
drop(ctx);
- let ty = self.db.ty(strukt.into()).instantiate(interner, args);
+ let ty =
+ self.db.ty(strukt.into()).instantiate(interner, args).skip_norm_wip();
let ty = self.insert_type_vars(ty, Span::Dummy);
return (ty, Some(strukt.into()));
}
@@ -2291,26 +2293,30 @@ impl<'body, 'db> InferenceContext<'body, 'db> {
TypeNs::AdtId(AdtId::StructId(strukt)) => {
let args = path_ctx.substs_from_path(strukt.into(), true, false);
drop(ctx);
- let ty = self.db.ty(strukt.into()).instantiate(interner, args);
+ let ty = self.db.ty(strukt.into()).instantiate(interner, args).skip_norm_wip();
let ty = self.insert_type_vars(ty, Span::Dummy);
forbid_unresolved_segments(self, (ty, Some(strukt.into())), unresolved)
}
TypeNs::AdtId(AdtId::UnionId(u)) => {
let args = path_ctx.substs_from_path(u.into(), true, false);
drop(ctx);
- let ty = self.db.ty(u.into()).instantiate(interner, args);
+ let ty = self.db.ty(u.into()).instantiate(interner, args).skip_norm_wip();
let ty = self.insert_type_vars(ty, Span::Dummy);
forbid_unresolved_segments(self, (ty, Some(u.into())), unresolved)
}
TypeNs::EnumVariantId(var) => {
let args = path_ctx.substs_from_path(var.into(), true, false);
drop(ctx);
- let ty = self.db.ty(var.lookup(self.db).parent.into()).instantiate(interner, args);
+ let ty = self
+ .db
+ .ty(var.lookup(self.db).parent.into())
+ .instantiate(interner, args)
+ .skip_norm_wip();
let ty = self.insert_type_vars(ty, Span::Dummy);
forbid_unresolved_segments(self, (ty, Some(var.into())), unresolved)
}
TypeNs::SelfType(impl_id) => {
- let mut ty = self.db.impl_self_ty(impl_id).instantiate_identity();
+ let mut ty = self.db.impl_self_ty(impl_id).instantiate_identity().skip_norm_wip();
let Some(remaining_idx) = unresolved else {
drop(ctx);
@@ -2428,7 +2434,7 @@ impl<'body, 'db> InferenceContext<'body, 'db> {
let args = path_ctx.substs_from_path_segment(it.into(), true, None, false);
drop(ctx);
let interner = DbInterner::conjure();
- let ty = self.db.ty(it.into()).instantiate(interner, args);
+ let ty = self.db.ty(it.into()).instantiate(interner, args).skip_norm_wip();
let ty = self.insert_type_vars(ty, Span::Dummy);
self.resolve_variant_on_alias(node, ty, unresolved, mod_path)
diff --git a/crates/hir-ty/src/infer/callee.rs b/crates/hir-ty/src/infer/callee.rs
index 2d1584aa4f..057ba7fa86 100644
--- a/crates/hir-ty/src/infer/callee.rs
+++ b/crates/hir-ty/src/infer/callee.rs
@@ -2,6 +2,7 @@
use std::iter;
+use rustc_abi::ExternAbi;
use tracing::debug;
use hir_def::{CallableDefId, ConstParamId, hir::ExprId, signatures::FunctionSignature};
@@ -11,7 +12,7 @@ use rustc_type_ir::{
};
use crate::{
- Adjust, Adjustment, AutoBorrow, FnAbi,
+ Adjust, Adjustment, AutoBorrow,
autoderef::{GeneralAutoderef, InferenceContextAutoderef},
infer::{
AllowTwoPhase, AutoBorrowMutability, Expectation, InferenceContext, InferenceDiagnostic,
@@ -181,9 +182,9 @@ impl<'db> InferenceContext<'_, 'db> {
interner.coroutine_for_closure(def_id),
tupled_upvars_ty,
),
- coroutine_closure_sig.c_variadic,
- coroutine_closure_sig.safety,
- coroutine_closure_sig.abi,
+ coroutine_closure_sig.fn_sig_kind.c_variadic(),
+ coroutine_closure_sig.fn_sig_kind.safety(),
+ coroutine_closure_sig.fn_sig_kind.abi(),
);
let adjust_steps = autoderef.adjust_steps_as_infer_ok();
let adjustments = autoderef.ctx().table.register_infer_ok(adjust_steps);
@@ -430,8 +431,11 @@ impl<'db> InferenceContext<'_, 'db> {
) -> Ty<'db> {
let (fn_sig, def_id) = match callee_ty.kind() {
TyKind::FnDef(def_id, args) => {
- let fn_sig =
- self.db.callable_item_signature(def_id.0).instantiate(self.interner(), args);
+ let fn_sig = self
+ .db
+ .callable_item_signature(def_id.0)
+ .instantiate(self.interner(), args)
+ .skip_norm_wip();
(fn_sig, Some(def_id.0))
}
@@ -460,11 +464,11 @@ impl<'db> InferenceContext<'_, 'db> {
expected,
arg_exprs,
&indices_to_skip,
- fn_sig.c_variadic,
+ fn_sig.c_variadic(),
TupleArgumentsFlag::DontTupleArguments,
);
- if fn_sig.abi == FnAbi::RustCall
+ if fn_sig.abi() == ExternAbi::RustCall
&& let Some(ty) = fn_sig.inputs().last().copied()
&& let Some(tuple_trait) = self.lang_items.Tuple
{
@@ -494,7 +498,7 @@ impl<'db> InferenceContext<'_, 'db> {
expected,
arg_exprs,
&[],
- fn_sig.c_variadic,
+ fn_sig.c_variadic(),
TupleArgumentsFlag::TupleArguments,
);
@@ -515,7 +519,7 @@ impl<'db> InferenceContext<'_, 'db> {
expected,
arg_exprs,
&[],
- method.sig.c_variadic,
+ method.sig.c_variadic(),
TupleArgumentsFlag::TupleArguments,
);
diff --git a/crates/hir-ty/src/infer/cast.rs b/crates/hir-ty/src/infer/cast.rs
index 1dade4dfd7..93aed344d4 100644
--- a/crates/hir-ty/src/infer/cast.rs
+++ b/crates/hir-ty/src/infer/cast.rs
@@ -542,7 +542,8 @@ fn pointer_kind<'db>(
if let Some((last_field, _)) = struct_data.fields().iter().last() {
let last_field_ty = ctx.db.field_types(id.into())[last_field]
.get()
- .instantiate(ctx.interner(), subst);
+ .instantiate(ctx.interner(), subst)
+ .skip_norm_wip();
pointer_kind(expr, last_field_ty, ctx)
} else {
Ok(Some(PointerKind::Thin))
diff --git a/crates/hir-ty/src/infer/closure.rs b/crates/hir-ty/src/infer/closure.rs
index 0e55bb8e26..90578e30c2 100644
--- a/crates/hir-ty/src/infer/closure.rs
+++ b/crates/hir-ty/src/infer/closure.rs
@@ -9,6 +9,7 @@ use hir_def::{
hir::{ClosureKind, CoroutineKind, CoroutineSource, ExprId, PatId},
type_ref::TypeRefId,
};
+use rustc_abi::ExternAbi;
use rustc_type_ir::{
AliasTyKind, ClosureArgs, ClosureArgsParts, CoroutineArgs, CoroutineArgsParts,
CoroutineClosureArgs, CoroutineClosureArgsParts, InferTy, Interner, TypeSuperVisitable,
@@ -18,12 +19,13 @@ use rustc_type_ir::{
use tracing::{debug, instrument};
use crate::{
- FnAbi, Span,
+ Span,
db::{InternedClosure, InternedClosureId, InternedCoroutineClosureId, InternedCoroutineId},
infer::{BreakableKind, Diverges, coerce::CoerceMany, pat::PatOrigin},
next_solver::{
AliasTy, Binder, ClauseKind, DbInterner, ErrorGuaranteed, FnSig, GenericArg, GenericArgs,
- PolyFnSig, PolyProjectionPredicate, Predicate, PredicateKind, SolverDefId, Ty, TyKind,
+ PolyFnSig, PolyProjectionPredicate, Predicate, PredicateKind, SolverDefId, TermId, Ty,
+ TyKind, Unnormalized,
abi::Safety,
infer::{
BoundRegionConversionTime, InferOk, InferResult,
@@ -115,9 +117,9 @@ impl<'db> InferenceContext<'_, 'db> {
interner.mk_fn_sig(
[Ty::new_tup(interner, sig.inputs())],
sig.output(),
- sig.c_variadic,
- sig.safety,
- sig.abi,
+ sig.c_variadic(),
+ sig.safety(),
+ sig.abi(),
)
});
@@ -241,9 +243,9 @@ impl<'db> InferenceContext<'_, 'db> {
),
],
Ty::new_tup(interner, &[bound_yield_ty, bound_return_ty]),
- sig.c_variadic,
- sig.safety,
- sig.abi,
+ sig.c_variadic(),
+ sig.safety(),
+ sig.abi(),
)
}),
),
@@ -285,9 +287,9 @@ impl<'db> InferenceContext<'_, 'db> {
liberated_sig = interner.mk_fn_sig(
liberated_sig.inputs().iter().copied(),
coroutine_output_ty,
- liberated_sig.c_variadic,
- liberated_sig.safety,
- liberated_sig.abi,
+ liberated_sig.c_variadic(),
+ liberated_sig.safety(),
+ liberated_sig.abi(),
);
(
@@ -367,9 +369,10 @@ impl<'db> InferenceContext<'_, 'db> {
expected_ty,
closure_kind,
def_id
- .expect_opaque_ty()
+ .0
.predicates(self.db)
.iter_instantiated_copied(self.interner(), args.as_slice())
+ .map(Unnormalized::skip_norm_wip)
.map(|clause| clause.as_predicate()),
),
TyKind::Dynamic(object_type, ..) => {
@@ -655,7 +658,7 @@ impl<'db> InferenceContext<'_, 'db> {
bound.predicate.kind().skip_binder()
&& let ret_projection = bound.predicate.kind().rebind(ret_projection)
&& let Some(ret_projection) = ret_projection.no_bound_vars()
- && let SolverDefId::TypeAliasId(assoc_type) = ret_projection.def_id()
+ && let TermId::TypeAliasId(assoc_type) = ret_projection.def_id().0
&& Some(assoc_type) == self.lang_items.FutureOutput
{
return_ty = Some(ret_projection.term.expect_type());
@@ -808,9 +811,9 @@ impl<'db> InferenceContext<'_, 'db> {
self.interner().mk_fn_sig(
sig.inputs().iter().copied(),
sig.output(),
- sig.c_variadic,
+ sig.c_variadic(),
Safety::Safe,
- FnAbi::RustCall,
+ ExternAbi::RustCall,
)
});
@@ -931,9 +934,9 @@ impl<'db> InferenceContext<'_, 'db> {
expected_sigs.liberated_sig = table.interner().mk_fn_sig(
inputs,
supplied_output_ty,
- expected_sigs.liberated_sig.c_variadic,
+ expected_sigs.liberated_sig.c_variadic(),
Safety::Safe,
- FnAbi::RustCall,
+ ExternAbi::RustCall,
);
Ok(InferOk { value: expected_sigs, obligations: all_obligations })
@@ -1001,7 +1004,7 @@ impl<'db> InferenceContext<'_, 'db> {
supplied_return,
false,
Safety::Safe,
- FnAbi::RustCall,
+ ExternAbi::RustCall,
))
}
@@ -1048,9 +1051,10 @@ impl<'db> InferenceContext<'_, 'db> {
return Some(self.types.types.error);
}
TyKind::Alias(AliasTy { kind: AliasTyKind::Opaque { def_id }, args, .. }) => def_id
- .expect_opaque_ty()
+ .0
.predicates(self.db)
.iter_instantiated_copied(self.interner(), &args)
+ .map(Unnormalized::skip_norm_wip)
.find_map(|p| get_future_output(p.as_predicate()))?,
TyKind::Error(_) => return Some(ret_ty),
_ => {
@@ -1091,7 +1095,7 @@ impl<'db> InferenceContext<'_, 'db> {
// The `Future` trait has only one associated item, `Output`,
// so check that this is what we see.
let output_assoc_item = self.lang_items.FutureOutput;
- if output_assoc_item != Some(predicate.projection_term.def_id.expect_type_alias()) {
+ if output_assoc_item.map(Into::into) != Some(predicate.def_id().0) {
panic!(
"projecting associated item `{:?}` from future, which is not Output `{:?}`",
predicate.projection_term.kind(self.interner()),
@@ -1135,7 +1139,7 @@ impl<'db> InferenceContext<'_, 'db> {
err_ty,
false,
Safety::Safe,
- FnAbi::RustCall,
+ ExternAbi::RustCall,
));
debug!("supplied_sig_of_closure: result={:?}", result);
diff --git a/crates/hir-ty/src/infer/closure/analysis.rs b/crates/hir-ty/src/infer/closure/analysis.rs
index bd88644a3c..82ace17ac0 100644
--- a/crates/hir-ty/src/infer/closure/analysis.rs
+++ b/crates/hir-ty/src/infer/closure/analysis.rs
@@ -41,6 +41,7 @@ use hir_def::{
resolver::ValueNs,
};
use macros::{TypeFoldable, TypeVisitable};
+use rustc_abi::ExternAbi;
use rustc_ast_ir::Mutability;
use rustc_hash::{FxBuildHasher, FxHashMap};
use rustc_type_ir::{
@@ -52,7 +53,7 @@ use span::Edition;
use tracing::{debug, instrument};
use crate::{
- FnAbi, Span,
+ Span,
infer::{
CaptureInfo, CaptureSourceStack, CapturedPlace, InferenceContext, UpvarCapture,
closure::analysis::expr_use_visitor::{
@@ -459,7 +460,7 @@ impl<'a, 'db> InferenceContext<'a, 'db> {
tupled_upvars_ty_for_borrow,
false,
Safety::Safe,
- FnAbi::Rust,
+ ExternAbi::Rust,
),
self.types.coroutine_captures_by_ref_bound_var_kinds,
),
diff --git a/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs b/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs
index 88edb3bf21..f76e99aa78 100644
--- a/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs
+++ b/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs
@@ -772,7 +772,10 @@ impl<'a, 'b, 'db, D: Delegate<'db>> ExprUseVisitor<'a, 'b, 'db, D> {
let field_place = self.cat_projection(
with_expr.into(),
with_place.clone(),
- adt_field_types[f_index].get().instantiate(self.cx.interner(), args),
+ adt_field_types[f_index]
+ .get()
+ .instantiate(self.cx.interner(), args)
+ .skip_norm_wip(),
ProjectionKind::Field {
field_idx: f_index.into_raw().into_u32(),
variant_idx: 0,
diff --git a/crates/hir-ty/src/infer/coerce.rs b/crates/hir-ty/src/infer/coerce.rs
index a2b584e1d6..343919f5ba 100644
--- a/crates/hir-ty/src/infer/coerce.rs
+++ b/crates/hir-ty/src/infer/coerce.rs
@@ -710,7 +710,7 @@ where
self.commit_if_ok(|this| {
if let TyKind::FnPtr(_, hdr_b) = b.kind()
&& fn_ty_a.safety().is_safe()
- && !hdr_b.safety.is_safe()
+ && !hdr_b.safety().is_safe()
{
let unsafe_a = Ty::safe_to_unsafe_fn_ty(this.interner(), fn_ty_a);
this.unify_and(
@@ -759,7 +759,8 @@ where
return Err(TypeError::ForceInlineCast);
}
- if b_hdr.safety.is_safe() && attrs.contains(AttrFlags::HAS_TARGET_FEATURE) {
+ if b_hdr.safety().is_safe() && attrs.contains(AttrFlags::HAS_TARGET_FEATURE)
+ {
let fn_target_features =
TargetFeatures::from_fn_no_implications(self.db(), def_id);
// Allow the coercion if the current function has all the features that would be
@@ -807,7 +808,7 @@ where
// `fn(arg0,arg1,...) -> _`
// or
// `unsafe fn(arg0,arg1,...) -> _`
- let safety = hdr.safety;
+ let safety = hdr.safety();
let closure_sig =
self.interner().signature_unclosure(args_a.as_closure().sig(), safety);
let pointer_ty = Ty::new_fn_ptr(self.interner(), closure_sig);
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs
index 8732ca6a9a..0675b5e857 100644
--- a/crates/hir-ty/src/infer/expr.rs
+++ b/crates/hir-ty/src/infer/expr.rs
@@ -823,7 +823,8 @@ impl<'db> InferenceContext<'_, 'db> {
this.interner(),
this.interner()
.fn_sig(def)
- .instantiate(this.interner(), parameters),
+ .instantiate(this.interner(), parameters)
+ .skip_norm_wip(),
);
_ = this.coerce(
expr,
@@ -1042,14 +1043,14 @@ impl<'db> InferenceContext<'_, 'db> {
});
}
- variant_field_tys[i].get().instantiate(interner, args)
+ variant_field_tys[i].get().instantiate(interner, args).skip_norm_wip()
} else {
if let Some(field_idx) = seen_fields.get(&name) {
self.push_diagnostic(InferenceDiagnostic::DuplicateField {
field: field.expr.into(),
variant,
});
- variant_field_tys[*field_idx].get().instantiate(interner, args)
+ variant_field_tys[*field_idx].get().instantiate(interner, args).skip_norm_wip()
} else {
self.push_diagnostic(InferenceDiagnostic::NoSuchField {
field: field.expr.into(),
@@ -1106,10 +1107,13 @@ impl<'db> InferenceContext<'_, 'db> {
for (field_idx, field) in variant_fields.fields().iter() {
let fru_ty = variant_field_tys[field_idx]
.get()
- .instantiate(interner, fresh_args);
+ .instantiate(interner, fresh_args)
+ .skip_norm_wip();
if remaining_fields.remove(&field.name).is_some() {
- let target_ty =
- variant_field_tys[field_idx].get().instantiate(interner, args);
+ let target_ty = variant_field_tys[field_idx]
+ .get()
+ .instantiate(interner, args)
+ .skip_norm_wip();
let cause = ObligationCause::new(expr);
match self.table.at(&cause).sup(target_ty, fru_ty) {
Ok(InferOk { obligations, value: () }) => {
@@ -1647,7 +1651,8 @@ impl<'db> InferenceContext<'_, 'db> {
}
let ty = self.db.field_types(field_id.parent)[field_id.local_id]
.get()
- .instantiate(interner, parameters);
+ .instantiate(interner, parameters)
+ .skip_norm_wip();
Some((Either::Left(field_id), ty))
});
@@ -1665,7 +1670,8 @@ impl<'db> InferenceContext<'_, 'db> {
self.table.register_infer_ok(autoderef.adjust_steps_as_infer_ok());
let ty = self.db.field_types(field_id.parent)[field_id.local_id]
.get()
- .instantiate(self.interner(), subst);
+ .instantiate(self.interner(), subst)
+ .skip_norm_wip();
let ty = self.process_remote_user_written_ty(ty);
(ty, Either::Left(field_id), adjustments, false)
@@ -1733,7 +1739,11 @@ impl<'db> InferenceContext<'_, 'db> {
// FIXME: Using fresh infer vars for the method args isn't optimal,
// we can do better by going thorough the full probe/confirm machinery.
let args = self.table.fresh_args_for_item(Span::Dummy, def_id.into());
- let sig = self.db.callable_item_signature(def_id.into()).instantiate(self.interner(), args);
+ let sig = self
+ .db
+ .callable_item_signature(def_id.into())
+ .instantiate(self.interner(), args)
+ .skip_norm_wip();
let sig = self.infcx().instantiate_binder_with_fresh_vars(
Span::Dummy,
BoundRegionConversionTime::FnCall,
@@ -1909,7 +1919,7 @@ impl<'db> InferenceContext<'_, 'db> {
expected,
args,
&[],
- sig.c_variadic,
+ sig.c_variadic(),
TupleArgumentsFlag::DontTupleArguments,
);
ret_ty
diff --git a/crates/hir-ty/src/infer/opaques.rs b/crates/hir-ty/src/infer/opaques.rs
index 178b3fcbf5..63149deb82 100644
--- a/crates/hir-ty/src/infer/opaques.rs
+++ b/crates/hir-ty/src/infer/opaques.rs
@@ -75,7 +75,7 @@ impl<'db> InferenceContext<'_, 'db> {
let interner = self.interner();
let TypingMode::Analysis { defining_opaque_types_and_generators } =
- self.table.infer_ctxt.typing_mode()
+ self.table.infer_ctxt.typing_mode_raw()
else {
unreachable!();
};
@@ -108,8 +108,9 @@ impl<'db> InferenceContext<'_, 'db> {
continue;
}
- let expected =
- EarlyBinder::bind(ty.ty).instantiate(interner, opaque_type_key.args);
+ let expected = EarlyBinder::bind(ty.ty)
+ .instantiate(interner, opaque_type_key.args)
+ .skip_norm_wip();
_ = self.demand_eqtype_fixme_no_diag(expected, hidden_type.ty);
}
diff --git a/crates/hir-ty/src/infer/pat.rs b/crates/hir-ty/src/infer/pat.rs
index fd4f7a7997..5d8b1196c0 100644
--- a/crates/hir-ty/src/infer/pat.rs
+++ b/crates/hir-ty/src/infer/pat.rs
@@ -1070,7 +1070,8 @@ https://doc.rust-lang.org/reference/types.html#trait-objects";
{
for (i, &subpat) in subpats.iter().enumerate_and_adjust(variant_fields.len(), ddpos) {
let field_id = LocalFieldId::from_raw(la_arena::RawIdx::from_u32(i as u32));
- let field_ty = variant_field_tys[field_id].get().instantiate(interner, args);
+ let field_ty =
+ variant_field_tys[field_id].get().instantiate(interner, args).skip_norm_wip();
self.infer_pat(subpat, field_ty, pat_info);
}
if let Err(()) = had_err {
@@ -1089,7 +1090,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects";
for (i, &pat) in subpats.iter().enumerate() {
let field_id = LocalFieldId::from_raw(la_arena::RawIdx::from_u32(i as u32));
let expected = match variant_field_tys.get(field_id) {
- Some(field_ty) => field_ty.get().instantiate(interner, args),
+ Some(field_ty) => field_ty.get().instantiate(interner, args).skip_norm_wip(),
None => self.types.types.error,
};
self.infer_pat(pat, expected, pat_info);
@@ -1201,7 +1202,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects";
});
}
- variant_field_tys[field_idx].get().instantiate(interner, args)
+ variant_field_tys[field_idx].get().instantiate(interner, args).skip_norm_wip()
}
None => {
inexistent_fields.push(field);
diff --git a/crates/hir-ty/src/infer/path.rs b/crates/hir-ty/src/infer/path.rs
index c9262ce12e..a2bcf02589 100644
--- a/crates/hir-ty/src/infer/path.rs
+++ b/crates/hir-ty/src/infer/path.rs
@@ -16,7 +16,7 @@ use crate::{
lower::{GenericPredicates, LifetimeElisionKind},
method_resolution::{self, CandidateId, MethodError},
next_solver::{
- GenericArg, GenericArgs, TraitRef, Ty, infer::traits::ObligationCause,
+ GenericArg, GenericArgs, TraitRef, Ty, Unnormalized, infer::traits::ObligationCause,
util::clauses_as_obligations,
},
};
@@ -42,7 +42,7 @@ impl<'db> InferenceContext<'_, 'db> {
self.add_required_obligations_for_value_path(id, generic_def, args);
- let ty = self.db.value_ty(value_def)?.instantiate(self.interner(), args);
+ let ty = self.db.value_ty(value_def)?.instantiate(self.interner(), args).skip_norm_wip();
let ty = self.process_remote_user_written_ty(ty);
Some((value, ty))
}
@@ -78,7 +78,7 @@ impl<'db> InferenceContext<'_, 'db> {
};
}
ValueNs::ImplSelf(impl_id) => {
- let ty = self.db.impl_self_ty(impl_id).instantiate_identity();
+ let ty = self.db.impl_self_ty(impl_id).instantiate_identity().skip_norm_wip();
return if let Some((AdtId::StructId(struct_id), substs)) = ty.as_adt() {
Some(ValuePathResolution::GenericDef(
struct_id.into(),
@@ -237,7 +237,9 @@ impl<'db> InferenceContext<'_, 'db> {
let predicates = GenericPredicates::query_all(self.db, def);
let param_env = self.table.param_env;
self.table.register_predicates(clauses_as_obligations(
- predicates.iter_instantiated(interner, subst.as_slice()),
+ predicates
+ .iter_instantiated(interner, subst.as_slice())
+ .map(Unnormalized::skip_norm_wip),
ObligationCause::new(node),
param_env,
));
@@ -315,8 +317,11 @@ impl<'db> InferenceContext<'_, 'db> {
let substs = match container {
ItemContainerId::ImplId(impl_id) => {
let impl_substs = self.table.fresh_args_for_item(id.into(), impl_id.into());
- let impl_self_ty =
- self.db.impl_self_ty(impl_id).instantiate(self.interner(), impl_substs);
+ let impl_self_ty = self
+ .db
+ .impl_self_ty(impl_id)
+ .instantiate(self.interner(), impl_substs)
+ .skip_norm_wip();
_ = self.demand_eqtype(id, impl_self_ty, ty);
impl_substs
}
diff --git a/crates/hir-ty/src/inhabitedness.rs b/crates/hir-ty/src/inhabitedness.rs
index 41470c54e5..0070d14f37 100644
--- a/crates/hir-ty/src/inhabitedness.rs
+++ b/crates/hir-ty/src/inhabitedness.rs
@@ -169,7 +169,7 @@ impl<'a, 'db> UninhabitedFrom<'a, 'db> {
subst: GenericArgs<'db>,
) -> ControlFlow<VisiblyUninhabited> {
if vis.is_none_or(|it| it.is_visible_from(self.db(), self.target_mod)) {
- let ty = ty.instantiate(self.interner(), subst);
+ let ty = ty.instantiate(self.interner(), subst).skip_norm_wip();
ty.visit_with(self)
} else {
CONTINUE_OPAQUELY_INHABITED
diff --git a/crates/hir-ty/src/layout.rs b/crates/hir-ty/src/layout.rs
index da0be818f6..3e569076ad 100644
--- a/crates/hir-ty/src/layout.rs
+++ b/crates/hir-ty/src/layout.rs
@@ -142,10 +142,10 @@ fn layout_of_simd_ty<'db>(
// where T is a primitive scalar (integer/float/pointer).
let fields = db.field_types(id.into());
let mut fields = fields.iter();
- let Some(TyKind::Array(e_ty, e_len)) = fields
- .next()
- .filter(|_| fields.next().is_none())
- .map(|f| (*f.1).get().instantiate(DbInterner::new_no_crate(db), args).kind())
+ let Some(TyKind::Array(e_ty, e_len)) =
+ fields.next().filter(|_| fields.next().is_none()).map(|f| {
+ (*f.1).get().instantiate(DbInterner::new_no_crate(db), args).skip_norm_wip().kind()
+ })
else {
return Err(LayoutError::InvalidSimdType);
};
@@ -405,7 +405,7 @@ fn field_ty<'a>(
fd: LocalFieldId,
args: GenericArgs<'a>,
) -> Ty<'a> {
- db.field_types(def)[fd].get().instantiate(DbInterner::new_no_crate(db), args)
+ db.field_types(def)[fd].get().instantiate(DbInterner::new_no_crate(db), args).skip_norm_wip()
}
fn scalar_unit(dl: &TargetDataLayout, value: Primitive) -> Scalar {
diff --git a/crates/hir-ty/src/layout/adt.rs b/crates/hir-ty/src/layout/adt.rs
index e77fb139be..b7e1697059 100644
--- a/crates/hir-ty/src/layout/adt.rs
+++ b/crates/hir-ty/src/layout/adt.rs
@@ -1,6 +1,6 @@
//! Compute the binary representation of structs, unions and enums
-use std::{cmp, ops::Bound};
+use std::cmp;
use hir_def::{
AdtId, VariantId,
@@ -79,7 +79,6 @@ pub fn layout_of_adt_query(
&variants,
matches!(def, AdtId::EnumId(..)),
is_special_no_niche,
- layout_scalar_valid_range(db, def),
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
variants.iter_enumerated().filter_map(|(id, _)| {
let AdtId::EnumId(e) = def else { return None };
@@ -107,15 +106,6 @@ pub(crate) fn layout_of_adt_cycle_result(
Err(LayoutError::RecursiveTypeWithoutIndirection)
}
-fn layout_scalar_valid_range(db: &dyn HirDatabase, def: AdtId) -> (Bound<u128>, Bound<u128>) {
- let range = AttrFlags::rustc_layout_scalar_valid_range(db, def);
- let get = |value| match value {
- Some(it) => Bound::Included(it),
- None => Bound::Unbounded,
- };
- (get(range.start), get(range.end))
-}
-
/// Finds the appropriate Integer type and signedness for the given
/// signed discriminant range and `#[repr]` attribute.
/// N.B.: `u128` values above `i128::MAX` will be treated as signed, but
diff --git a/crates/hir-ty/src/layout/tests.rs b/crates/hir-ty/src/layout/tests.rs
index 97c572c4e6..bc18f05790 100644
--- a/crates/hir-ty/src/layout/tests.rs
+++ b/crates/hir-ty/src/layout/tests.rs
@@ -90,7 +90,7 @@ fn eval_goal(
adt_id,
GenericArgs::identity_for_item(interner, adt_id.into()),
),
- Either::Right(ty_id) => db.ty(ty_id.into()).instantiate_identity(),
+ Either::Right(ty_id) => db.ty(ty_id.into()).instantiate_identity().skip_norm_wip(),
};
let param_env = db.trait_environment(
match adt_or_type_alias_id {
@@ -529,6 +529,7 @@ fn tuple_ptr_with_dst_tail() {
}
#[test]
+#[ignore = "FIXME: We need to have proper pattern types"]
fn non_zero_and_non_null() {
size_and_align! {
minicore: non_zero, non_null, option;
diff --git a/crates/hir-ty/src/lib.rs b/crates/hir-ty/src/lib.rs
index 094e5b623c..dc8b8d6c99 100644
--- a/crates/hir-ty/src/lib.rs
+++ b/crates/hir-ty/src/lib.rs
@@ -73,9 +73,9 @@ use hir_def::{
};
use hir_expand::name::Name;
use indexmap::{IndexMap, map::Entry};
-use intern::{Symbol, sym};
use macros::GenericTypeVisitable;
use mir::{MirEvalError, VTableMap};
+use rustc_abi::ExternAbi;
use rustc_hash::{FxBuildHasher, FxHashMap, FxHashSet};
use rustc_type_ir::{
BoundVarIndexKind, TypeSuperVisitable, TypeVisitableExt,
@@ -222,137 +222,6 @@ pub fn lifetime_param_idx(db: &dyn HirDatabase, id: LifetimeParamId) -> u32 {
generics::generics(db, id.parent).lifetime_param_idx(id)
}
-#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub enum FnAbi {
- Aapcs,
- AapcsUnwind,
- AvrInterrupt,
- AvrNonBlockingInterrupt,
- C,
- CCmseNonsecureCall,
- CCmseNonsecureEntry,
- CDecl,
- CDeclUnwind,
- CUnwind,
- Efiapi,
- Fastcall,
- FastcallUnwind,
- Msp430Interrupt,
- PtxKernel,
- RiscvInterruptM,
- RiscvInterruptS,
- Rust,
- RustCall,
- RustCold,
- RustIntrinsic,
- Stdcall,
- StdcallUnwind,
- System,
- SystemUnwind,
- Sysv64,
- Sysv64Unwind,
- Thiscall,
- ThiscallUnwind,
- Unadjusted,
- Vectorcall,
- VectorcallUnwind,
- Wasm,
- Win64,
- Win64Unwind,
- X86Interrupt,
- RustPreserveNone,
- Unknown,
-}
-
-impl FnAbi {
- #[rustfmt::skip]
- pub fn from_symbol(s: &Symbol) -> FnAbi {
- match s {
- s if *s == sym::aapcs_dash_unwind => FnAbi::AapcsUnwind,
- s if *s == sym::aapcs => FnAbi::Aapcs,
- s if *s == sym::avr_dash_interrupt => FnAbi::AvrInterrupt,
- s if *s == sym::avr_dash_non_dash_blocking_dash_interrupt => FnAbi::AvrNonBlockingInterrupt,
- s if *s == sym::C_dash_cmse_dash_nonsecure_dash_call => FnAbi::CCmseNonsecureCall,
- s if *s == sym::C_dash_cmse_dash_nonsecure_dash_entry => FnAbi::CCmseNonsecureEntry,
- s if *s == sym::C_dash_unwind => FnAbi::CUnwind,
- s if *s == sym::C => FnAbi::C,
- s if *s == sym::cdecl_dash_unwind => FnAbi::CDeclUnwind,
- s if *s == sym::cdecl => FnAbi::CDecl,
- s if *s == sym::efiapi => FnAbi::Efiapi,
- s if *s == sym::fastcall_dash_unwind => FnAbi::FastcallUnwind,
- s if *s == sym::fastcall => FnAbi::Fastcall,
- s if *s == sym::msp430_dash_interrupt => FnAbi::Msp430Interrupt,
- s if *s == sym::ptx_dash_kernel => FnAbi::PtxKernel,
- s if *s == sym::riscv_dash_interrupt_dash_m => FnAbi::RiscvInterruptM,
- s if *s == sym::riscv_dash_interrupt_dash_s => FnAbi::RiscvInterruptS,
- s if *s == sym::rust_dash_call => FnAbi::RustCall,
- s if *s == sym::rust_dash_cold => FnAbi::RustCold,
- s if *s == sym::rust_dash_preserve_dash_none => FnAbi::RustPreserveNone,
- s if *s == sym::rust_dash_intrinsic => FnAbi::RustIntrinsic,
- s if *s == sym::Rust => FnAbi::Rust,
- s if *s == sym::stdcall_dash_unwind => FnAbi::StdcallUnwind,
- s if *s == sym::stdcall => FnAbi::Stdcall,
- s if *s == sym::system_dash_unwind => FnAbi::SystemUnwind,
- s if *s == sym::system => FnAbi::System,
- s if *s == sym::sysv64_dash_unwind => FnAbi::Sysv64Unwind,
- s if *s == sym::sysv64 => FnAbi::Sysv64,
- s if *s == sym::thiscall_dash_unwind => FnAbi::ThiscallUnwind,
- s if *s == sym::thiscall => FnAbi::Thiscall,
- s if *s == sym::unadjusted => FnAbi::Unadjusted,
- s if *s == sym::vectorcall_dash_unwind => FnAbi::VectorcallUnwind,
- s if *s == sym::vectorcall => FnAbi::Vectorcall,
- s if *s == sym::wasm => FnAbi::Wasm,
- s if *s == sym::win64_dash_unwind => FnAbi::Win64Unwind,
- s if *s == sym::win64 => FnAbi::Win64,
- s if *s == sym::x86_dash_interrupt => FnAbi::X86Interrupt,
- _ => FnAbi::Unknown,
- }
- }
-
- pub fn as_str(self) -> &'static str {
- match self {
- FnAbi::Aapcs => "aapcs",
- FnAbi::AapcsUnwind => "aapcs-unwind",
- FnAbi::AvrInterrupt => "avr-interrupt",
- FnAbi::AvrNonBlockingInterrupt => "avr-non-blocking-interrupt",
- FnAbi::C => "C",
- FnAbi::CCmseNonsecureCall => "C-cmse-nonsecure-call",
- FnAbi::CCmseNonsecureEntry => "C-cmse-nonsecure-entry",
- FnAbi::CDecl => "C-decl",
- FnAbi::CDeclUnwind => "cdecl-unwind",
- FnAbi::CUnwind => "C-unwind",
- FnAbi::Efiapi => "efiapi",
- FnAbi::Fastcall => "fastcall",
- FnAbi::FastcallUnwind => "fastcall-unwind",
- FnAbi::Msp430Interrupt => "msp430-interrupt",
- FnAbi::PtxKernel => "ptx-kernel",
- FnAbi::RiscvInterruptM => "riscv-interrupt-m",
- FnAbi::RiscvInterruptS => "riscv-interrupt-s",
- FnAbi::Rust => "Rust",
- FnAbi::RustCall => "rust-call",
- FnAbi::RustCold => "rust-cold",
- FnAbi::RustPreserveNone => "rust-preserve-none",
- FnAbi::RustIntrinsic => "rust-intrinsic",
- FnAbi::Stdcall => "stdcall",
- FnAbi::StdcallUnwind => "stdcall-unwind",
- FnAbi::System => "system",
- FnAbi::SystemUnwind => "system-unwind",
- FnAbi::Sysv64 => "sysv64",
- FnAbi::Sysv64Unwind => "sysv64-unwind",
- FnAbi::Thiscall => "thiscall",
- FnAbi::ThiscallUnwind => "thiscall-unwind",
- FnAbi::Unadjusted => "unadjusted",
- FnAbi::Vectorcall => "vectorcall",
- FnAbi::VectorcallUnwind => "vectorcall-unwind",
- FnAbi::Wasm => "wasm",
- FnAbi::Win64 => "win64",
- FnAbi::Win64Unwind => "win64-unwind",
- FnAbi::X86Interrupt => "x86-interrupt",
- FnAbi::Unknown => "unknown-abi",
- }
- }
-}
-
#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)]
pub enum ImplTraitId {
ReturnTypeImplTrait(hir_def::FunctionId, next_solver::ImplTraitIdx),
@@ -594,7 +463,7 @@ pub fn callable_sig_from_fn_trait<'db>(
ret,
false,
Safety::Safe,
- FnAbi::Rust,
+ ExternAbi::Rust,
));
Some((trait_, sig))
}
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs
index dbbe31971e..f79bcddef0 100644
--- a/crates/hir-ty/src/lower.rs
+++ b/crates/hir-ty/src/lower.rs
@@ -37,6 +37,7 @@ use hir_def::{
use hir_expand::name::Name;
use la_arena::{Arena, ArenaMap, Idx};
use path::{PathDiagnosticCallback, PathLoweringContext};
+use rustc_abi::ExternAbi;
use rustc_ast_ir::Mutability;
use rustc_hash::FxHashSet;
use rustc_type_ir::{
@@ -51,16 +52,16 @@ use thin_vec::ThinVec;
use tracing::debug;
use crate::{
- FnAbi, ImplTraitId, TyLoweringDiagnostic, TyLoweringDiagnosticKind,
+ ImplTraitId, TyLoweringDiagnostic, TyLoweringDiagnosticKind,
consteval::{create_anon_const, path_to_const},
db::{AnonConstId, GeneralConstId, HirDatabase, InternedOpaqueTyId},
generics::{Generics, SingleGenerics, generics},
next_solver::{
AliasTy, Binder, BoundExistentialPredicates, Clause, ClauseKind, Clauses, Const, ConstKind,
- DbInterner, EarlyBinder, EarlyParamRegion, ErrorGuaranteed, FxIndexMap, GenericArg,
- GenericArgs, ParamConst, ParamEnv, PolyFnSig, Predicate, Region, SolverDefId,
- StoredClauses, StoredEarlyBinder, StoredGenericArg, StoredGenericArgs, StoredPolyFnSig,
- StoredTraitRef, StoredTy, TraitPredicate, TraitRef, Ty, Tys, abi::Safety,
+ DbInterner, EarlyBinder, EarlyParamRegion, ErrorGuaranteed, FnSigKind, FxIndexMap,
+ GenericArg, GenericArgs, ParamConst, ParamEnv, PolyFnSig, Predicate, Region, StoredClauses,
+ StoredEarlyBinder, StoredGenericArg, StoredGenericArgs, StoredPolyFnSig, StoredTraitRef,
+ StoredTy, TraitPredicate, TraitRef, Ty, Tys, Unnormalized, abi::Safety,
util::BottomUpFolder,
},
};
@@ -430,8 +431,7 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
|f| ImplTraitId::ReturnTypeImplTrait(f, idx),
|a| ImplTraitId::TypeAliasImplTrait(a, idx),
);
- let opaque_ty_id: SolverDefId =
- self.db.intern_impl_trait_id(impl_trait_id).into();
+ let opaque_ty_id = self.db.intern_impl_trait_id(impl_trait_id);
// We don't want to lower the bounds inside the binders
// we're currently in, because they don't end up inside
@@ -448,12 +448,13 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
});
self.impl_trait_mode.opaque_type_data[idx] = actual_opaque_type_data;
- let args = GenericArgs::identity_for_item(self.interner, opaque_ty_id);
+ let args =
+ GenericArgs::identity_for_item(self.interner, opaque_ty_id.into());
Ty::new_alias(
self.interner,
AliasTy::new_from_args(
self.interner,
- AliasTyKind::Opaque { def_id: opaque_ty_id },
+ AliasTyKind::Opaque { def_id: opaque_ty_id.into() },
args,
),
)
@@ -485,9 +486,11 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
Ty::new_fn_ptr(
interner,
Binder::dummy(FnSig {
- abi: fn_.abi.as_ref().map_or(FnAbi::Rust, FnAbi::from_symbol),
- safety: if fn_.is_unsafe { Safety::Unsafe } else { Safety::Safe },
- c_variadic: fn_.is_varargs,
+ fn_sig_kind: FnSigKind::new(
+ fn_.abi,
+ if fn_.is_unsafe { Safety::Unsafe } else { Safety::Safe },
+ fn_.is_varargs,
+ ),
inputs_and_output: Tys::new_from_slice(&args),
}),
)
@@ -760,7 +763,7 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
let mut projection_bounds = FxIndexMap::default();
for proj in projections {
let key = (
- proj.skip_binder().def_id().expect_type_alias(),
+ proj.skip_binder().def_id().0,
interner.anonymize_bound_vars(
proj.map_bound(|proj| proj.projection_term.trait_ref(interner)),
),
@@ -808,7 +811,7 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
.0
.trait_items(self.db)
.associated_types()
- .map(|item| (item, trait_ref)),
+ .map(|item| (item.into(), trait_ref)),
);
}
ClauseKind::Projection(pred) => {
@@ -842,7 +845,7 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
// the discussion in #56288 for alternatives.
if !references_self {
let key = (
- pred.skip_binder().projection_term.def_id.expect_type_alias(),
+ pred.skip_binder().def_id().0,
interner.anonymize_bound_vars(pred.map_bound(|proj| {
proj.projection_term.trait_ref(interner)
})),
@@ -868,7 +871,7 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
.filter_map(|key| projection_bounds.get(&key).copied())
.collect();
- projection_bounds.sort_unstable_by_key(|proj| proj.skip_binder().def_id());
+ projection_bounds.sort_unstable_by_key(|proj| proj.skip_binder().def_id().0);
let principal = principal.map(|principal| {
principal.map_bound(|principal| {
@@ -950,13 +953,13 @@ impl<'db, 'a> TyLoweringContext<'db, 'a> {
}
}
- fn lower_impl_trait(&mut self, def_id: SolverDefId, bounds: &[TypeBound]) -> ImplTrait {
+ fn lower_impl_trait(&mut self, def_id: InternedOpaqueTyId, bounds: &[TypeBound]) -> ImplTrait {
let interner = self.interner;
cov_mark::hit!(lower_rpit);
- let args = GenericArgs::identity_for_item(interner, def_id);
+ let args = GenericArgs::identity_for_item(interner, def_id.into());
let self_ty = Ty::new_alias(
self.interner,
- AliasTy::new_from_args(interner, rustc_type_ir::Opaque { def_id }, args),
+ AliasTy::new_from_args(interner, rustc_type_ir::Opaque { def_id: def_id.into() }, args),
);
let (predicates, assoc_ty_bounds_start) =
self.with_shifted_in(DebruijnIndex::from_u32(1), |ctx| {
@@ -1799,7 +1802,9 @@ fn resolve_type_param_assoc_type_shorthand(
let (assoc_type, args) = assoc_type_and_args
.get_with(|(assoc_type, args)| (*assoc_type, args.as_ref()))
.skip_binder();
- let args = EarlyBinder::bind(args).instantiate(interner, bounded_trait_ref.args);
+ let args = EarlyBinder::bind(args)
+ .instantiate(interner, bounded_trait_ref.args)
+ .skip_norm_wip();
let current_result = StoredEarlyBinder::bind((assoc_type, args.store()));
if let Some(this_trait_resolution) = &this_trait_resolution {
if *this_trait_resolution == current_result {
@@ -1896,10 +1901,9 @@ pub(crate) fn type_alias_bounds_with_diagnostics(
LifetimeElisionKind::AnonymousReportError,
);
let interner = ctx.interner;
- let def_id = type_alias.into();
- let item_args = GenericArgs::identity_for_item(interner, def_id);
- let interner_ty = Ty::new_projection_from_args(interner, def_id, item_args);
+ let item_args = GenericArgs::identity_for_item(interner, type_alias.into());
+ let interner_ty = Ty::new_projection_from_args(interner, type_alias.into(), item_args);
let mut bounds = Vec::new();
let mut assoc_ty_bounds = Vec::new();
@@ -2088,8 +2092,10 @@ pub(crate) fn param_env_from_predicates<'db>(
interner: DbInterner<'db>,
predicates: &'db GenericPredicates,
) -> ParamEnv<'db> {
- let clauses =
- rustc_type_ir::elaborate::elaborate(interner, predicates.all_predicates().iter_identity());
+ let clauses = rustc_type_ir::elaborate::elaborate(
+ interner,
+ predicates.all_predicates().iter_identity().map(Unnormalized::skip_norm_wip),
+ );
let clauses = Clauses::new_from_iter(interner, clauses);
// FIXME: We should normalize projections here, like rustc does.
@@ -2459,10 +2465,12 @@ fn fn_sig_for_fn(
// If/when we track late bound vars, we need to switch this to not be `dummy`
let result = StoredEarlyBinder::bind(StoredPolyFnSig::new(Binder::dummy(FnSig {
- abi: data.abi.as_ref().map_or(FnAbi::Rust, FnAbi::from_symbol),
- c_variadic: data.is_varargs(),
- safety: if data.is_unsafe() { Safety::Unsafe } else { Safety::Safe },
inputs_and_output,
+ fn_sig_kind: FnSigKind::new(
+ data.abi,
+ if data.is_unsafe() { Safety::Unsafe } else { Safety::Safe },
+ data.is_varargs(),
+ ),
})));
TyLoweringResult::from_ctx(result, ctx_params)
}
@@ -2485,9 +2493,7 @@ fn fn_sig_for_struct_constructor(
let inputs_and_output =
Tys::new_from_iter(DbInterner::new_no_crate(db), params.chain(Some(ret)));
StoredEarlyBinder::bind(StoredPolyFnSig::new(Binder::dummy(FnSig {
- abi: FnAbi::Rust,
- c_variadic: false,
- safety: Safety::Safe,
+ fn_sig_kind: FnSigKind::new(ExternAbi::Rust, Safety::Safe, false),
inputs_and_output,
})))
}
@@ -2504,9 +2510,7 @@ fn fn_sig_for_enum_variant_constructor(
let inputs_and_output =
Tys::new_from_iter(DbInterner::new_no_crate(db), params.chain(Some(ret)));
StoredEarlyBinder::bind(StoredPolyFnSig::new(Binder::dummy(FnSig {
- abi: FnAbi::Rust,
- c_variadic: false,
- safety: Safety::Safe,
+ fn_sig_kind: FnSigKind::new(ExternAbi::Rust, Safety::Safe, false),
inputs_and_output,
})))
}
@@ -2607,5 +2611,8 @@ pub(crate) fn associated_type_by_name_including_super_traits_allow_ambiguity<'db
.get_with(|(assoc_type, trait_args)| (*assoc_type, trait_args.as_ref()))
.skip_binder();
let interner = DbInterner::new_no_crate(db);
- Some((assoc_type, EarlyBinder::bind(trait_args).instantiate(interner, trait_ref.args)))
+ Some((
+ assoc_type,
+ EarlyBinder::bind(trait_args).instantiate(interner, trait_ref.args).skip_norm_wip(),
+ ))
}
diff --git a/crates/hir-ty/src/lower/path.rs b/crates/hir-ty/src/lower/path.rs
index bf37e1faa8..dfa8873b86 100644
--- a/crates/hir-ty/src/lower/path.rs
+++ b/crates/hir-ty/src/lower/path.rs
@@ -34,8 +34,8 @@ use crate::{
LifetimeElisionKind, PathDiagnosticCallbackData, const_param_ty,
},
next_solver::{
- Binder, Clause, Const, DbInterner, EarlyBinder, ErrorGuaranteed, GenericArg, GenericArgs,
- Predicate, ProjectionPredicate, Region, TraitRef, Ty,
+ AliasTermKind, Binder, Clause, Const, DbInterner, EarlyBinder, ErrorGuaranteed, GenericArg,
+ GenericArgs, Predicate, ProjectionPredicate, Region, TraitRef, Ty,
},
};
@@ -498,7 +498,7 @@ impl<'a, 'b, 'db> PathLoweringContext<'a, 'b, 'db> {
let Some(impl_trait) = db.impl_trait(impl_) else {
return error_ty();
};
- let impl_trait = impl_trait.instantiate_identity();
+ let impl_trait = impl_trait.instantiate_identity().skip_norm_wip();
// Searching for `Self::Assoc` in `impl Trait for Type` is like searching for `Self::Assoc` in `Trait`.
let AssocTypeShorthandResolution::Resolved(assoc_type) =
super::resolve_type_param_assoc_type_shorthand(
@@ -514,7 +514,12 @@ impl<'a, 'b, 'db> PathLoweringContext<'a, 'b, 'db> {
let (assoc_type, trait_args) = assoc_type
.get_with(|(assoc_type, trait_args)| (*assoc_type, trait_args.as_ref()))
.skip_binder();
- (assoc_type, EarlyBinder::bind(trait_args).instantiate(interner, impl_trait.args))
+ (
+ assoc_type,
+ EarlyBinder::bind(trait_args)
+ .instantiate(interner, impl_trait.args)
+ .skip_norm_wip(),
+ )
}
_ => return error_ty(),
};
@@ -543,7 +548,7 @@ impl<'a, 'b, 'db> PathLoweringContext<'a, 'b, 'db> {
};
let args = self.substs_from_path_segment(generic_def, infer_args, None, false);
let ty = ty_query(self.ctx.db, typeable);
- ty.instantiate(self.ctx.interner, args)
+ ty.instantiate(self.ctx.interner, args).skip_norm_wip()
}
/// Collect generic arguments from a path into a `Substs`. See also
@@ -749,12 +754,11 @@ impl<'a, 'b, 'db> PathLoweringContext<'a, 'b, 'db> {
infer_args: bool,
preceding_args: &[GenericArg<'db>],
) -> GenericArg<'db> {
- let default =
- || {
- self.ctx.ctx.db.generic_defaults(def).get(preceding_args.len()).map(
- |default| default.instantiate(self.ctx.ctx.interner, preceding_args),
- )
- };
+ let default = || {
+ self.ctx.ctx.db.generic_defaults(def).get(preceding_args.len()).map(|default| {
+ default.instantiate(self.ctx.ctx.interner, preceding_args).skip_norm_wip()
+ })
+ };
match param {
GenericParamDataRef::LifetimeParamData(_) => {
Region::new(self.ctx.ctx.interner, rustc_type_ir::ReError(ErrorGuaranteed))
@@ -902,8 +906,11 @@ impl<'a, 'b, 'db> PathLoweringContext<'a, 'b, 'db> {
interner,
super_trait_args.iter().chain(args.iter().skip(super_trait_args.len())),
);
- let projection_term =
- AliasTerm::new_from_args(interner, associated_ty.into(), args);
+ let projection_term = AliasTerm::new_from_args(
+ interner,
+ AliasTermKind::ProjectionTy { def_id: associated_ty.into() },
+ args,
+ );
let mut predicates: SmallVec<[_; 1]> = SmallVec::with_capacity(
binding.type_ref.as_ref().map_or(0, |_| 1) + binding.bounds.len(),
);
diff --git a/crates/hir-ty/src/method_resolution.rs b/crates/hir-ty/src/method_resolution.rs
index f8aac3e63a..5e90e371fc 100644
--- a/crates/hir-ty/src/method_resolution.rs
+++ b/crates/hir-ty/src/method_resolution.rs
@@ -41,7 +41,7 @@ use crate::{
lower::GenericPredicates,
next_solver::{
AnyImplId, Binder, ClauseKind, DbInterner, FnSig, GenericArgs, ParamEnv, PredicateKind,
- SimplifiedType, SolverDefId, TraitRef, Ty, TyKind, TypingMode,
+ SimplifiedType, SolverDefId, TraitRef, Ty, TyKind, TypingMode, Unnormalized,
infer::{
BoundRegionConversionTime, DbInternerInferExt, InferCtxt, InferOk,
select::ImplSource,
@@ -289,8 +289,11 @@ impl<'db> InferenceTable<'db> {
// N.B., instantiate late-bound regions before normalizing the
// function signature so that normalization does not need to deal
// with bound regions.
- let fn_sig =
- self.db.callable_item_signature(method_item.into()).instantiate(interner, args);
+ let fn_sig = self
+ .db
+ .callable_item_signature(method_item.into())
+ .instantiate(interner, args)
+ .skip_norm_wip();
let fn_sig = self.infer_ctxt.instantiate_binder_with_fresh_vars(
cause.span(),
BoundRegionConversionTime::FnCall,
@@ -307,7 +310,7 @@ impl<'db> InferenceTable<'db> {
// any late-bound regions appearing in its bounds.
let bounds = GenericPredicates::query_all(self.db, method_item.into());
let bounds = clauses_as_obligations(
- bounds.iter_instantiated(interner, args.as_slice()),
+ bounds.iter_instantiated(interner, args.as_slice()).map(Unnormalized::skip_norm_wip),
cause,
self.param_env,
);
@@ -596,7 +599,7 @@ impl InherentImpls {
for impl_id in module_data.scope.inherent_impls() {
let interner = DbInterner::new_no_crate(db);
let self_ty = db.impl_self_ty(impl_id);
- let self_ty = self_ty.instantiate_identity();
+ let self_ty = self_ty.instantiate_identity().skip_norm_wip();
if let Some(self_ty) =
simplify_type(interner, self_ty, TreatParams::InstantiateWithInfer)
{
@@ -711,7 +714,7 @@ impl TraitImpls {
for (_module_id, module_data) in def_map.modules() {
for impl_id in module_data.scope.trait_impls() {
let trait_ref = match db.impl_trait(impl_id) {
- Some(tr) => tr.instantiate_identity(),
+ Some(tr) => tr.instantiate_identity().skip_norm_wip(),
None => continue,
};
// Reservation impls should be ignored during trait resolution, so we never need
diff --git a/crates/hir-ty/src/method_resolution/confirm.rs b/crates/hir-ty/src/method_resolution/confirm.rs
index 013b107b30..a3a5a9ca54 100644
--- a/crates/hir-ty/src/method_resolution/confirm.rs
+++ b/crates/hir-ty/src/method_resolution/confirm.rs
@@ -27,7 +27,7 @@ use crate::{
next_solver::{
Binder, Clause, ClauseKind, Const, DbInterner, EarlyParamRegion, ErrorGuaranteed, FnSig,
GenericArg, GenericArgs, ParamConst, PolyExistentialTraitRef, PolyTraitRef, Region,
- TraitRef, Ty, TyKind,
+ TraitRef, Ty, TyKind, Unnormalized,
infer::{
BoundRegionConversionTime, InferCtxt,
traits::{ObligationCause, PredicateObligation},
@@ -137,7 +137,8 @@ impl<'a, 'b, 'db> ConfirmContext<'a, 'b, 'db> {
);
let illegal_sized_bound = self.predicates_require_illegal_sized_bound(
GenericPredicates::query_all(self.db(), self.candidate.into())
- .iter_instantiated(self.interner(), filler_args.as_slice()),
+ .iter_instantiated(self.interner(), filler_args.as_slice())
+ .map(Unnormalized::skip_norm_wip),
);
// Unify the (adjusted) self type with what the method expects.
@@ -512,13 +513,17 @@ impl<'a, 'b, 'db> ConfirmContext<'a, 'b, 'db> {
let def_id = self.candidate;
let method_predicates = clauses_as_obligations(
GenericPredicates::query_all(self.db(), def_id.into())
- .iter_instantiated(self.interner(), all_args),
+ .iter_instantiated(self.interner(), all_args)
+ .map(Unnormalized::skip_norm_wip),
ObligationCause::new(self.call_expr),
self.ctx.table.param_env,
);
- let sig =
- self.db().callable_item_signature(def_id.into()).instantiate(self.interner(), all_args);
+ let sig = self
+ .db()
+ .callable_item_signature(def_id.into())
+ .instantiate(self.interner(), all_args)
+ .skip_norm_wip();
debug!("type scheme instantiated, sig={:?}", sig);
let sig = self.instantiate_binder_with_fresh_vars(sig);
diff --git a/crates/hir-ty/src/method_resolution/probe.rs b/crates/hir-ty/src/method_resolution/probe.rs
index 34cd941e91..4b2f0cfd70 100644
--- a/crates/hir-ty/src/method_resolution/probe.rs
+++ b/crates/hir-ty/src/method_resolution/probe.rs
@@ -32,7 +32,7 @@ use crate::{
},
next_solver::{
Binder, Canonical, ClauseKind, DbInterner, FnSig, GenericArg, GenericArgs, Goal, ParamEnv,
- PolyTraitRef, Predicate, Region, SimplifiedType, TraitRef, Ty, TyKind,
+ PolyTraitRef, Predicate, Region, SimplifiedType, TraitRef, Ty, TyKind, Unnormalized,
infer::{
BoundRegionConversionTime, InferCtxt, InferOk,
canonical::{QueryResponse, canonicalizer::OriginalQueryValues},
@@ -1585,8 +1585,11 @@ impl<'a, 'db, Choice: ProbeChoice<'db>> ProbeContext<'a, 'db, Choice> {
InherentImplCandidate { impl_def_id, .. } => {
let impl_args =
self.infcx().fresh_args_for_item(self.ctx.call_span, impl_def_id.into());
- let impl_ty =
- self.db().impl_self_ty(impl_def_id).instantiate(self.interner(), impl_args);
+ let impl_ty = self
+ .db()
+ .impl_self_ty(impl_def_id)
+ .instantiate(self.interner(), impl_args)
+ .skip_norm_wip();
(xform_self_ty, xform_ret_ty) =
self.xform_self_ty(probe.item, impl_ty, impl_args.as_slice());
match ocx.relate(
@@ -1605,7 +1608,9 @@ impl<'a, 'db, Choice: ProbeChoice<'db>> ProbeContext<'a, 'db, Choice> {
// Check whether the impl imposes obligations we have to worry about.
let impl_bounds = GenericPredicates::query_all(self.db(), impl_def_id.into());
let impl_bounds = clauses_as_obligations(
- impl_bounds.iter_instantiated(self.interner(), impl_args.as_slice()),
+ impl_bounds
+ .iter_instantiated(self.interner(), impl_args.as_slice())
+ .map(Unnormalized::skip_norm_wip),
ObligationCause::new(self.ctx.call_span),
self.param_env(),
);
@@ -2054,7 +2059,7 @@ impl<'a, 'db, Choice: ProbeChoice<'db>> ProbeContext<'a, 'db, Choice> {
fn_sig.instantiate(self.interner(), args)
};
- self.interner().instantiate_bound_regions_with_erased(xform_fn_sig)
+ self.interner().instantiate_bound_regions_with_erased(xform_fn_sig.skip_norm_wip())
}
fn with_impl_item(&mut self, def_id: ImplId, callback: impl FnMut(&mut Self, CandidateId)) {
diff --git a/crates/hir-ty/src/mir.rs b/crates/hir-ty/src/mir.rs
index 05f3f00103..5f61b1defb 100644
--- a/crates/hir-ty/src/mir.rs
+++ b/crates/hir-ty/src/mir.rs
@@ -197,9 +197,10 @@ impl<V: PartialEq> ProjectionElem<V> {
}
},
ProjectionElem::Field(Either::Left(f)) => match base.kind() {
- TyKind::Adt(_, subst) => {
- db.field_types(f.parent)[f.local_id].get().instantiate(interner, subst)
- }
+ TyKind::Adt(_, subst) => db.field_types(f.parent)[f.local_id]
+ .get()
+ .instantiate(interner, subst)
+ .skip_norm_wip(),
ty => {
never!("Only adt has field, found {:?}", ty);
Ty::new_error(interner, ErrorGuaranteed)
diff --git a/crates/hir-ty/src/mir/eval.rs b/crates/hir-ty/src/mir/eval.rs
index 9e2861fa2b..3372f6ec2e 100644
--- a/crates/hir-ty/src/mir/eval.rs
+++ b/crates/hir-ty/src/mir/eval.rs
@@ -467,6 +467,7 @@ impl MirEvalError {
ItemContainerId::ImplId(impl_id) => Some({
db.impl_self_ty(impl_id)
.instantiate_identity()
+ .skip_norm_wip()
.display(db, display_target)
.to_string()
}),
@@ -1715,7 +1716,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
if let Some(ty) =
field_types.iter().last().map(|it| it.1.get().instantiate(self.interner(), subst))
{
- return self.coerce_unsized_look_through_fields(ty, goal);
+ return self.coerce_unsized_look_through_fields(ty.skip_norm_wip(), goal);
}
}
Err(MirEvalError::CoerceUnsizedError(ty.store()))
@@ -1792,10 +1793,12 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
};
let target_last_field = self.db.field_types(id.into())[last_field]
.get()
- .instantiate(self.interner(), target_subst);
+ .instantiate(self.interner(), target_subst)
+ .skip_norm_wip();
let current_last_field = self.db.field_types(id.into())[last_field]
.get()
- .instantiate(self.interner(), current_subst);
+ .instantiate(self.interner(), current_subst)
+ .skip_norm_wip();
return self.unsizing_ptr_from_addr(
target_last_field,
current_last_field,
@@ -2435,7 +2438,10 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
.fields
.offset(u32::from(f.into_raw()) as usize)
.bytes_usize();
- let ty = field_types[f].get().instantiate(this.interner(), subst);
+ let ty = field_types[f]
+ .get()
+ .instantiate(this.interner(), subst)
+ .skip_norm_wip();
let size = this.layout(ty)?.size.bytes_usize();
rec(
this,
@@ -2461,7 +2467,10 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
for (f, _) in data.fields().iter() {
let offset =
l.fields.offset(u32::from(f.into_raw()) as usize).bytes_usize();
- let ty = field_types[f].get().instantiate(this.interner(), subst);
+ let ty = field_types[f]
+ .get()
+ .instantiate(this.interner(), subst)
+ .skip_norm_wip();
let size = this.layout(ty)?.size.bytes_usize();
rec(
this,
@@ -2547,7 +2556,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
AdtId::StructId(s) => {
for (i, (_, ty)) in self.db.field_types(s.into()).iter().enumerate() {
let offset = layout.fields.offset(i).bytes_usize();
- let ty = ty.get().instantiate(self.interner(), args);
+ let ty = ty.get().instantiate(self.interner(), args).skip_norm_wip();
self.patch_addresses(
patch_map,
ty_of_bytes,
@@ -2568,7 +2577,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
) {
for (i, (_, ty)) in self.db.field_types(ev.into()).iter().enumerate() {
let offset = layout.fields.offset(i).bytes_usize();
- let ty = ty.get().instantiate(self.interner(), args);
+ let ty = ty.get().instantiate(self.interner(), args).skip_norm_wip();
self.patch_addresses(
patch_map,
ty_of_bytes,
@@ -3084,7 +3093,8 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
let addr = addr.offset(offset);
let ty = field_types[field]
.get()
- .instantiate(self.interner(), subst);
+ .instantiate(self.interner(), subst)
+ .skip_norm_wip();
self.run_drop_glue_deep(ty, locals, addr, &[], span)?;
}
}
diff --git a/crates/hir-ty/src/mir/eval/shim.rs b/crates/hir-ty/src/mir/eval/shim.rs
index 284148873d..b4a5aa8a87 100644
--- a/crates/hir-ty/src/mir/eval/shim.rs
+++ b/crates/hir-ty/src/mir/eval/shim.rs
@@ -4,7 +4,7 @@
use std::cmp::{self, Ordering};
use hir_def::{attrs::AttrFlags, signatures::FunctionSignature};
-use intern::sym;
+use rustc_abi::ExternAbi;
use rustc_type_ir::inherent::{GenericArgs as _, IntoKind, SliceLike, Ty as _};
use stdx::never;
@@ -59,7 +59,9 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
);
}
let is_extern_c = match def.lookup(self.db).container {
- hir_def::ItemContainerId::ExternBlockId(block) => block.abi(self.db) == Some(sym::C),
+ hir_def::ItemContainerId::ExternBlockId(block) => {
+ matches!(block.abi(self.db), ExternAbi::C { .. })
+ }
_ => false,
};
if is_extern_c {
@@ -1368,7 +1370,8 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
.unwrap()
.1
.get()
- .instantiate(self.interner(), subst);
+ .instantiate(self.interner(), subst)
+ .skip_norm_wip();
let sized_part_size =
layout.fields.offset(field_types.iter().count() - 1).bytes_usize();
let sized_part_align = layout.align.bytes() as usize;
diff --git a/crates/hir-ty/src/mir/eval/shim/simd.rs b/crates/hir-ty/src/mir/eval/shim/simd.rs
index 2458597ff4..074c5a9c77 100644
--- a/crates/hir-ty/src/mir/eval/shim/simd.rs
+++ b/crates/hir-ty/src/mir/eval/shim/simd.rs
@@ -21,7 +21,8 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
};
let field_ty = self.db.field_types(id.into())[first_field]
.get()
- .instantiate(self.interner(), subst);
+ .instantiate(self.interner(), subst)
+ .skip_norm_wip();
return Ok((fields.len(), field_ty));
}
return Err(MirEvalError::InternalError(
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index 96ddb69814..763d52398b 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -1546,7 +1546,7 @@ impl<'a, 'db> MirLowerCtx<'a, 'db> {
GeneralConstId::StaticId(id) => self.db.value_ty(id.into()).unwrap(),
GeneralConstId::AnonConstId(id) => id.loc(self.db).ty.get(),
};
- let ty = ty.instantiate(self.interner(), subst);
+ let ty = ty.instantiate(self.interner(), subst).skip_norm_wip();
Ok(Operand {
kind: OperandKind::Constant { konst: konst.store(), ty: ty.store() },
span: None,
diff --git a/crates/hir-ty/src/next_solver.rs b/crates/hir-ty/src/next_solver.rs
index aa118149e2..78fdb1548c 100644
--- a/crates/hir-ty/src/next_solver.rs
+++ b/crates/hir-ty/src/next_solver.rs
@@ -39,6 +39,7 @@ pub use interner::*;
pub use opaques::*;
pub use predicate::*;
pub use region::*;
+use rustc_type_ir::MayBeErased;
pub use solver::*;
pub use ty::*;
@@ -48,6 +49,7 @@ pub use rustc_ast_ir::Mutability;
pub type Binder<'db, T> = rustc_type_ir::Binder<DbInterner<'db>, T>;
pub type EarlyBinder<'db, T> = rustc_type_ir::EarlyBinder<DbInterner<'db>, T>;
+pub type Unnormalized<'db, T> = rustc_type_ir::Unnormalized<DbInterner<'db>, T>;
pub type Canonical<'db, T> = rustc_type_ir::Canonical<DbInterner<'db>, T>;
pub type CanonicalVarValues<'db> = rustc_type_ir::CanonicalVarValues<DbInterner<'db>>;
pub type CanonicalVarKind<'db> = rustc_type_ir::CanonicalVarKind<DbInterner<'db>>;
@@ -55,7 +57,7 @@ pub type CanonicalQueryInput<'db, V> = rustc_type_ir::CanonicalQueryInput<DbInte
pub type AliasTy<'db> = rustc_type_ir::AliasTy<DbInterner<'db>>;
pub type FnSig<'db> = rustc_type_ir::FnSig<DbInterner<'db>>;
pub type PolyFnSig<'db> = Binder<'db, rustc_type_ir::FnSig<DbInterner<'db>>>;
-pub type TypingMode<'db> = rustc_type_ir::TypingMode<DbInterner<'db>>;
+pub type TypingMode<'db, S = MayBeErased> = rustc_type_ir::TypingMode<DbInterner<'db>, S>;
pub type TypeError<'db> = rustc_type_ir::error::TypeError<DbInterner<'db>>;
pub type QueryResult<'db> = rustc_type_ir::solve::QueryResult<DbInterner<'db>>;
pub type FxIndexMap<K, V> = rustc_type_ir::data_structures::IndexMap<K, V>;
diff --git a/crates/hir-ty/src/next_solver/abi.rs b/crates/hir-ty/src/next_solver/abi.rs
index 1813abab86..3121d5631f 100644
--- a/crates/hir-ty/src/next_solver/abi.rs
+++ b/crates/hir-ty/src/next_solver/abi.rs
@@ -1,7 +1,10 @@
//! ABI-related things in the next-trait-solver.
-use rustc_type_ir::{error::TypeError, relate::Relate};
-
-use crate::FnAbi;
+use rustc_abi::ExternAbi;
+use rustc_ast_ir::visit::VisitorResult;
+use rustc_type_ir::{
+ FallibleTypeFolder, TypeFoldable, TypeFolder, TypeVisitable, TypeVisitor, error::TypeError,
+ relate::Relate,
+};
use super::interner::DbInterner;
@@ -40,9 +43,32 @@ impl<'db> rustc_type_ir::inherent::Safety<DbInterner<'db>> for Safety {
Self::Safe => "",
}
}
+
+ fn unsafe_mode() -> Self {
+ Safety::Unsafe
+ }
+}
+
+impl<'db> TypeVisitable<DbInterner<'db>> for ExternAbi {
+ fn visit_with<V: TypeVisitor<DbInterner<'db>>>(&self, _visitor: &mut V) -> V::Result {
+ V::Result::output()
+ }
+}
+
+impl<'db> TypeFoldable<DbInterner<'db>> for ExternAbi {
+ fn try_fold_with<F: FallibleTypeFolder<DbInterner<'db>>>(
+ self,
+ _folder: &mut F,
+ ) -> Result<Self, F::Error> {
+ Ok(self)
+ }
+
+ fn fold_with<F: TypeFolder<DbInterner<'db>>>(self, _folder: &mut F) -> Self {
+ self
+ }
}
-impl<'db> Relate<DbInterner<'db>> for FnAbi {
+impl<'db> Relate<DbInterner<'db>> for ExternAbi {
fn relate<R: rustc_type_ir::relate::TypeRelation<DbInterner<'db>>>(
_relation: &mut R,
a: Self,
@@ -55,13 +81,3 @@ impl<'db> Relate<DbInterner<'db>> for FnAbi {
}
}
}
-
-impl<'db> rustc_type_ir::inherent::Abi<DbInterner<'db>> for FnAbi {
- fn rust() -> Self {
- FnAbi::Rust
- }
-
- fn is_rust(self) -> bool {
- matches!(self, FnAbi::Rust)
- }
-}
diff --git a/crates/hir-ty/src/next_solver/binder.rs b/crates/hir-ty/src/next_solver/binder.rs
index 22019f1ff9..95f437165d 100644
--- a/crates/hir-ty/src/next_solver/binder.rs
+++ b/crates/hir-ty/src/next_solver/binder.rs
@@ -1,13 +1,10 @@
use hir_def::TraitId;
use macros::{TypeFoldable, TypeVisitable};
-use crate::{
- FnAbi,
- next_solver::{
- Binder, Clauses, DbInterner, EarlyBinder, FnSig, GenericArg, PolyFnSig,
- StoredBoundVarKinds, StoredClauses, StoredGenericArg, StoredGenericArgs, StoredTy,
- StoredTys, TraitRef, Ty, abi::Safety,
- },
+use crate::next_solver::{
+ Binder, Clauses, DbInterner, EarlyBinder, FnSig, FnSigKind, GenericArg, PolyFnSig,
+ StoredBoundVarKinds, StoredClauses, StoredGenericArg, StoredGenericArgs, StoredTy, StoredTys,
+ TraitRef, Ty,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -74,9 +71,7 @@ impl StoredEarlyBinder<StoredTraitRef> {
pub struct StoredPolyFnSig {
bound_vars: StoredBoundVarKinds,
inputs_and_output: StoredTys,
- c_variadic: bool,
- safety: Safety,
- abi: FnAbi,
+ fn_sig_kind: FnSigKind<'static>,
}
impl StoredPolyFnSig {
@@ -87,9 +82,11 @@ impl StoredPolyFnSig {
Self {
bound_vars,
inputs_and_output: sig.inputs_and_output.store(),
- c_variadic: sig.c_variadic,
- safety: sig.safety,
- abi: sig.abi,
+ fn_sig_kind: FnSigKind::new(
+ sig.fn_sig_kind.abi(),
+ sig.fn_sig_kind.safety(),
+ sig.fn_sig_kind.c_variadic(),
+ ),
}
}
@@ -98,9 +95,7 @@ impl StoredPolyFnSig {
Binder::bind_with_vars(
FnSig {
inputs_and_output: self.inputs_and_output.as_ref(),
- c_variadic: self.c_variadic,
- safety: self.safety,
- abi: self.abi,
+ fn_sig_kind: self.fn_sig_kind,
},
self.bound_vars.as_ref(),
)
diff --git a/crates/hir-ty/src/next_solver/def_id.rs b/crates/hir-ty/src/next_solver/def_id.rs
index 41b00b67cd..63337b297d 100644
--- a/crates/hir-ty/src/next_solver/def_id.rs
+++ b/crates/hir-ty/src/next_solver/def_id.rs
@@ -310,26 +310,6 @@ impl TryFrom<SolverDefId> for GenericDefId {
}
}
-impl SolverDefId {
- #[inline]
- #[track_caller]
- pub fn expect_opaque_ty(self) -> InternedOpaqueTyId {
- match self {
- SolverDefId::InternedOpaqueTyId(it) => it,
- _ => panic!("expected opaque type, found {self:?}"),
- }
- }
-
- #[inline]
- #[track_caller]
- pub fn expect_type_alias(self) -> TypeAliasId {
- match self {
- SolverDefId::TypeAliasId(it) => it,
- _ => panic!("expected type alias, found {self:?}"),
- }
- }
-}
-
impl<'db> inherent::DefId<DbInterner<'db>> for SolverDefId {
fn as_local(self) -> Option<SolverDefId> {
Some(self)
@@ -341,6 +321,26 @@ impl<'db> inherent::DefId<DbInterner<'db>> for SolverDefId {
macro_rules! declare_id_wrapper {
($name:ident, $wraps:ident) => {
+ declare_id_wrapper!($name, $wraps, SolverDefId);
+ };
+
+ ($name:ident, $wraps:ident, $local:ident) => {
+ declare_id_wrapper!($name, $wraps, $local, no_try_from);
+
+ impl TryFrom<SolverDefId> for $name {
+ type Error = ();
+
+ #[inline]
+ fn try_from(value: SolverDefId) -> Result<Self, Self::Error> {
+ match value {
+ SolverDefId::$wraps(it) => Ok(Self(it)),
+ _ => Err(()),
+ }
+ }
+ }
+ };
+
+ ($name:ident, $wraps:ident, $local:ident, no_try_from) => {
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct $name(pub $wraps);
@@ -371,35 +371,106 @@ macro_rules! declare_id_wrapper {
}
}
- impl TryFrom<SolverDefId> for $name {
+ impl<'db> inherent::DefId<DbInterner<'db>, $local> for $name {
+ fn as_local(self) -> Option<$local> {
+ Some(self.into())
+ }
+ fn is_local(self) -> bool {
+ true
+ }
+ }
+ };
+}
+
+declare_id_wrapper!(TraitIdWrapper, TraitId);
+declare_id_wrapper!(TypeAliasIdWrapper, TypeAliasId);
+declare_id_wrapper!(ClosureIdWrapper, InternedClosureId);
+declare_id_wrapper!(CoroutineIdWrapper, InternedCoroutineId);
+declare_id_wrapper!(CoroutineClosureIdWrapper, InternedCoroutineClosureId);
+declare_id_wrapper!(AdtIdWrapper, AdtId);
+declare_id_wrapper!(OpaqueTyIdWrapper, InternedOpaqueTyId, OpaqueTyIdWrapper);
+
+macro_rules! declare_ty_const_pair {
+ ( $ty_id_name:ident, $const_id_name:ident, $term_id_name:ident ) => {
+ declare_id_wrapper!($ty_id_name, TypeAliasId);
+ declare_id_wrapper!($const_id_name, ConstId);
+ declare_id_wrapper!($term_id_name, TermId, SolverDefId, no_try_from);
+
+ impl TryFrom<SolverDefId> for $term_id_name {
type Error = ();
#[inline]
fn try_from(value: SolverDefId) -> Result<Self, Self::Error> {
match value {
- SolverDefId::$wraps(it) => Ok(Self(it)),
+ SolverDefId::TypeAliasId(it) => Ok(Self(TermId::TypeAliasId(it))),
+ SolverDefId::ConstId(it) => Ok(Self(TermId::ConstId(it))),
_ => Err(()),
}
}
}
- impl<'db> inherent::DefId<DbInterner<'db>> for $name {
- fn as_local(self) -> Option<SolverDefId> {
- Some(self.into())
+ impl From<$ty_id_name> for $term_id_name {
+ fn from(value: $ty_id_name) -> Self {
+ $term_id_name(TermId::TypeAliasId(value.0))
}
- fn is_local(self) -> bool {
- true
+ }
+
+ impl From<$const_id_name> for $term_id_name {
+ fn from(value: $const_id_name) -> Self {
+ $term_id_name(TermId::ConstId(value.0))
+ }
+ }
+
+ impl TryFrom<$term_id_name> for $ty_id_name {
+ type Error = ();
+
+ fn try_from(value: $term_id_name) -> Result<Self, Self::Error> {
+ match value.0 {
+ TermId::TypeAliasId(id) => Ok($ty_id_name(id)),
+ TermId::ConstId(_) => Err(()),
+ }
+ }
+ }
+
+ impl TryFrom<$term_id_name> for $const_id_name {
+ type Error = ();
+
+ fn try_from(value: $term_id_name) -> Result<Self, Self::Error> {
+ match value.0 {
+ TermId::ConstId(id) => Ok($const_id_name(id)),
+ TermId::TypeAliasId(_) => Err(()),
+ }
+ }
+ }
+
+ impl From<$const_id_name> for GeneralConstIdWrapper {
+ fn from(value: $const_id_name) -> Self {
+ GeneralConstIdWrapper(GeneralConstId::ConstId(value.0))
}
}
};
}
-declare_id_wrapper!(TraitIdWrapper, TraitId);
-declare_id_wrapper!(TypeAliasIdWrapper, TypeAliasId);
-declare_id_wrapper!(ClosureIdWrapper, InternedClosureId);
-declare_id_wrapper!(CoroutineIdWrapper, InternedCoroutineId);
-declare_id_wrapper!(CoroutineClosureIdWrapper, InternedCoroutineClosureId);
-declare_id_wrapper!(AdtIdWrapper, AdtId);
+declare_ty_const_pair!(TraitAssocTyId, TraitAssocConstId, TraitAssocTermId);
+declare_ty_const_pair!(ImplOrTraitAssocTyId, ImplOrTraitAssocConstId, ImplOrTraitAssocTermId);
+declare_ty_const_pair!(FreeTyAliasId, FreeConstAliasId, FreeTermAliasId);
+declare_ty_const_pair!(InherentAssocTyId, InherentAssocConstId, InherentAssocTermId);
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
+pub enum TermId {
+ TypeAliasId(TypeAliasId),
+ ConstId(ConstId),
+}
+impl_from!(TypeAliasId, ConstId for TermId);
+
+impl From<TermId> for SolverDefId {
+ fn from(value: TermId) -> Self {
+ match value {
+ TermId::TypeAliasId(id) => id.into(),
+ TermId::ConstId(id) => id.into(),
+ }
+ }
+}
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct GeneralConstIdWrapper(pub GeneralConstId);
diff --git a/crates/hir-ty/src/next_solver/fulfill.rs b/crates/hir-ty/src/next_solver/fulfill.rs
index 066d67f965..33dd33cb1d 100644
--- a/crates/hir-ty/src/next_solver/fulfill.rs
+++ b/crates/hir-ty/src/next_solver/fulfill.rs
@@ -243,7 +243,7 @@ impl<'db> FulfillmentCtxt<'db> {
&mut self,
infcx: &InferCtxt<'db>,
) -> PredicateObligations<'db> {
- let stalled_coroutines = match infcx.typing_mode() {
+ let stalled_coroutines = match infcx.typing_mode_raw().assert_not_erased() {
TypingMode::Analysis { defining_opaque_types_and_generators } => {
defining_opaque_types_and_generators
}
diff --git a/crates/hir-ty/src/next_solver/generic_arg.rs b/crates/hir-ty/src/next_solver/generic_arg.rs
index 75df2b541e..51f070cd64 100644
--- a/crates/hir-ty/src/next_solver/generic_arg.rs
+++ b/crates/hir-ty/src/next_solver/generic_arg.rs
@@ -579,7 +579,7 @@ impl<'db> GenericArgs<'db> {
{
let defaults = interner.db.generic_defaults(def_id);
Self::for_item(interner, def_id.into(), |idx, id, prev| match defaults.get(idx as usize) {
- Some(default) => default.instantiate(interner, prev),
+ Some(default) => default.instantiate(interner, prev).skip_norm_wip(),
None => fallback(idx, id, prev),
})
}
@@ -614,7 +614,7 @@ impl<'db> GenericArgs<'db> {
Self::fill_rest(interner, def_id.into(), first, |idx, id, prev| {
defaults
.get(idx as usize)
- .map(|default| default.instantiate(interner, prev))
+ .map(|default| default.instantiate(interner, prev).skip_norm_wip())
.unwrap_or_else(|| fallback(idx, id, prev))
})
}
diff --git a/crates/hir-ty/src/next_solver/infer/canonical/instantiate.rs b/crates/hir-ty/src/next_solver/infer/canonical/instantiate.rs
index bda418cf20..6e20375500 100644
--- a/crates/hir-ty/src/next_solver/infer/canonical/instantiate.rs
+++ b/crates/hir-ty/src/next_solver/infer/canonical/instantiate.rs
@@ -437,7 +437,7 @@ impl<'db> InferCtxt<'db> {
// the generic args of the opaque with the generic params of its hidden type version.
obligations.extend(
self.at(cause, param_env)
- .eq(Ty::new_opaque(self.interner, a.def_id, a.args), b)?
+ .eq(Ty::new_opaque(self.interner, a.def_id.0, a.args), b)?
.obligations,
);
}
diff --git a/crates/hir-ty/src/next_solver/infer/context.rs b/crates/hir-ty/src/next_solver/infer/context.rs
index 9ea4665000..1e2a3ff0c2 100644
--- a/crates/hir-ty/src/next_solver/infer/context.rs
+++ b/crates/hir-ty/src/next_solver/infer/context.rs
@@ -5,6 +5,7 @@ use rustc_type_ir::{
RegionVid, TyVid, TypeFoldable, TypingMode, UniverseIndex,
inherent::{Const as _, IntoKind, Ty as _},
relate::combine::PredicateEmittingRelation,
+ solve::VisibleForLeakCheck,
};
use crate::{
@@ -29,8 +30,12 @@ impl<'db> rustc_type_ir::InferCtxtLike for InferCtxt<'db> {
true
}
- fn typing_mode(&self) -> TypingMode<DbInterner<'db>> {
- self.typing_mode()
+ fn disable_trait_solver_fast_paths(&self) -> bool {
+ false
+ }
+
+ fn typing_mode_raw(&self) -> TypingMode<DbInterner<'db>> {
+ self.typing_mode_raw()
}
fn universe(&self) -> UniverseIndex {
@@ -257,11 +262,23 @@ impl<'db> rustc_type_ir::InferCtxtLike for InferCtxt<'db> {
self.probe(|_| probe())
}
- fn sub_regions(&self, sub: Region<'db>, sup: Region<'db>, _span: Span) {
+ fn sub_regions(
+ &self,
+ sub: Region<'db>,
+ sup: Region<'db>,
+ _vis: VisibleForLeakCheck,
+ _span: Span,
+ ) {
self.inner.borrow_mut().unwrap_region_constraints().make_subregion(sub, sup);
}
- fn equate_regions(&self, a: Region<'db>, b: Region<'db>, _span: Span) {
+ fn equate_regions(
+ &self,
+ a: Region<'db>,
+ b: Region<'db>,
+ _vis: VisibleForLeakCheck,
+ _span: Span,
+ ) {
self.inner.borrow_mut().unwrap_region_constraints().make_eqregion(a, b);
}
diff --git a/crates/hir-ty/src/next_solver/infer/errors.rs b/crates/hir-ty/src/next_solver/infer/errors.rs
index 3c2119b6fa..7d3f111f66 100644
--- a/crates/hir-ty/src/next_solver/infer/errors.rs
+++ b/crates/hir-ty/src/next_solver/infer/errors.rs
@@ -6,7 +6,7 @@ use rustc_type_ir::{
AliasRelationDirection, AliasTermKind, PredicatePolarity,
error::ExpectedFound,
inherent::IntoKind as _,
- solve::{CandidateSource, Certainty, GoalSource, MaybeCause, NoSolution},
+ solve::{CandidateSource, Certainty, GoalSource, MaybeCause, MaybeInfo, NoSolution},
};
use tracing::{instrument, trace};
@@ -147,7 +147,7 @@ fn fulfillment_error_for_no_solution<'db>(
GeneralConstId::StaticId(statik) => db.value_ty(statik.into()).unwrap(),
GeneralConstId::AnonConstId(konst) => konst.loc(db).ty.get(),
};
- ct_ty.instantiate(interner, uv.args)
+ ct_ty.instantiate(interner, uv.args).skip_norm_wip()
}
ConstKind::Param(param_ct) => param_ct.find_const_ty_from_env(obligation.param_env),
ConstKind::Value(cv) => cv.ty,
@@ -203,16 +203,16 @@ fn fulfillment_error_for_stalled<'db>(
None,
) {
Ok(GoalEvaluation {
- certainty: Certainty::Maybe { cause: MaybeCause::Ambiguity, .. },
+ certainty: Certainty::Maybe(MaybeInfo { cause: MaybeCause::Ambiguity, .. }),
..
}) => (FulfillmentErrorCode::Ambiguity { overflow: None }, true),
Ok(GoalEvaluation {
certainty:
- Certainty::Maybe {
+ Certainty::Maybe(MaybeInfo {
cause:
MaybeCause::Overflow { suggest_increasing_limit, keep_constraints: _ },
..
- },
+ }),
..
}) => (
FulfillmentErrorCode::Ambiguity { overflow: Some(suggest_increasing_limit) },
@@ -495,8 +495,8 @@ impl<'db> BestObligation<'db> {
self.detect_error_in_self_ty_normalization(goal, pred.self_ty())?;
}
Some(PredicateKind::NormalizesTo(pred))
- if let AliasTermKind::ProjectionTy | AliasTermKind::ProjectionConst =
- pred.alias.kind(interner) =>
+ if let AliasTermKind::ProjectionTy { .. }
+ | AliasTermKind::ProjectionConst { .. } = pred.alias.kind(interner) =>
{
self.detect_error_in_self_ty_normalization(goal, pred.alias.self_ty())?;
self.detect_non_well_formed_assoc_item(goal, pred.alias)?;
@@ -520,8 +520,8 @@ impl<'db> ProofTreeVisitor<'db> for BestObligation<'db> {
let interner = goal.infcx().interner;
// Skip goals that aren't the *reason* for our goal's failure.
match (self.consider_ambiguities, goal.result()) {
- (true, Ok(Certainty::Maybe { cause: MaybeCause::Ambiguity, .. })) | (false, Err(_)) => {
- }
+ (true, Ok(Certainty::Maybe(MaybeInfo { cause: MaybeCause::Ambiguity, .. })))
+ | (false, Err(_)) => {}
_ => return ControlFlow::Continue(()),
}
@@ -559,7 +559,7 @@ impl<'db> ProofTreeVisitor<'db> for BestObligation<'db> {
PredicateKind::NormalizesTo(normalizes_to)
if matches!(
normalizes_to.alias.kind(interner),
- AliasTermKind::ProjectionTy | AliasTermKind::ProjectionConst
+ AliasTermKind::ProjectionTy { .. } | AliasTermKind::ProjectionConst { .. }
) =>
{
ChildMode::Trait(pred.kind().rebind(TraitPredicate {
diff --git a/crates/hir-ty/src/next_solver/infer/mod.rs b/crates/hir-ty/src/next_solver/infer/mod.rs
index 0bb980c906..d51a4c1312 100644
--- a/crates/hir-ty/src/next_solver/infer/mod.rs
+++ b/crates/hir-ty/src/next_solver/infer/mod.rs
@@ -11,7 +11,6 @@ use hir_def::{GenericParamId, TraitId};
use opaque_types::{OpaqueHiddenType, OpaqueTypeStorage};
use region_constraints::{RegionConstraintCollector, RegionConstraintStorage};
use rustc_next_trait_solver::solve::{GoalEvaluation, SolverDelegateEvalExt};
-use rustc_pattern_analysis::Captures;
use rustc_type_ir::{
ClosureKind, ConstVid, FloatVarValue, FloatVid, GenericArgKind, InferConst, InferTy,
IntVarValue, IntVid, OutlivesPredicate, RegionVid, TermKind, TyVid, TypeFoldable, TypeFolder,
@@ -403,7 +402,7 @@ impl<'db> InferOk<'db, ()> {
impl<'db> InferCtxt<'db> {
#[inline(always)]
- pub fn typing_mode(&self) -> TypingMode<'db> {
+ pub fn typing_mode_raw(&self) -> TypingMode<'db> {
self.typing_mode
}
@@ -931,7 +930,7 @@ impl<'db> InferCtxt<'db> {
#[inline(always)]
pub fn can_define_opaque_ty(&self, id: impl Into<SolverDefId>) -> bool {
- match self.typing_mode_unchecked() {
+ match self.typing_mode_raw().assert_not_erased() {
TypingMode::Analysis { defining_opaque_types_and_generators } => {
defining_opaque_types_and_generators.contains(&id.into())
}
@@ -1201,7 +1200,7 @@ impl<'db> InferCtxt<'db> {
#[inline]
pub fn is_ty_infer_var_definitely_unchanged<'a>(
&'a self,
- ) -> impl Fn(TyOrConstInferVar) -> bool + Captures<'db> + 'a {
+ ) -> impl Fn(TyOrConstInferVar) -> bool + use<'a, 'db> {
// This hoists the borrow/release out of the loop body.
let inner = self.inner.try_borrow();
diff --git a/crates/hir-ty/src/next_solver/inspect.rs b/crates/hir-ty/src/next_solver/inspect.rs
index fdb1fa3d05..7e2dfb7112 100644
--- a/crates/hir-ty/src/next_solver/inspect.rs
+++ b/crates/hir-ty/src/next_solver/inspect.rs
@@ -7,7 +7,7 @@ use rustc_next_trait_solver::{
use rustc_type_ir::{
VisitorResult,
inherent::IntoKind,
- solve::{Certainty, GoalSource, MaybeCause, NoSolution},
+ solve::{Certainty, GoalSource, MaybeCause, MaybeInfo, NoSolution},
};
use crate::{
@@ -344,7 +344,10 @@ impl<'a, 'db> InspectGoal<'a, 'db> {
inspect::ProbeStep::MakeCanonicalResponse { shallow_certainty: c } => {
assert!(matches!(
shallow_certainty.replace(c),
- None | Some(Certainty::Maybe { cause: MaybeCause::Ambiguity, .. })
+ None | Some(Certainty::Maybe(MaybeInfo {
+ cause: MaybeCause::Ambiguity,
+ ..
+ }))
));
}
inspect::ProbeStep::NestedProbe(ref probe) => {
diff --git a/crates/hir-ty/src/next_solver/interner.rs b/crates/hir-ty/src/next_solver/interner.rs
index fb9b608d31..d840024277 100644
--- a/crates/hir-ty/src/next_solver/interner.rs
+++ b/crates/hir-ty/src/next_solver/interner.rs
@@ -11,7 +11,8 @@ pub use tls_db::{attach_db, attach_db_allow_change, with_attached_db};
use base_db::Crate;
use hir_def::{
- AdtId, CallableDefId, EnumId, HasModule, ItemContainerId, StructId, UnionId, VariantId,
+ AdtId, CallableDefId, EnumId, HasModule, ItemContainerId, StructId, TraitId, TypeAliasId,
+ UnionId, VariantId,
attrs::AttrFlags,
expr_store::ExpressionStore,
hir::{ClosureKind as HirClosureKind, CoroutineKind as HirCoroutineKind, ExprId},
@@ -21,31 +22,35 @@ use hir_def::{
StructFlags, StructSignature, TraitFlags, TraitSignature, UnionSignature,
},
};
+use rustc_abi::ExternAbi;
use rustc_hash::FxHashSet;
use rustc_index::bit_set::DenseBitSet;
use rustc_type_ir::{
- AliasTermKind, AliasTy, AliasTyKind, BoundVar, CoroutineWitnessTypes, DebruijnIndex,
- EarlyBinder, FlagComputation, Flags, GenericArgKind, GenericTypeVisitable, ImplPolarity,
- InferTy, Interner, TraitRef, TypeFlags, TypeVisitableExt, Upcast, Variance,
+ AliasTy, BoundVar, CoroutineWitnessTypes, DebruijnIndex, EarlyBinder, FlagComputation, Flags,
+ FnSigKind, GenericArgKind, GenericTypeVisitable, ImplPolarity, InferTy, Interner, TraitRef,
+ TypeFlags, TypeVisitableExt, Upcast, Variance,
elaborate::elaborate,
error::TypeError,
fast_reject,
inherent::{self, Const as _, GenericsOf, IntoKind, SliceLike as _, Span as _, Ty as _},
- lang_items::{SolverAdtLangItem, SolverLangItem, SolverTraitLangItem},
+ lang_items::{SolverAdtLangItem, SolverProjectionLangItem, SolverTraitLangItem},
solve::{AdtDestructorKind, SizedTraitKind},
};
use crate::{
- FnAbi, InferBodyId, Span,
+ InferBodyId, Span,
db::{HirDatabase, InternedClosure, InternedCoroutineId},
lower::GenericPredicates,
method_resolution::TraitImpls,
next_solver::{
- AdtIdWrapper, AnyImplId, BoundConst, CallableIdWrapper, CanonicalVarKind, ClosureIdWrapper,
- Consts, CoroutineClosureIdWrapper, CoroutineIdWrapper, Ctor, FnSig, FxIndexMap,
- GeneralConstIdWrapper, LateParamRegion, OpaqueTypeKey, RegionAssumptions, ScalarInt,
- SimplifiedType, SolverContext, SolverDefIds, TraitIdWrapper, TypeAliasIdWrapper,
- UnevaluatedConst,
+ AdtIdWrapper, AliasTermKind, AliasTyKind, AnyImplId, BoundConst, CallableIdWrapper,
+ CanonicalVarKind, ClosureIdWrapper, Consts, CoroutineClosureIdWrapper, CoroutineIdWrapper,
+ Ctor, FnSig, FreeConstAliasId, FreeTermAliasId, FreeTyAliasId, FxIndexMap,
+ GeneralConstIdWrapper, ImplOrTraitAssocConstId, ImplOrTraitAssocTermId,
+ ImplOrTraitAssocTyId, InherentAssocConstId, InherentAssocTermId, InherentAssocTyId,
+ LateParamRegion, OpaqueTyIdWrapper, OpaqueTypeKey, RegionAssumptions, ScalarInt,
+ SimplifiedType, SolverContext, SolverDefIds, TermId, TraitAssocConstId, TraitAssocTermId,
+ TraitAssocTyId, TraitIdWrapper, TypeAliasIdWrapper, UnevaluatedConst, Unnormalized,
util::{explicit_item_bounds, explicit_item_self_bounds},
},
};
@@ -666,6 +671,10 @@ impl<'db> inherent::Features<DbInterner<'db>> for Features {
false
}
+ fn generic_const_args(self) -> bool {
+ false
+ }
+
fn feature_bound_holds_in_crate(self, _symbol: Symbol) -> bool {
false
}
@@ -837,11 +846,7 @@ impl_foldable_for_interned_slice!(PatList);
macro_rules! as_lang_item {
(
- $solver_enum:ident, $self:ident, $def_id:expr;
-
- ignore = {
- $( $ignore:ident ),* $(,)?
- }
+ $solver_enum:ident, $self:ident, $def_id:expr, $id_ty:ty;
$( $variant:ident ),* $(,)?
) => {{
@@ -850,11 +855,10 @@ macro_rules! as_lang_item {
if let Some(it) = None::<$solver_enum> {
match it {
$( $solver_enum::$variant => {} )*
- $( $solver_enum::$ignore => {} )*
}
}
match $def_id {
- $( def_id if lang_items.$variant.is_some_and(|it| it == def_id) => Some($solver_enum::$variant), )*
+ $( def_id if let Some(it) = lang_items.$variant && <$id_ty>::from(it) == def_id => Some($solver_enum::$variant), )*
_ => None
}
}};
@@ -864,17 +868,12 @@ macro_rules! is_lang_item {
(
$solver_enum:ident, $self:ident, $def_id:expr, $expected_variant:ident;
- ignore = {
- $( $ignore:ident ),* $(,)?
- }
-
$( $variant:ident ),* $(,)?
) => {{
let lang_items = $self.lang_items();
let def_id = $def_id;
match $expected_variant {
$( $solver_enum::$variant => lang_items.$variant.is_some_and(|it| it == def_id), )*
- $( $solver_enum::$ignore => false, )*
}
}};
}
@@ -892,6 +891,20 @@ impl<'db> Interner for DbInterner<'db> {
type AdtId = AdtIdWrapper;
type ImplId = AnyImplId;
type UnevaluatedConstId = GeneralConstIdWrapper;
+ type TraitAssocTyId = TraitAssocTyId;
+ type TraitAssocConstId = TraitAssocConstId;
+ type TraitAssocTermId = TraitAssocTermId;
+ type OpaqueTyId = OpaqueTyIdWrapper;
+ type LocalOpaqueTyId = OpaqueTyIdWrapper;
+ type FreeTyAliasId = FreeTyAliasId;
+ type FreeConstAliasId = FreeConstAliasId;
+ type FreeTermAliasId = FreeTermAliasId;
+ type ImplOrTraitAssocTyId = ImplOrTraitAssocTyId;
+ type ImplOrTraitAssocConstId = ImplOrTraitAssocConstId;
+ type ImplOrTraitAssocTermId = ImplOrTraitAssocTermId;
+ type InherentAssocTyId = InherentAssocTyId;
+ type InherentAssocConstId = InherentAssocConstId;
+ type InherentAssocTermId = InherentAssocTermId;
type Span = Span;
type GenericArgs = GenericArgs<'db>;
@@ -945,7 +958,6 @@ impl<'db> Interner for DbInterner<'db> {
type Pat = Pattern<'db>;
type PatList = PatList<'db>;
type Safety = Safety;
- type Abi = FnAbi;
type Const = Const<'db>;
type ParamConst = ParamConst;
@@ -1075,7 +1087,9 @@ impl<'db> Interner for DbInterner<'db> {
//
// We currently always use the type from HIR typeck which ignores regions. This
// should be fine.
- SolverDefId::InternedOpaqueTyId(_) => self.type_of_opaque_hir_typeck(def_id),
+ SolverDefId::InternedOpaqueTyId(def_id) => {
+ self.type_of_opaque_hir_typeck(def_id.into())
+ }
SolverDefId::FunctionId(id) => self.db.value_ty(id.into()).unwrap(),
SolverDefId::Ctor(id) => {
let id = match id {
@@ -1092,40 +1106,40 @@ impl<'db> Interner for DbInterner<'db> {
AdtDef::new(def_id.0, self)
}
- fn alias_term_kind(
- self,
- alias: rustc_type_ir::AliasTerm<Self>,
- ) -> rustc_type_ir::AliasTermKind {
- match alias.def_id {
- SolverDefId::InternedOpaqueTyId(_) => AliasTermKind::OpaqueTy,
+ fn alias_term_kind_from_def_id(self, def_id: SolverDefId) -> AliasTermKind<'db> {
+ match def_id {
+ SolverDefId::InternedOpaqueTyId(def_id) => {
+ AliasTermKind::OpaqueTy { def_id: def_id.into() }
+ }
SolverDefId::TypeAliasId(type_alias) => match type_alias.loc(self.db).container {
ItemContainerId::ImplId(impl_)
if ImplSignature::of(self.db, impl_).target_trait.is_none() =>
{
- AliasTermKind::InherentTy
+ AliasTermKind::InherentTy { def_id: type_alias.into() }
}
ItemContainerId::TraitId(_) | ItemContainerId::ImplId(_) => {
- AliasTermKind::ProjectionTy
+ AliasTermKind::ProjectionTy { def_id: type_alias.into() }
}
- _ => AliasTermKind::FreeTy,
+ _ => AliasTermKind::FreeTy { def_id: type_alias.into() },
},
// rustc creates an `AnonConst` for consts, and evaluates them with CTFE (normalizing projections
// via selection, similar to ours `find_matching_impl()`, and not with the trait solver), so mimic it.
- SolverDefId::ConstId(_) | SolverDefId::AnonConstId(_) => {
- AliasTermKind::UnevaluatedConst
+ SolverDefId::ConstId(def_id) => {
+ AliasTermKind::UnevaluatedConst { def_id: GeneralConstIdWrapper(def_id.into()) }
+ }
+ SolverDefId::AnonConstId(def_id) => {
+ AliasTermKind::UnevaluatedConst { def_id: GeneralConstIdWrapper(def_id.into()) }
}
- _ => unimplemented!("Unexpected alias: {:?}", alias.def_id),
+ _ => unimplemented!("Unexpected alias: {:?}", def_id),
}
}
fn trait_ref_and_own_args_for_alias(
self,
- def_id: Self::DefId,
+ def_id: Self::TraitAssocTermId,
args: Self::GenericArgs,
) -> (rustc_type_ir::TraitRef<Self>, Self::GenericArgsSlice) {
- let SolverDefId::TraitId(trait_def_id) = self.parent(def_id) else {
- panic!("expected a trait");
- };
+ let trait_def_id = self.projection_parent(def_id).0;
let trait_generics = crate::generics::generics(self.db, trait_def_id.into());
let trait_generics_len = trait_generics.len();
let trait_args = GenericArgs::new_from_slice(&args.as_slice()[..trait_generics_len]);
@@ -1155,37 +1169,43 @@ impl<'db> Interner for DbInterner<'db> {
Tys::new_from_iter(self, args)
}
- fn parent(self, def_id: Self::DefId) -> Self::DefId {
- use hir_def::Lookup;
+ fn projection_parent(self, def_id: Self::TraitAssocTermId) -> Self::TraitId {
+ let container = match def_id.0 {
+ TermId::TypeAliasId(def_id) => def_id.loc(self.db).container,
+ TermId::ConstId(def_id) => def_id.loc(self.db).container,
+ };
+ let ItemContainerId::TraitId(trait_) = container else {
+ panic!("a TraitAssocTermId can only come from a trait")
+ };
+ trait_.into()
+ }
- let container = match def_id {
- SolverDefId::FunctionId(it) => it.lookup(self.db()).container,
- SolverDefId::TypeAliasId(it) => it.lookup(self.db()).container,
- SolverDefId::ConstId(it) => it.lookup(self.db()).container,
- SolverDefId::InternedClosureId(it) => {
- return it.loc(self.db).owner.into();
- }
- SolverDefId::InternedCoroutineId(it) => {
- return it.loc(self.db).owner.into();
- }
- SolverDefId::InternedCoroutineClosureId(it) => {
- return it.loc(self.db).owner.into();
- }
- SolverDefId::AnonConstId(it) => return it.loc(self.db).owner.into(),
- SolverDefId::StaticId(_)
- | SolverDefId::AdtId(_)
- | SolverDefId::TraitId(_)
- | SolverDefId::ImplId(_)
- | SolverDefId::BuiltinDeriveImplId(_)
- | SolverDefId::EnumVariantId(..)
- | SolverDefId::Ctor(..)
- | SolverDefId::InternedOpaqueTyId(..) => panic!(),
+ fn impl_or_trait_assoc_term_parent(self, def_id: Self::ImplOrTraitAssocTermId) -> Self::DefId {
+ let container = match def_id.0 {
+ TermId::TypeAliasId(def_id) => def_id.loc(self.db).container,
+ TermId::ConstId(def_id) => def_id.loc(self.db).container,
};
+ match container {
+ ItemContainerId::ImplId(impl_) => impl_.into(),
+ ItemContainerId::TraitId(trait_) => trait_.into(),
+ ItemContainerId::ExternBlockId(_) | ItemContainerId::ModuleId(_) => {
+ panic!("only impl or trait can be the parent of ImplOrTraitAssocTermId")
+ }
+ }
+ }
+ fn inherent_alias_term_parent(self, def_id: Self::InherentAssocTermId) -> Self::ImplId {
+ let container = match def_id.0 {
+ TermId::TypeAliasId(def_id) => def_id.loc(self.db).container,
+ TermId::ConstId(def_id) => def_id.loc(self.db).container,
+ };
match container {
- ItemContainerId::ImplId(it) => it.into(),
- ItemContainerId::TraitId(it) => it.into(),
- ItemContainerId::ModuleId(_) | ItemContainerId::ExternBlockId(_) => panic!(),
+ ItemContainerId::ImplId(impl_) => impl_.into(),
+ ItemContainerId::ExternBlockId(_)
+ | ItemContainerId::ModuleId(_)
+ | ItemContainerId::TraitId(_) => {
+ panic!("only impl can be the parent of InherentAliasTermId")
+ }
}
}
@@ -1193,6 +1213,10 @@ impl<'db> Interner for DbInterner<'db> {
50
}
+ fn is_type_const(self, _def_id: Self::DefId) -> bool {
+ false
+ }
+
fn features(self) -> Features {
Features
}
@@ -1245,22 +1269,24 @@ impl<'db> Interner for DbInterner<'db> {
// Search for a predicate like `Self : Sized` amongst the trait bounds.
let predicates = self.predicates_of(def_id);
- elaborate(self, predicates.iter_identity()).any(|pred| match pred.kind().skip_binder() {
- ClauseKind::Trait(ref trait_pred) => {
- trait_pred.def_id() == sized_def_id
- && matches!(
- trait_pred.self_ty().kind(),
- TyKind::Param(ParamTy { index: 0, .. })
- )
+ elaborate(self, predicates.iter_identity().map(Unnormalized::skip_norm_wip)).any(|pred| {
+ match pred.kind().skip_binder() {
+ ClauseKind::Trait(ref trait_pred) => {
+ trait_pred.def_id() == sized_def_id
+ && matches!(
+ trait_pred.self_ty().kind(),
+ TyKind::Param(ParamTy { index: 0, .. })
+ )
+ }
+ ClauseKind::RegionOutlives(_)
+ | ClauseKind::TypeOutlives(_)
+ | ClauseKind::Projection(_)
+ | ClauseKind::ConstArgHasType(_, _)
+ | ClauseKind::WellFormed(_)
+ | ClauseKind::ConstEvaluatable(_)
+ | ClauseKind::HostEffect(..)
+ | ClauseKind::UnstableFeature(_) => false,
}
- ClauseKind::RegionOutlives(_)
- | ClauseKind::TypeOutlives(_)
- | ClauseKind::Projection(_)
- | ClauseKind::ConstArgHasType(_, _)
- | ClauseKind::WellFormed(_)
- | ClauseKind::ConstEvaluatable(_)
- | ClauseKind::HostEffect(..)
- | ClauseKind::UnstableFeature(_) => false,
})
}
@@ -1382,22 +1408,22 @@ impl<'db> Interner for DbInterner<'db> {
false
}
- fn require_lang_item(self, lang_item: SolverLangItem) -> Self::DefId {
+ fn require_projection_lang_item(
+ self,
+ lang_item: SolverProjectionLangItem,
+ ) -> Self::TraitAssocTyId {
let lang_items = self.lang_items();
let lang_item = match lang_item {
- SolverLangItem::AsyncFnKindUpvars => lang_items.AsyncFnKindUpvars,
- SolverLangItem::AsyncFnOnceOutput => lang_items.AsyncFnOnceOutput,
- SolverLangItem::CallOnceFuture => lang_items.CallOnceFuture,
- SolverLangItem::CallRefFuture => lang_items.CallRefFuture,
- SolverLangItem::CoroutineReturn => lang_items.CoroutineReturn,
- SolverLangItem::CoroutineYield => lang_items.CoroutineYield,
- SolverLangItem::FutureOutput => lang_items.FutureOutput,
- SolverLangItem::Metadata => lang_items.Metadata,
- SolverLangItem::DynMetadata => {
- return lang_items.DynMetadata.expect("Lang item required but not found.").into();
- }
- SolverLangItem::FieldBase => lang_items.FieldBase,
- SolverLangItem::FieldType => lang_items.FieldType,
+ SolverProjectionLangItem::AsyncFnKindUpvars => lang_items.AsyncFnKindUpvars,
+ SolverProjectionLangItem::AsyncFnOnceOutput => lang_items.AsyncFnOnceOutput,
+ SolverProjectionLangItem::CallOnceFuture => lang_items.CallOnceFuture,
+ SolverProjectionLangItem::CallRefFuture => lang_items.CallRefFuture,
+ SolverProjectionLangItem::CoroutineReturn => lang_items.CoroutineReturn,
+ SolverProjectionLangItem::CoroutineYield => lang_items.CoroutineYield,
+ SolverProjectionLangItem::FutureOutput => lang_items.FutureOutput,
+ SolverProjectionLangItem::Metadata => lang_items.Metadata,
+ SolverProjectionLangItem::FieldBase => lang_items.FieldBase,
+ SolverProjectionLangItem::FieldType => lang_items.FieldType,
};
lang_item.expect("Lang item required but not found.").into()
}
@@ -1409,9 +1435,6 @@ impl<'db> Interner for DbInterner<'db> {
SolverTraitLangItem::AsyncFnKindHelper => lang_items.AsyncFnKindHelper,
SolverTraitLangItem::AsyncFnMut => lang_items.AsyncFnMut,
SolverTraitLangItem::AsyncFnOnce => lang_items.AsyncFnOnce,
- SolverTraitLangItem::AsyncFnOnceOutput => unimplemented!(
- "This is incorrectly marked as `SolverTraitLangItem`, and is not used by the solver."
- ),
SolverTraitLangItem::AsyncIterator => lang_items.AsyncIterator,
SolverTraitLangItem::Clone => lang_items.Clone,
SolverTraitLangItem::Copy => lang_items.Copy,
@@ -1444,14 +1467,19 @@ impl<'db> Interner for DbInterner<'db> {
fn require_adt_lang_item(self, lang_item: SolverAdtLangItem) -> AdtIdWrapper {
let lang_items = self.lang_items();
let lang_item = match lang_item {
- SolverAdtLangItem::Option => lang_items.Option,
- SolverAdtLangItem::Poll => lang_items.Poll,
+ SolverAdtLangItem::Option => lang_items.Option.map(Into::into),
+ SolverAdtLangItem::Poll => lang_items.Poll.map(Into::into),
+ SolverAdtLangItem::DynMetadata => lang_items.DynMetadata.map(Into::into),
};
- AdtIdWrapper(lang_item.expect("Lang item required but not found.").into())
+ AdtIdWrapper(lang_item.expect("Lang item required but not found."))
}
- fn is_lang_item(self, def_id: Self::DefId, lang_item: SolverLangItem) -> bool {
- self.as_lang_item(def_id)
+ fn is_projection_lang_item(
+ self,
+ def_id: Self::TraitAssocTyId,
+ lang_item: SolverProjectionLangItem,
+ ) -> bool {
+ self.as_projection_lang_item(def_id)
.map_or(false, |l| std::mem::discriminant(&l) == std::mem::discriminant(&lang_item))
}
@@ -1459,10 +1487,6 @@ impl<'db> Interner for DbInterner<'db> {
is_lang_item!(
SolverTraitLangItem, self, def_id.0, lang_item;
- ignore = {
- AsyncFnOnceOutput, // This is incorrectly marked as `SolverTraitLangItem`, and is not used by the solver.
- }
-
Sized,
MetaSized,
PointeeSized,
@@ -1483,12 +1507,12 @@ impl<'db> Interner for DbInterner<'db> {
Unpin,
Tuple,
Iterator,
- AsyncIterator,
AsyncFn,
AsyncFnMut,
AsyncFnOnce,
TrivialClone,
AsyncFnKindHelper,
+ AsyncIterator,
BikeshedGuaranteedNoDrop,
FusedIterator,
Field,
@@ -1501,59 +1525,29 @@ impl<'db> Interner for DbInterner<'db> {
.map_or(false, |l| std::mem::discriminant(&l) == std::mem::discriminant(&lang_item))
}
- fn as_lang_item(self, def_id: Self::DefId) -> Option<SolverLangItem> {
- match def_id {
- SolverDefId::TypeAliasId(id) => {
- as_lang_item!(
- SolverLangItem, self, id;
-
- ignore = {
- DynMetadata,
- }
-
- Metadata,
- CoroutineReturn,
- CoroutineYield,
- FutureOutput,
- CallRefFuture,
- CallOnceFuture,
- AsyncFnOnceOutput,
- AsyncFnKindUpvars,
- FieldBase,
- FieldType,
- )
- }
- SolverDefId::AdtId(AdtId::StructId(id)) => {
- as_lang_item!(
- SolverLangItem, self, id;
-
- ignore = {
- AsyncFnKindUpvars,
- Metadata,
- CoroutineReturn,
- CoroutineYield,
- FutureOutput,
- CallRefFuture,
- CallOnceFuture,
- AsyncFnOnceOutput,
- FieldBase,
- FieldType,
- }
-
- DynMetadata,
- )
- }
- _ => panic!("Unexpected SolverDefId in as_lang_item"),
- }
+ fn as_projection_lang_item(
+ self,
+ def_id: Self::TraitAssocTyId,
+ ) -> Option<SolverProjectionLangItem> {
+ as_lang_item!(
+ SolverProjectionLangItem, self, def_id.0, TypeAliasId;
+
+ Metadata,
+ CoroutineReturn,
+ CoroutineYield,
+ FutureOutput,
+ CallRefFuture,
+ CallOnceFuture,
+ AsyncFnOnceOutput,
+ AsyncFnKindUpvars,
+ FieldBase,
+ FieldType,
+ )
}
fn as_trait_lang_item(self, def_id: Self::TraitId) -> Option<SolverTraitLangItem> {
as_lang_item!(
- SolverTraitLangItem, self, def_id.0;
-
- ignore = {
- AsyncFnOnceOutput, // This is incorrectly marked as `SolverTraitLangItem`, and is not used by the solver.
- }
+ SolverTraitLangItem, self, def_id.0, TraitId;
Sized,
MetaSized,
@@ -1575,12 +1569,12 @@ impl<'db> Interner for DbInterner<'db> {
Unpin,
Tuple,
Iterator,
- AsyncIterator,
AsyncFn,
AsyncFnMut,
AsyncFnOnce,
TrivialClone,
AsyncFnKindHelper,
+ AsyncIterator,
BikeshedGuaranteedNoDrop,
FusedIterator,
Field,
@@ -1588,16 +1582,12 @@ impl<'db> Interner for DbInterner<'db> {
}
fn as_adt_lang_item(self, def_id: Self::AdtId) -> Option<SolverAdtLangItem> {
- let AdtId::EnumId(def_id) = def_id.0 else {
- panic!("Unexpected SolverDefId in as_adt_lang_item");
- };
as_lang_item!(
- SolverAdtLangItem, self, def_id;
-
- ignore = {}
+ SolverAdtLangItem, self, def_id.0, AdtId;
Option,
Poll,
+ DynMetadata,
)
}
@@ -1766,7 +1756,7 @@ impl<'db> Interner for DbInterner<'db> {
});
}
- fn has_item_definition(self, _def_id: Self::DefId) -> bool {
+ fn has_item_definition(self, _def_id: Self::ImplOrTraitAssocTermId) -> bool {
// FIXME(next-solver): should check if the associated item has a value.
true
}
@@ -1892,7 +1882,7 @@ impl<'db> Interner for DbInterner<'db> {
let field_types = self.db().field_types(variant);
let mut unsizing_params = DenseBitSet::new_empty(num_params);
let ty = field_types[tail_field.0].get();
- for arg in ty.instantiate_identity().walk() {
+ for arg in ty.instantiate_identity().skip_norm_wip().walk() {
if let Some(i) = maybe_unsizing_param_idx(arg) {
unsizing_params.insert(i);
}
@@ -1901,7 +1891,7 @@ impl<'db> Interner for DbInterner<'db> {
// Ensure none of the other fields mention the parameters used
// in unsizing.
for field in prefix_fields {
- for arg in field_types[field.0].get().instantiate_identity().walk() {
+ for arg in field_types[field.0].get().instantiate_identity().skip_norm_wip().walk() {
if let Some(i) = maybe_unsizing_param_idx(arg) {
unsizing_params.remove(i);
}
@@ -2044,26 +2034,23 @@ impl<'db> Interner for DbInterner<'db> {
fn opt_alias_variances(
self,
- _kind: impl Into<rustc_type_ir::AliasTermKind>,
- _def_id: Self::DefId,
+ _kind: impl Into<AliasTermKind<'db>>,
) -> Option<Self::VariancesOf> {
None
}
- fn type_of_opaque_hir_typeck(self, def_id: Self::LocalDefId) -> EarlyBinder<Self, Self::Ty> {
- match def_id {
- SolverDefId::InternedOpaqueTyId(opaque) => {
- let impl_trait_id = self.db().lookup_intern_impl_trait_id(opaque);
- match impl_trait_id {
- crate::ImplTraitId::ReturnTypeImplTrait(func, idx) => {
- crate::opaques::rpit_hidden_types(self.db, func)[idx].get()
- }
- crate::ImplTraitId::TypeAliasImplTrait(type_alias, idx) => {
- crate::opaques::tait_hidden_types(self.db, type_alias)[idx].get()
- }
- }
+ fn type_of_opaque_hir_typeck(
+ self,
+ opaque: Self::LocalOpaqueTyId,
+ ) -> EarlyBinder<Self, Self::Ty> {
+ let impl_trait_id = self.db().lookup_intern_impl_trait_id(opaque.0);
+ match impl_trait_id {
+ crate::ImplTraitId::ReturnTypeImplTrait(func, idx) => {
+ crate::opaques::rpit_hidden_types(self.db, func)[idx].get()
+ }
+ crate::ImplTraitId::TypeAliasImplTrait(type_alias, idx) => {
+ crate::opaques::tait_hidden_types(self.db, type_alias)[idx].get()
}
- _ => panic!("Unexpected SolverDefId in type_of_opaque_hir_typeck"),
}
}
@@ -2150,16 +2137,20 @@ impl<'db> Interner for DbInterner<'db> {
rustc_type_ir::AnonConstKind::GCE
}
- fn alias_ty_kind_from_def_id(self, def_id: Self::DefId) -> AliasTyKind<DbInterner<'db>> {
+ fn alias_ty_kind_from_def_id(self, def_id: Self::DefId) -> AliasTyKind<'db> {
match def_id {
SolverDefId::TypeAliasId(type_alias) => match type_alias.loc(self.db).container {
ItemContainerId::ExternBlockId(_) | ItemContainerId::ModuleId(_) => {
- AliasTyKind::Free { def_id }
+ AliasTyKind::Free { def_id: type_alias.into() }
+ }
+ ItemContainerId::ImplId(_) => AliasTyKind::Inherent { def_id: type_alias.into() },
+ ItemContainerId::TraitId(_) => {
+ AliasTyKind::Projection { def_id: type_alias.into() }
}
- ItemContainerId::ImplId(_) => AliasTyKind::Inherent { def_id },
- ItemContainerId::TraitId(_) => AliasTyKind::Projection { def_id },
},
- SolverDefId::InternedOpaqueTyId(_) => AliasTyKind::Opaque { def_id },
+ SolverDefId::InternedOpaqueTyId(def_id) => {
+ AliasTyKind::Opaque { def_id: def_id.into() }
+ }
_ => unreachable!(),
}
}
@@ -2249,7 +2240,7 @@ impl<'db> DbInterner<'db> {
output: Ty<'db>,
c_variadic: bool,
safety: Safety,
- abi: FnAbi,
+ abi: ExternAbi,
) -> FnSig<'db>
where
I: IntoIterator<Item = Ty<'db>>,
@@ -2259,9 +2250,7 @@ impl<'db> DbInterner<'db> {
self,
inputs.into_iter().chain(std::iter::once(output)),
),
- c_variadic,
- safety,
- abi,
+ fn_sig_kind: FnSigKind::new(abi, safety, c_variadic),
}
}
@@ -2270,15 +2259,7 @@ impl<'db> DbInterner<'db> {
where
I: IntoIterator<Item = Ty<'db>>,
{
- FnSig {
- inputs_and_output: Tys::new_from_iter(
- self,
- inputs.into_iter().chain(std::iter::once(output)),
- ),
- c_variadic: false,
- safety: Safety::Safe,
- abi: FnAbi::Rust,
- }
+ self.mk_fn_sig(inputs, output, false, Safety::Safe, ExternAbi::Rust)
}
}
@@ -2345,10 +2326,22 @@ TrivialTypeTraversalImpls! {
CoroutineIdWrapper,
CoroutineClosureIdWrapper,
AdtIdWrapper,
+ TraitAssocTyId,
+ TraitAssocConstId,
+ TraitAssocTermId,
+ ImplOrTraitAssocTyId,
+ ImplOrTraitAssocConstId,
+ ImplOrTraitAssocTermId,
+ FreeTyAliasId,
+ FreeConstAliasId,
+ FreeTermAliasId,
+ InherentAssocTyId,
+ InherentAssocConstId,
+ InherentAssocTermId,
+ OpaqueTyIdWrapper,
AnyImplId,
GeneralConstIdWrapper,
Safety,
- FnAbi,
Span,
ParamConst,
ParamTy,
diff --git a/crates/hir-ty/src/next_solver/ir_print.rs b/crates/hir-ty/src/next_solver/ir_print.rs
index 5dd372a367..925640e1f6 100644
--- a/crates/hir-ty/src/next_solver/ir_print.rs
+++ b/crates/hir-ty/src/next_solver/ir_print.rs
@@ -3,6 +3,8 @@
use hir_def::signatures::{TraitSignature, TypeAliasSignature};
use rustc_type_ir::{self as ty, ir_print::IrPrint};
+use crate::next_solver::TermId;
+
use super::SolverDefId;
use super::interner::DbInterner;
@@ -32,7 +34,7 @@ impl<'db> IrPrint<ty::AliasTerm<Self>> for DbInterner<'db> {
}
fn print_debug(t: &ty::AliasTerm<Self>, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- crate::with_attached_db(|db| match t.def_id {
+ crate::with_attached_db(|db| match t.def_id() {
SolverDefId::TypeAliasId(id) => fmt.write_str(&format!(
"AliasTerm({:?}[{:?}])",
TypeAliasSignature::of(db, id).name.as_str(),
@@ -141,8 +143,8 @@ impl<'db> IrPrint<ty::ExistentialProjection<Self>> for DbInterner<'db> {
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
crate::with_attached_db(|db| {
- let id = match t.def_id {
- SolverDefId::TypeAliasId(id) => id,
+ let id = match t.def_id.0 {
+ TermId::TypeAliasId(id) => id,
_ => panic!("Expected trait."),
};
fmt.write_str(&format!(
@@ -167,7 +169,7 @@ impl<'db> IrPrint<ty::ProjectionPredicate<Self>> for DbInterner<'db> {
fmt: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
crate::with_attached_db(|db| {
- let id = match t.projection_term.def_id {
+ let id = match t.projection_term.def_id() {
SolverDefId::TypeAliasId(id) => id,
_ => panic!("Expected trait."),
};
diff --git a/crates/hir-ty/src/next_solver/predicate.rs b/crates/hir-ty/src/next_solver/predicate.rs
index e16428cd2e..30738dea5c 100644
--- a/crates/hir-ty/src/next_solver/predicate.rs
+++ b/crates/hir-ty/src/next_solver/predicate.rs
@@ -885,7 +885,9 @@ impl<'db> rustc_type_ir::inherent::Clause<DbInterner<'db>> for Clause<'db> {
let shifted_pred =
cx.shift_bound_var_indices(trait_bound_vars.len(), bound_pred.skip_binder());
// 2) Self: Bar1<'a, '^0.1> -> T: Bar1<'^0.0, '^0.1>
- let new = EarlyBinder::bind(shifted_pred).instantiate(cx, trait_ref.skip_binder().args);
+ let new = EarlyBinder::bind(shifted_pred)
+ .instantiate(cx, trait_ref.skip_binder().args)
+ .skip_norm_wip();
// 3) ['x] + ['b] -> ['x, 'b]
let bound_vars =
BoundVarKinds::new_from_iter(cx, trait_bound_vars.iter().chain(pred_bound_vars.iter()));
diff --git a/crates/hir-ty/src/next_solver/region.rs b/crates/hir-ty/src/next_solver/region.rs
index 7acbcbf4aa..72a25f4df6 100644
--- a/crates/hir-ty/src/next_solver/region.rs
+++ b/crates/hir-ty/src/next_solver/region.rs
@@ -18,6 +18,7 @@ use crate::next_solver::{
use super::{SolverDefId, interner::DbInterner};
pub type RegionKind<'db> = rustc_type_ir::RegionKind<DbInterner<'db>>;
+pub type RegionConstraint<'db> = rustc_type_ir::RegionConstraint<DbInterner<'db>>;
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct Region<'db> {
diff --git a/crates/hir-ty/src/next_solver/solver.rs b/crates/hir-ty/src/next_solver/solver.rs
index ecfc1c21b7..b1b3a0e0dc 100644
--- a/crates/hir-ty/src/next_solver/solver.rs
+++ b/crates/hir-ty/src/next_solver/solver.rs
@@ -10,7 +10,7 @@ use rustc_type_ir::{
TypeVisitableExt,
inherent::{IntoKind, Term as _, Ty as _},
lang_items::SolverTraitLangItem,
- solve::{Certainty, NoSolution},
+ solve::{Certainty, FetchEligibleAssocItemResponse, NoSolution, VisibleForLeakCheck},
};
use tracing::debug;
@@ -18,14 +18,15 @@ use crate::{
ParamEnvAndCrate, Span,
db::GeneralConstId,
next_solver::{
- AliasTy, AnyImplId, CanonicalVarKind, Clause, ClauseKind, CoercePredicate, GenericArgs,
- ParamEnv, Predicate, PredicateKind, SubtypePredicate, Ty, TyKind, UnevaluatedConst,
- fold::fold_tys, util::sizedness_fast_path,
+ AliasTy, AnyImplId, CanonicalVarKind, Clause, ClauseKind, CoercePredicate, ErrorGuaranteed,
+ GenericArgs, ImplOrTraitAssocTermId, OpaqueTyIdWrapper, ParamEnv, Predicate, PredicateKind,
+ RegionConstraint, SubtypePredicate, TermId, TraitAssocTermId, Ty, TyKind, TypingMode,
+ UnevaluatedConst, fold::fold_tys, util::sizedness_fast_path,
},
};
use super::{
- Const, DbInterner, ErrorGuaranteed, GenericArg, SolverDefId,
+ Const, DbInterner, GenericArg,
infer::{DbInternerInferExt, InferCtxt, canonical::instantiate::CanonicalExt},
};
@@ -99,14 +100,9 @@ impl<'db> SolverDelegate for SolverContext<'db> {
None
}
- fn make_deduplicated_outlives_constraints(
+ fn make_deduplicated_region_constraints(
&self,
- ) -> Vec<
- rustc_type_ir::OutlivesPredicate<
- Self::Interner,
- <Self::Interner as rustc_type_ir::Interner>::GenericArg,
- >,
- > {
+ ) -> Vec<(RegionConstraint<'db>, VisibleForLeakCheck)> {
// FIXME: add if we care about regions
vec![]
}
@@ -134,14 +130,13 @@ impl<'db> SolverDelegate for SolverContext<'db> {
fn add_item_bounds_for_hidden_type(
&self,
- def_id: SolverDefId,
+ opaque_id: OpaqueTyIdWrapper,
args: GenericArgs<'db>,
param_env: ParamEnv<'db>,
hidden_ty: Ty<'db>,
goals: &mut Vec<Goal<'db, Predicate<'db>>>,
) {
let interner = self.interner;
- let opaque_id = def_id.expect_opaque_ty();
// Require that the hidden type is well-formed. We have to
// make sure we wf-check the hidden type to fix #114728.
//
@@ -163,14 +158,14 @@ impl<'db> SolverDelegate for SolverContext<'db> {
kind: AliasTyKind::Opaque { def_id: def_id2 },
args: args2,
..
- }) if def_id == def_id2 && args == args2 => hidden_ty,
+ }) if opaque_id == def_id2 && args == args2 => hidden_ty,
_ => ty,
})
};
- let item_bounds = opaque_id.predicates(interner.db);
+ let item_bounds = opaque_id.0.predicates(interner.db);
for predicate in item_bounds.iter_instantiated_copied(interner, args.as_slice()) {
- let predicate = replace_opaques_in(predicate);
+ let predicate = replace_opaques_in(predicate.skip_norm_wip());
// Require that the predicate holds for the concrete type.
debug!(?predicate);
@@ -181,16 +176,16 @@ impl<'db> SolverDelegate for SolverContext<'db> {
fn fetch_eligible_assoc_item(
&self,
_goal_trait_ref: rustc_type_ir::TraitRef<Self::Interner>,
- trait_assoc_def_id: SolverDefId,
+ trait_assoc_def_id: TraitAssocTermId,
impl_id: AnyImplId,
- ) -> Result<Option<SolverDefId>, ErrorGuaranteed> {
+ ) -> FetchEligibleAssocItemResponse<Self::Interner> {
let AnyImplId::ImplId(impl_id) = impl_id else {
// Builtin derive traits don't have type/consts assoc items.
- return Ok(None);
+ return FetchEligibleAssocItemResponse::Err(ErrorGuaranteed);
};
let impl_items = impl_id.impl_items(self.0.interner.db());
- let id = match trait_assoc_def_id {
- SolverDefId::TypeAliasId(trait_assoc_id) => {
+ let id = match trait_assoc_def_id.0 {
+ TermId::TypeAliasId(trait_assoc_id) => {
let trait_assoc_data = TypeAliasSignature::of(self.0.interner.db, trait_assoc_id);
impl_items
.items
@@ -207,9 +202,9 @@ impl<'db> SolverDelegate for SolverContext<'db> {
.or_else(|| {
if trait_assoc_data.ty.is_some() { Some(trait_assoc_id) } else { None }
})
- .map(SolverDefId::TypeAliasId)
+ .map(|def| ImplOrTraitAssocTermId(TermId::TypeAliasId(def)))
}
- SolverDefId::ConstId(trait_assoc_id) => {
+ TermId::ConstId(trait_assoc_id) => {
let trait_assoc_data = ConstSignature::of(self.0.interner.db, trait_assoc_id);
let trait_assoc_name = trait_assoc_data
.name
@@ -232,11 +227,20 @@ impl<'db> SolverDelegate for SolverContext<'db> {
if trait_assoc_data.has_body() { Some(trait_assoc_id) } else { None }
},
)
- .map(SolverDefId::ConstId)
+ .map(|def| ImplOrTraitAssocTermId(TermId::ConstId(def)))
}
- _ => panic!("Unexpected SolverDefId"),
};
- Ok(id)
+ match id {
+ Some(id) => FetchEligibleAssocItemResponse::Found(id),
+ None => match self.typing_mode_raw() {
+ TypingMode::ErasedNotCoherence(_) => {
+ FetchEligibleAssocItemResponse::NotFoundBecauseErased
+ }
+ typing_mode => {
+ FetchEligibleAssocItemResponse::NotFound(typing_mode.assert_not_erased())
+ }
+ },
+ }
}
fn is_transmutable(
diff --git a/crates/hir-ty/src/next_solver/structural_normalize.rs b/crates/hir-ty/src/next_solver/structural_normalize.rs
index 769d2ae141..0dbd97a636 100644
--- a/crates/hir-ty/src/next_solver/structural_normalize.rs
+++ b/crates/hir-ty/src/next_solver/structural_normalize.rs
@@ -30,7 +30,7 @@ impl<'db> At<'_, 'db> {
) -> Result<Term<'db>, Vec<NextSolverError<'db>>> {
assert!(!term.is_infer(), "should have resolved vars before calling");
- if term.to_alias_term().is_none() {
+ if term.to_alias_term(self.infcx.interner).is_none() {
return Ok(term);
}
diff --git a/crates/hir-ty/src/next_solver/ty.rs b/crates/hir-ty/src/next_solver/ty.rs
index 46bfd1cc4a..c43e04b9d0 100644
--- a/crates/hir-ty/src/next_solver/ty.rs
+++ b/crates/hir-ty/src/next_solver/ty.rs
@@ -9,11 +9,11 @@ use hir_def::{
use hir_def::{TraitId, type_ref::Rawness};
use intern::{Interned, InternedRef, impl_internable};
use macros::GenericTypeVisitable;
-use rustc_abi::{Float, Integer, Size};
+use rustc_abi::{ExternAbi, Float, Integer, Size};
use rustc_ast_ir::{Mutability, try_visit, visit::VisitorResult};
use rustc_type_ir::{
- AliasTyKind, BoundVar, BoundVarIndexKind, ClosureKind, DebruijnIndex, FlagComputation, Flags,
- FloatTy, FloatVid, GenericTypeVisitable, InferTy, IntTy, IntVid, Interner, TyVid, TypeFoldable,
+ BoundVar, BoundVarIndexKind, ClosureKind, DebruijnIndex, FlagComputation, Flags, FloatTy,
+ FloatVid, GenericTypeVisitable, InferTy, IntTy, IntVid, Interner, TyVid, TypeFoldable,
TypeSuperFoldable, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, UintTy,
Upcast, WithCachedTypeInfo,
inherent::{
@@ -26,13 +26,12 @@ use rustc_type_ir::{
};
use crate::{
- FnAbi,
- db::HirDatabase,
+ db::{HirDatabase, InternedOpaqueTyId},
lower::GenericPredicates,
next_solver::{
AdtDef, AliasTy, Binder, CallableIdWrapper, Clause, ClauseKind, ClosureIdWrapper, Const,
CoroutineClosureIdWrapper, CoroutineIdWrapper, FnSig, GenericArgKind, PolyFnSig, Predicate,
- Region, TraitRef, TypeAliasIdWrapper,
+ Region, TraitRef, TypeAliasIdWrapper, Unnormalized,
abi::Safety,
impl_foldable_for_interned_slice, impl_stored_interned, interned_slice,
util::{CoroutineArgsExt, IntegerTypeExt},
@@ -47,6 +46,9 @@ use super::{
pub type SimplifiedType = rustc_type_ir::fast_reject::SimplifiedType<SolverDefId>;
pub type TyKind<'db> = rustc_type_ir::TyKind<DbInterner<'db>>;
pub type FnHeader<'db> = rustc_type_ir::FnHeader<DbInterner<'db>>;
+pub type AliasTyKind<'db> = rustc_type_ir::AliasTyKind<DbInterner<'db>>;
+pub type AliasTermKind<'db> = rustc_type_ir::AliasTermKind<DbInterner<'db>>;
+pub type FnSigKind<'db> = rustc_type_ir::FnSigKind<DbInterner<'db>>;
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct Ty<'db> {
@@ -174,12 +176,12 @@ impl<'db> Ty<'db> {
pub fn new_opaque(
interner: DbInterner<'db>,
- def_id: SolverDefId,
+ def_id: InternedOpaqueTyId,
args: GenericArgs<'db>,
) -> Self {
Ty::new_alias(
interner,
- AliasTy::new_from_args(interner, AliasTyKind::Opaque { def_id }, args),
+ AliasTy::new_from_args(interner, AliasTyKind::Opaque { def_id: def_id.into() }, args),
)
}
@@ -281,9 +283,9 @@ impl<'db> Ty<'db> {
tys.last().is_none_or(|ty| ty.has_trivial_sizedness(tcx, sizedness))
}
- TyKind::Adt(def, args) => def
- .sizedness_constraint(tcx, sizedness)
- .is_none_or(|ty| ty.instantiate(tcx, args).has_trivial_sizedness(tcx, sizedness)),
+ TyKind::Adt(def, args) => def.sizedness_constraint(tcx, sizedness).is_none_or(|ty| {
+ ty.instantiate(tcx, args).skip_norm_wip().has_trivial_sizedness(tcx, sizedness)
+ }),
TyKind::Alias(..) | TyKind::Param(_) | TyKind::Placeholder(..) | TyKind::Bound(..) => {
false
@@ -534,7 +536,7 @@ impl<'db> Ty<'db> {
/// unsafe.
pub fn safe_to_unsafe_fn_ty(interner: DbInterner<'db>, sig: PolyFnSig<'db>) -> Ty<'db> {
assert!(sig.safety().is_safe());
- Ty::new_fn_ptr(interner, sig.map_bound(|sig| FnSig { safety: Safety::Unsafe, ..sig }))
+ Ty::new_fn_ptr(interner, sig.map_bound(|sig| sig.set_safety(Safety::Unsafe)))
}
/// Returns the type of `*ty`.
@@ -571,7 +573,7 @@ impl<'db> Ty<'db> {
pub fn callable_sig(self, interner: DbInterner<'db>) -> Option<Binder<'db, FnSig<'db>>> {
match self.kind() {
TyKind::FnDef(callable, args) => {
- Some(interner.fn_sig(callable).instantiate(interner, args))
+ Some(interner.fn_sig(callable).instantiate(interner, args).skip_norm_wip())
}
TyKind::FnPtr(sig, hdr) => Some(sig.with(hdr)),
TyKind::Closure(_, closure_args) => {
@@ -595,9 +597,7 @@ impl<'db> Ty<'db> {
.iter()
.chain(std::iter::once(return_ty)),
),
- c_variadic: sig.c_variadic,
- safety: sig.safety,
- abi: sig.abi,
+ fn_sig_kind: sig.fn_sig_kind,
}
}))
}
@@ -731,9 +731,10 @@ impl<'db> Ty<'db> {
match self.kind() {
TyKind::Alias(AliasTy { kind: AliasTyKind::Opaque { def_id }, args, .. }) => Some(
def_id
- .expect_opaque_ty()
+ .0
.predicates(db)
.iter_instantiated_copied(interner, args.as_slice())
+ .map(Unnormalized::skip_norm_wip)
.collect(),
),
TyKind::Param(param) => {
@@ -745,6 +746,7 @@ impl<'db> Ty<'db> {
TypeParamProvenance::ArgumentImplTrait => {
let predicates = GenericPredicates::query_all(db, param.id.parent())
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.filter(|wc| match wc.kind().skip_binder() {
ClauseKind::Trait(tr) => tr.self_ty() == self,
ClauseKind::Projection(pred) => pred.self_ty() == self,
@@ -1502,7 +1504,7 @@ impl<'db> DbInterner<'db> {
TyKind::Tuple(params) => params,
_ => panic!(),
};
- self.mk_fn_sig(params, s.output(), s.c_variadic, safety, FnAbi::Rust)
+ self.mk_fn_sig(params, s.output(), s.c_variadic(), safety, ExternAbi::Rust)
})
}
}
diff --git a/crates/hir-ty/src/next_solver/util.rs b/crates/hir-ty/src/next_solver/util.rs
index 43b4503204..fb3bd18bf4 100644
--- a/crates/hir-ty/src/next_solver/util.rs
+++ b/crates/hir-ty/src/next_solver/util.rs
@@ -430,7 +430,7 @@ pub fn sizedness_constraint_for_ty<'db>(
}
adt.struct_tail_ty(interner).and_then(|tail_ty| {
- let tail_ty = tail_ty.instantiate(interner, args);
+ let tail_ty = tail_ty.instantiate(interner, args).skip_norm_wip();
sizedness_constraint_for_ty(interner, sizedness, tail_ty)
})
}
diff --git a/crates/hir-ty/src/opaques.rs b/crates/hir-ty/src/opaques.rs
index 86baa64895..d39e74b9af 100644
--- a/crates/hir-ty/src/opaques.rs
+++ b/crates/hir-ty/src/opaques.rs
@@ -155,7 +155,7 @@ pub(crate) fn tait_hidden_types(
_ = ocx.eq(
&cause,
param_env,
- entry.get().get().instantiate_identity(),
+ entry.get().get().instantiate_identity().skip_norm_wip(),
hidden_type,
);
}
diff --git a/crates/hir-ty/src/representability.rs b/crates/hir-ty/src/representability.rs
index 6c8e890be5..0b7dc4d309 100644
--- a/crates/hir-ty/src/representability.rs
+++ b/crates/hir-ty/src/representability.rs
@@ -47,7 +47,7 @@ pub(crate) fn representability_cycle(
fn variant_representability(db: &dyn HirDatabase, id: VariantId) -> Representability {
for ty in db.field_types(id).values() {
- rtry!(representability_ty(db, ty.get().instantiate_identity()));
+ rtry!(representability_ty(db, ty.get().instantiate_identity().skip_norm_wip()));
}
Representability::Representable
}
@@ -94,7 +94,11 @@ fn params_in_repr(db: &dyn HirDatabase, def_id: AdtId) -> Box<[bool]> {
.collect::<Box<[bool]>>();
let mut handle_variant = |variant| {
for field in db.field_types(variant).values() {
- params_in_repr_ty(db, field.get().instantiate_identity(), &mut params_in_repr);
+ params_in_repr_ty(
+ db,
+ field.get().instantiate_identity().skip_norm_wip(),
+ &mut params_in_repr,
+ );
}
};
match def_id {
diff --git a/crates/hir-ty/src/specialization.rs b/crates/hir-ty/src/specialization.rs
index 1ef8adb4d9..467b598447 100644
--- a/crates/hir-ty/src/specialization.rs
+++ b/crates/hir-ty/src/specialization.rs
@@ -11,7 +11,7 @@ use crate::{
db::HirDatabase,
lower::GenericPredicates,
next_solver::{
- DbInterner, TypingMode,
+ DbInterner, TypingMode, Unnormalized,
infer::{DbInternerInferExt, traits::ObligationCause},
obligation_ctxt::ObligationCtxt,
util::clauses_as_obligations,
@@ -81,7 +81,7 @@ fn specializes_query(
let infcx = interner.infer_ctxt().build(TypingMode::non_body_analysis());
let specializing_impl_trait_ref =
- db.impl_trait(specializing_impl_def_id).unwrap().instantiate_identity();
+ db.impl_trait(specializing_impl_def_id).unwrap().instantiate_identity().skip_norm_wip();
let cause = &ObligationCause::dummy();
debug!(
"fulfill_implication({:?}, trait_ref={:?} |- {:?} applies)",
@@ -96,7 +96,8 @@ fn specializes_query(
let parent_impl_trait_ref = db
.impl_trait(parent_impl_def_id)
.expect("expected source impl to be a trait impl")
- .instantiate(interner, parent_args);
+ .instantiate(interner, parent_args)
+ .skip_norm_wip();
// do the impls unify? If not, no specialization.
let Ok(()) = ocx.eq(cause, param_env, specializing_impl_trait_ref, parent_impl_trait_ref)
@@ -109,7 +110,8 @@ fn specializes_query(
// only be referenced via projection predicates.
ocx.register_obligations(clauses_as_obligations(
GenericPredicates::query_all(db, parent_impl_def_id.into())
- .iter_instantiated(interner, parent_args.as_slice()),
+ .iter_instantiated(interner, parent_args.as_slice())
+ .map(Unnormalized::skip_norm_wip),
*cause,
param_env,
));
diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs
index 14611d80af..ad1c3fb709 100644
--- a/crates/hir-ty/src/traits.rs
+++ b/crates/hir-ty/src/traits.rs
@@ -154,7 +154,7 @@ fn implements_trait_unique_impl<'db>(
}
pub fn is_inherent_impl_coherent(db: &dyn HirDatabase, def_map: &DefMap, impl_id: ImplId) -> bool {
- let self_ty = db.impl_self_ty(impl_id).instantiate_identity();
+ let self_ty = db.impl_self_ty(impl_id).instantiate_identity().skip_norm_wip();
let self_ty = self_ty.kind();
let impl_allowed = match self_ty {
TyKind::Tuple(_)
@@ -246,7 +246,7 @@ pub fn check_orphan_rules<'db>(db: &'db dyn HirDatabase, impl_: ImplId) -> bool
let local_crate = impl_.lookup(db).container.krate(db);
let is_local = |tgt_crate| tgt_crate == local_crate;
- let trait_ref = impl_trait.instantiate_identity();
+ let trait_ref = impl_trait.instantiate_identity().skip_norm_wip();
let trait_id = trait_ref.def_id.0;
if is_local(trait_id.module(db).krate(db)) {
// trait to be implemented is local
diff --git a/crates/hir-ty/src/utils.rs b/crates/hir-ty/src/utils.rs
index ae9b2c4618..764d02ccf1 100644
--- a/crates/hir-ty/src/utils.rs
+++ b/crates/hir-ty/src/utils.rs
@@ -5,10 +5,9 @@ use std::iter::Enumerate;
use base_db::target::{self, TargetData};
use hir_def::{
- EnumId, EnumVariantId, FunctionId, Lookup, TraitId, attrs::AttrFlags, lang_item::LangItems,
+ EnumId, EnumVariantId, FunctionId, Lookup, TraitId, lang_item::LangItems,
signatures::FunctionSignature,
};
-use intern::sym;
use rustc_abi::TargetDataLayout;
use span::Edition;
@@ -105,21 +104,10 @@ pub fn is_fn_unsafe_to_call(
let loc = func.lookup(db);
match loc.container {
- hir_def::ItemContainerId::ExternBlockId(block) => {
- let is_intrinsic_block = block.abi(db) == Some(sym::rust_dash_intrinsic);
- if is_intrinsic_block {
- // legacy intrinsics
- // extern "rust-intrinsic" intrinsics are unsafe unless they have the rustc_safe_intrinsic attribute
- if AttrFlags::query(db, func.into()).contains(AttrFlags::RUSTC_SAFE_INTRINSIC) {
- Unsafety::Safe
- } else {
- Unsafety::Unsafe
- }
- } else {
- // Function in an `extern` block are always unsafe to call, except when
- // it is marked as `safe`.
- if data.is_safe() { Unsafety::Safe } else { Unsafety::Unsafe }
- }
+ hir_def::ItemContainerId::ExternBlockId(_) => {
+ // Function in an `extern` block are always unsafe to call, except when
+ // it is marked as `safe`.
+ if data.is_safe() { Unsafety::Safe } else { Unsafety::Unsafe }
}
_ => Unsafety::Safe,
}
diff --git a/crates/hir-ty/src/variance.rs b/crates/hir-ty/src/variance.rs
index 77a6af13d2..7eee78b8c4 100644
--- a/crates/hir-ty/src/variance.rs
+++ b/crates/hir-ty/src/variance.rs
@@ -126,7 +126,7 @@ impl<'db> Context<'db> {
let mut add_constraints_from_variant = |variant| {
for (_, field) in db.field_types(variant).iter() {
self.add_constraints_from_ty(
- field.get().instantiate_identity(),
+ field.get().instantiate_identity().skip_norm_wip(),
Variance::Covariant,
);
}
diff --git a/crates/hir/src/display.rs b/crates/hir/src/display.rs
index 880c9d9ae6..c87a175cee 100644
--- a/crates/hir/src/display.rs
+++ b/crates/hir/src/display.rs
@@ -7,6 +7,7 @@ use hir_def::{
expr_store::{Body, ExpressionStore},
hir::generics::{GenericParams, TypeOrConstParamData, TypeParamProvenance, WherePredicate},
item_tree::FieldsShape,
+ layout::ExternAbi,
signatures::{
ConstSignature, FunctionSignature, ImplSignature, StaticFlags, StaticSignature, TraitFlags,
TraitSignature, TypeAliasSignature,
@@ -22,10 +23,10 @@ use hir_ty::{
hir_display_with_store, write_bounds_like_dyn_trait_with_prefix, write_params_bounds,
write_visibility,
},
- next_solver::ClauseKind,
+ next_solver::{ClauseKind, Unnormalized},
};
use itertools::Itertools;
-use rustc_type_ir::inherent::IntoKind;
+use rustc_type_ir::inherent::IntoKind as _;
use crate::{
Adt, AnyFunctionId, AsAssocItem, AssocItem, AssocItemContainer, Const, ConstParam, Crate, Enum,
@@ -171,8 +172,8 @@ fn write_function<'db>(f: &mut HirFormatter<'_, 'db>, func_id: FunctionId) -> Re
if func.is_unsafe_to_call(db, None, f.edition()) {
f.write_str("unsafe ")?;
}
- if let Some(abi) = &data.abi {
- write!(f, "extern \"{}\" ", abi.as_str())?;
+ if data.abi != ExternAbi::Rust {
+ write!(f, "extern \"{}\" ", data.abi.as_str())?;
}
write!(f, "fn {}", data.name.display(f.db, f.edition()))?;
@@ -582,6 +583,7 @@ impl<'db> HirDisplay<'db> for TypeParam {
let predicates = GenericPredicates::query_all(f.db, self.id.parent());
let predicates = predicates
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.filter(|wc| match wc.kind().skip_binder() {
ClauseKind::Trait(tr) => tr.self_ty() == ty,
ClauseKind::Projection(proj) => proj.self_ty() == ty,
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 14a285d5bd..3f83d068bb 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -173,7 +173,7 @@ pub use {
// FIXME: Properly encapsulate mir
hir_ty::mir,
hir_ty::{
- CastError, FnAbi, PointerCast, attach_db, attach_db_allow_change,
+ CastError, PointerCast, attach_db, attach_db_allow_change,
consteval::ConstEvalError,
diagnostics::UnsafetyReason,
display::{ClosureStyle, DisplayTarget, HirDisplay, HirDisplayError, HirWrite},
@@ -946,7 +946,7 @@ impl Module {
.collect();
if !missing.is_empty() {
- let self_ty = db.impl_self_ty(impl_id).instantiate_identity();
+ let self_ty = db.impl_self_ty(impl_id).instantiate_identity().skip_norm_wip();
let self_ty = structurally_normalize_ty(
&infcx,
self_ty,
@@ -1345,7 +1345,7 @@ impl<'db> InstantiatedField<'db> {
let var_id = self.inner.parent.into();
let field = db.field_types(var_id)[self.inner.id].get();
- let ty = field.instantiate(interner, self.args);
+ let ty = field.instantiate(interner, self.args).skip_norm_wip();
TypeNs::new(db, var_id, ty)
}
}
@@ -1440,7 +1440,7 @@ impl Field {
};
let interner = DbInterner::new_no_crate(db);
let args = generic_args_from_tys(interner, def_id.into(), generics.map(|ty| ty.ty));
- let ty = db.field_types(var_id)[self.id].get().instantiate(interner, args);
+ let ty = db.field_types(var_id)[self.id].get().instantiate(interner, args).skip_norm_wip();
Type::new(db, var_id, ty)
}
@@ -1570,7 +1570,7 @@ impl<'db> InstantiatedStruct<'db> {
let interner = DbInterner::new_no_crate(db);
let ty = db.ty(self.inner.id.into());
- TypeNs::new(db, self.inner.id, ty.instantiate(interner, self.args))
+ TypeNs::new(db, self.inner.id, ty.instantiate(interner, self.args).skip_norm_wip())
}
}
@@ -1732,7 +1732,7 @@ impl<'db> InstantiatedEnum<'db> {
let interner = DbInterner::new_no_crate(db);
let ty = db.ty(self.inner.id.into());
- TypeNs::new(db, self.inner.id, ty.instantiate(interner, self.args))
+ TypeNs::new(db, self.inner.id, ty.instantiate(interner, self.args).skip_norm_wip())
}
}
@@ -2017,12 +2017,12 @@ impl AnonConst {
pub fn ty<'db>(self, db: &'db dyn HirDatabase) -> Type<'db> {
let loc = self.id.loc(db);
let env = body_param_env_from_has_crate(db, loc.owner);
- Type { env, ty: loc.ty.get().instantiate_identity() }
+ Type { env, ty: loc.ty.get().instantiate_identity().skip_norm_wip() }
}
pub fn eval(self, db: &dyn HirDatabase) -> Result<EvaluatedConst<'_>, ConstEvalError> {
let interner = DbInterner::new_no_crate(db);
- let ty = self.id.loc(db).ty.get().instantiate_identity();
+ let ty = self.id.loc(db).ty.get().instantiate_identity().skip_norm_wip();
db.anon_const_eval(self.id, GenericArgs::empty(interner), None).map(|it| EvaluatedConst {
allocation: it,
def: self.id.into(),
@@ -2486,7 +2486,8 @@ impl Function {
let resolver = id.resolver(db);
let interner = DbInterner::new_no_crate(db);
// FIXME: This shouldn't be `instantiate_identity()`, we shouldn't leak `TyKind::Param`s.
- let callable_sig = db.callable_item_signature(id.into()).instantiate_identity();
+ let callable_sig =
+ db.callable_item_signature(id.into()).instantiate_identity().skip_norm_wip();
let ty = Ty::new_fn_ptr(interner, callable_sig);
Type::new_with_resolver_inner(db, &resolver, ty)
}
@@ -2563,10 +2564,13 @@ impl Function {
// `impl_generics_len - impl_trait_ref.args.len()`.
let trait_method_fn_ptr = Ty::new_fn_ptr(
interner,
- db.callable_item_signature(trait_method.into()).instantiate_identity(),
+ db.callable_item_signature(trait_method.into())
+ .instantiate_identity()
+ .skip_norm_wip(),
);
- let impl_trait_ref =
- hir_ty::builtin_derive::impl_trait(interner, impl_).instantiate_identity();
+ let impl_trait_ref = hir_ty::builtin_derive::impl_trait(interner, impl_)
+ .instantiate_identity()
+ .skip_norm_wip();
let trait_method_args =
GenericArgs::identity_for_item(interner, trait_method.into());
let trait_method_own_args = GenericArgs::new_from_iter(
@@ -2581,8 +2585,9 @@ impl Function {
interner,
impl_trait_ref.args.iter().chain(shifted_trait_method_own_args),
);
- let impl_method_fn_ptr =
- EarlyBinder::bind(trait_method_fn_ptr).instantiate(interner, impl_method_args);
+ let impl_method_fn_ptr = EarlyBinder::bind(trait_method_fn_ptr)
+ .instantiate(interner, impl_method_args)
+ .skip_norm_wip();
Type { env, ty: impl_method_fn_ptr }
}
}
@@ -2613,7 +2618,7 @@ impl Function {
let ret_type = self.ret_type(db);
let interner = DbInterner::new_no_crate(db);
let args = self.adapt_generic_args(interner, generics);
- ret_type.derived(EarlyBinder::bind(ret_type.ty).instantiate(interner, args))
+ ret_type.derived(EarlyBinder::bind(ret_type.ty).instantiate(interner, args).skip_norm_wip())
}
fn adapt_generic_args<'db>(
@@ -2728,7 +2733,7 @@ impl Function {
idx: param.idx,
ty: Type {
env: param.ty.env,
- ty: EarlyBinder::bind(param.ty.ty).instantiate(interner, args),
+ ty: EarlyBinder::bind(param.ty.ty).instantiate(interner, args).skip_norm_wip(),
},
})
.collect()
@@ -3093,7 +3098,7 @@ impl SelfParam {
let interner = DbInterner::new_no_crate(db);
let args = self.func.adapt_generic_args(interner, generics);
let Type { env, ty } = self.ty(db);
- Type { env, ty: EarlyBinder::bind(ty).instantiate(interner, args) }
+ Type { env, ty: EarlyBinder::bind(ty).instantiate(interner, args).skip_norm_wip() }
}
}
@@ -3191,7 +3196,7 @@ impl Const {
/// Evaluate the constant.
pub fn eval(self, db: &dyn HirDatabase) -> Result<EvaluatedConst<'_>, ConstEvalError> {
let interner = DbInterner::new_no_crate(db);
- let ty = db.value_ty(self.id.into()).unwrap().instantiate_identity();
+ let ty = db.value_ty(self.id.into()).unwrap().instantiate_identity().skip_norm_wip();
db.const_eval(self.id, GenericArgs::empty(interner), None).map(|it| EvaluatedConst {
allocation: it,
def: self.id.into(),
@@ -3271,7 +3276,7 @@ impl Static {
/// Evaluate the static initializer.
pub fn eval(self, db: &dyn HirDatabase) -> Result<EvaluatedConst<'_>, ConstEvalError> {
- let ty = db.value_ty(self.id.into()).unwrap().instantiate_identity();
+ let ty = db.value_ty(self.id.into()).unwrap().instantiate_identity().skip_norm_wip();
db.const_eval_static(self.id).map(|it| EvaluatedConst {
allocation: it,
def: self.id.into(),
@@ -4861,7 +4866,7 @@ fn generic_arg_from_param(db: &dyn HirDatabase, id: TypeOrConstParamId) -> Optio
let defaults = db.generic_defaults(id.parent);
let ty = defaults.get(local_idx as usize)?;
// FIXME: This shouldn't be `instantiate_identity()`, we shouldn't leak `TyKind::Param`s.
- Some(ty.instantiate_identity())
+ Some(ty.instantiate_identity().skip_norm_wip())
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
@@ -5036,7 +5041,7 @@ impl Impl {
pub fn trait_ref(self, db: &dyn HirDatabase) -> Option<TraitRef<'_>> {
match self.id {
AnyImplId::ImplId(id) => {
- let trait_ref = db.impl_trait(id)?.instantiate_identity();
+ let trait_ref = db.impl_trait(id)?.instantiate_identity().skip_norm_wip();
let resolver = id.resolver(db);
Some(TraitRef::new_with_resolver(db, &resolver, trait_ref))
}
@@ -5048,8 +5053,9 @@ impl Impl {
param_env: hir_ty::builtin_derive::param_env(interner, id),
krate,
};
- let trait_ref =
- hir_ty::builtin_derive::impl_trait(interner, id).instantiate_identity();
+ let trait_ref = hir_ty::builtin_derive::impl_trait(interner, id)
+ .instantiate_identity()
+ .skip_norm_wip();
Some(TraitRef { env, trait_ref })
}
}
@@ -5060,7 +5066,7 @@ impl Impl {
AnyImplId::ImplId(id) => {
let resolver = id.resolver(db);
// FIXME: This shouldn't be `instantiate_identity()`, we shouldn't leak `TyKind::Param`s.
- let ty = db.impl_self_ty(id).instantiate_identity();
+ let ty = db.impl_self_ty(id).instantiate_identity().skip_norm_wip();
Type::new_with_resolver_inner(db, &resolver, ty)
}
AnyImplId::BuiltinDeriveImplId(id) => {
@@ -5073,6 +5079,7 @@ impl Impl {
};
let ty = hir_ty::builtin_derive::impl_trait(interner, id)
.instantiate_identity()
+ .skip_norm_wip()
.self_ty();
Type { env, ty }
}
@@ -5548,13 +5555,13 @@ impl<'db> Type<'db> {
}
};
let args = GenericArgs::error_for_item(interner, def.into());
- Type::new(db, def, ty.instantiate(interner, args))
+ Type::new(db, def, ty.instantiate(interner, args).skip_norm_wip())
}
// FIXME: We shouldn't leak `TyKind::Param`s.
fn from_def_params(db: &'db dyn HirDatabase, def: impl Into<TyDefId> + HasResolver) -> Self {
let ty = db.ty(def.into());
- Type::new(db, def, ty.instantiate_identity())
+ Type::new(db, def, ty.instantiate_identity().skip_norm_wip())
}
fn from_value_def(
@@ -5578,7 +5585,7 @@ impl<'db> Type<'db> {
}
};
let args = GenericArgs::error_for_item(interner, def.into());
- Type::new(db, def, ty.instantiate(interner, args))
+ Type::new(db, def, ty.instantiate(interner, args).skip_norm_wip())
}
pub fn new_slice(ty: Self) -> Self {
@@ -5656,7 +5663,10 @@ impl<'db> Type<'db> {
.fields()
.iter()
.map(|(idx, _)| {
- field_types[idx].get().instantiate(self.interner, args)
+ field_types[idx]
+ .get()
+ .instantiate(self.interner, args)
+ .skip_norm_wip()
})
.filter(|it| !it.references_non_lt_error())
.collect()
@@ -5980,7 +5990,7 @@ impl<'db> Type<'db> {
.iter()
.map(|(local_id, ty)| {
let def = Field { parent: variant_id.into(), id: local_id };
- let ty = ty.get().instantiate(interner, substs);
+ let ty = ty.get().instantiate(interner, substs).skip_norm_wip();
(def, self.derived(ty))
})
.collect()
@@ -6483,7 +6493,7 @@ impl<'db> Type<'db> {
else {
return None;
};
- match def_id.expect_type_alias().loc(db).container {
+ match def_id.0.loc(db).container {
ItemContainerId::TraitId(id) => Some(Trait { id }),
_ => None,
}
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index f0208ad01a..4029b004a7 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -519,7 +519,7 @@ impl<'db> SourceAnalyzer<'db> {
let expr_id = self.expr_id(call.clone().into())?.as_expr()?;
let (func, args) = self.infer()?.method_resolution(expr_id)?;
let interner = DbInterner::new_no_crate(db);
- let ty = db.value_ty(func.into())?.instantiate(interner, args);
+ let ty = db.value_ty(func.into())?.instantiate(interner, args).skip_norm_wip();
let ty = Type::new_with_resolver(db, &self.resolver, ty);
let mut res = ty.as_callable(db)?;
res.is_bound_method = true;
@@ -868,8 +868,10 @@ impl<'db> SourceAnalyzer<'db> {
let variant = self.infer()?.variant_resolution_for_expr_or_pat(expr_id)?;
let variant_data = variant.fields(db);
let field = FieldId { parent: variant, local_id: variant_data.field(&local_name)? };
- let field_ty =
- (*db.field_types(variant).get(field.local_id)?).get().instantiate(interner, subst);
+ let field_ty = (*db.field_types(variant).get(field.local_id)?)
+ .get()
+ .instantiate(interner, subst)
+ .skip_norm_wip();
Some((
field.into(),
local,
@@ -891,8 +893,10 @@ impl<'db> SourceAnalyzer<'db> {
let variant_data = variant.fields(db);
let field = FieldId { parent: variant, local_id: variant_data.field(&field_name)? };
let (adt, subst) = self.infer()?.pat_ty(pat_id.as_pat()?).as_adt()?;
- let field_ty =
- (*db.field_types(variant).get(field.local_id)?).get().instantiate(interner, subst);
+ let field_ty = (*db.field_types(variant).get(field.local_id)?)
+ .get()
+ .instantiate(interner, subst)
+ .skip_norm_wip();
Some((
field.into(),
Type::new_with_resolver(db, &self.resolver, field_ty),
@@ -961,24 +965,25 @@ impl<'db> SourceAnalyzer<'db> {
if let Either::Right(container) = &mut container {
*container = structurally_normalize_ty(&infcx, *container, trait_env.param_env);
}
- let handle_variants = |variant: VariantId,
- subst: GenericArgs<'db>,
- container: &mut _| {
- let fields = variant.fields(db);
- let field = fields.field(&field_name.as_name())?;
- let field_types = db.field_types(variant);
- *container = Either::Right(field_types[field].get().instantiate(interner, subst));
- let generic_def = match variant {
- VariantId::EnumVariantId(it) => it.loc(db).parent.into(),
- VariantId::StructId(it) => it.into(),
- VariantId::UnionId(it) => it.into(),
+ let handle_variants =
+ |variant: VariantId, subst: GenericArgs<'db>, container: &mut _| {
+ let fields = variant.fields(db);
+ let field = fields.field(&field_name.as_name())?;
+ let field_types = db.field_types(variant);
+ *container = Either::Right(
+ field_types[field].get().instantiate(interner, subst).skip_norm_wip(),
+ );
+ let generic_def = match variant {
+ VariantId::EnumVariantId(it) => it.loc(db).parent.into(),
+ VariantId::StructId(it) => it.into(),
+ VariantId::UnionId(it) => it.into(),
+ };
+ Some((
+ Either::Right(Field { parent: variant.into(), id: field }),
+ generic_def,
+ subst,
+ ))
};
- Some((
- Either::Right(Field { parent: variant.into(), id: field }),
- generic_def,
- subst,
- ))
- };
let temp_ty = Ty::new_error(interner, ErrorGuaranteed);
let (field_def, generic_def, subst) =
match std::mem::replace(&mut container, Either::Right(temp_ty)) {
@@ -1322,7 +1327,7 @@ impl<'db> SourceAnalyzer<'db> {
args,
..
}) => {
- let assoc_id = def_id.expect_type_alias();
+ let assoc_id = def_id.0;
(
GenericSubstitution::new(assoc_id.into(), args, env),
PathResolution::Def(ModuleDef::TypeAlias(assoc_id.into())),
@@ -1453,7 +1458,7 @@ impl<'db> SourceAnalyzer<'db> {
.into_iter()
.map(|local_id| {
let field = FieldId { parent: variant, local_id };
- let ty = field_types[local_id].get().instantiate(interner, substs);
+ let ty = field_types[local_id].get().instantiate(interner, substs).skip_norm_wip();
(field.into(), Type::new_with_resolver_inner(db, &self.resolver, ty))
})
.collect()
diff --git a/crates/ide-completion/src/tests/flyimport.rs b/crates/ide-completion/src/tests/flyimport.rs
index 896b132e15..708be22258 100644
--- a/crates/ide-completion/src/tests/flyimport.rs
+++ b/crates/ide-completion/src/tests/flyimport.rs
@@ -1809,9 +1809,8 @@ fn intrinsics() {
r#"
//- /core.rs crate:core
pub mod intrinsics {
- extern "rust-intrinsic" {
- pub fn transmute<Src, Dst>(src: Src) -> Dst;
- }
+ #[rustc_intrinsic]
+ pub unsafe fn transmute<Src, Dst>(src: Src) -> Dst;
}
pub mod mem {
pub use crate::intrinsics::transmute;
@@ -1829,9 +1828,8 @@ fn intrinsics() {
r#"
//- /core.rs crate:core
pub mod intrinsics {
- extern "rust-intrinsic" {
- pub fn transmute<Src, Dst>(src: Src) -> Dst;
- }
+ #[rustc_intrinsic]
+ pub unsafe fn transmute<Src, Dst>(src: Src) -> Dst;
}
pub mod mem {
pub use crate::intrinsics::transmute;
diff --git a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
index aacbe72313..b4ddb239c8 100644
--- a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
@@ -274,25 +274,6 @@ fn main() {
}
#[test]
- fn no_missing_unsafe_diagnostic_with_legacy_safe_intrinsic() {
- check_diagnostics(
- r#"
-extern "rust-intrinsic" {
- #[rustc_safe_intrinsic]
- pub fn bitreverse(x: u32) -> u32; // Safe intrinsic
- pub fn floorf32(x: f32) -> f32; // Unsafe intrinsic
-}
-
-fn main() {
- let _ = bitreverse(12);
- let _ = floorf32(12.0);
- //^^^^^^^^^^^^^^💡 error: call to unsafe function is unsafe and requires an unsafe function or block
-}
-"#,
- );
- }
-
- #[test]
fn no_missing_unsafe_diagnostic_with_deprecated_safe_2024() {
check_diagnostics(
r#"
@@ -417,30 +398,6 @@ fn main() {
}
#[test]
- fn add_unsafe_block_when_calling_unsafe_intrinsic() {
- check_fix(
- r#"
-extern "rust-intrinsic" {
- pub fn floorf32(x: f32) -> f32;
-}
-
-fn main() {
- let _ = floorf32$0(12.0);
-}
-"#,
- r#"
-extern "rust-intrinsic" {
- pub fn floorf32(x: f32) -> f32;
-}
-
-fn main() {
- let _ = unsafe { floorf32(12.0) };
-}
-"#,
- )
- }
-
- #[test]
fn unsafe_expr_as_a_receiver_of_a_method_call() {
check_fix(
r#"
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index 6d9c6d4c21..bf5e0be374 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -5972,9 +5972,8 @@ const FOO$0: f64 = 1.0f64;
fn hover_const_eval_floating_point() {
check(
r#"
-extern "rust-intrinsic" {
- pub fn expf64(x: f64) -> f64;
-}
+#[rustc_intrinsic]
+pub fn expf64(x: f64) -> f64;
const FOO$0: f64 = expf64(1.2);
"#,