Skip to content

Commit 0933850

Browse files
committed
Fix some failing tests and fill-in some missing details
1 parent 9d9877a commit 0933850

File tree

22 files changed

+615
-356
lines changed

22 files changed

+615
-356
lines changed

crates/hir-ty/src/infer/coerce.rs

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@
88
use std::iter;
99

1010
use chalk_ir::{BoundVar, Mutability, TyKind, TyVariableKind, cast::Cast};
11-
use hir_def::{
12-
hir::ExprId,
13-
lang_item::LangItem,
14-
};
11+
use hir_def::{hir::ExprId, lang_item::LangItem};
1512
use rustc_type_ir::solve::Certainty;
1613
use stdx::always;
1714
use triomphe::Arc;
1815

1916
use crate::{
20-
autoderef::{Autoderef, AutoderefKind}, db::HirDatabase, infer::{
17+
Canonical, FnAbi, FnPointer, FnSig, Goal, InEnvironment, Interner, Lifetime, Substitution,
18+
TraitEnvironment, Ty, TyBuilder, TyExt,
19+
autoderef::{Autoderef, AutoderefKind},
20+
db::HirDatabase,
21+
infer::{
2122
Adjust, Adjustment, AutoBorrow, InferOk, InferenceContext, OverloadedDeref, PointerCast,
2223
TypeError, TypeMismatch,
23-
}, utils::ClosureSubst, Canonical, FnAbi, FnPointer, FnSig, Goal, InEnvironment, Interner, Lifetime, Substitution, TraitEnvironment, Ty, TyBuilder, TyExt
24+
},
25+
utils::ClosureSubst,
2426
};
2527

2628
use super::unify::InferenceTable;
@@ -37,11 +39,7 @@ fn simple(kind: Adjust) -> impl FnOnce(Ty) -> Vec<Adjustment> {
3739
}
3840

3941
/// This always returns `Ok(...)`.
40-
fn success(
41-
adj: Vec<Adjustment>,
42-
target: Ty,
43-
goals: Vec<InEnvironment<Goal>>,
44-
) -> CoerceResult {
42+
fn success(adj: Vec<Adjustment>, target: Ty, goals: Vec<InEnvironment<Goal>>) -> CoerceResult {
4543
Ok(InferOk { goals, value: (adj, target) })
4644
}
4745

@@ -302,7 +300,7 @@ impl InferenceTable<'_> {
302300
fn coerce_inner(&mut self, from_ty: Ty, to_ty: &Ty, coerce_never: CoerceNever) -> CoerceResult {
303301
if from_ty.is_never() {
304302
if let TyKind::InferenceVar(tv, TyVariableKind::General) = to_ty.kind(Interner) {
305-
self.set_diverging(*tv, TyVariableKind::General, true);
303+
self.set_diverging(*tv, TyVariableKind::General);
306304
}
307305
if coerce_never == CoerceNever::Yes {
308306
// Subtle: If we are coercing from `!` to `?T`, where `?T` is an unbound
@@ -707,12 +705,9 @@ impl InferenceTable<'_> {
707705

708706
let goal: Goal = coerce_unsized_tref.cast(Interner);
709707

710-
self.commit_if_ok(|table| {
711-
match table.solve_obligation(goal) {
712-
Ok(Certainty::Yes) => Ok(()),
713-
Ok(Certainty::Maybe(_)) => Ok(()),
714-
Err(_) => Err(TypeError),
715-
}
708+
self.commit_if_ok(|table| match table.solve_obligation(goal) {
709+
Ok(Certainty::Yes) => Ok(()),
710+
_ => Err(TypeError),
716711
})?;
717712

718713
let unsize =

crates/hir-ty/src/infer/expr.rs

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,29 @@ use stdx::always;
2323
use syntax::ast::RangeOp;
2424

2525
use crate::{
26-
autoderef::{builtin_deref, deref_by_trait, Autoderef}, consteval, generics::generics, infer::{
27-
coerce::{CoerceMany, CoerceNever, CoercionCause}, find_continuable, pat::contains_explicit_ref_binding, BreakableKind
28-
}, lang_items::lang_items_for_bin_op, lower::{lower_to_chalk_mutability, path::{substs_from_args_and_bindings, GenericArgsLowerer, TypeLikeConst}, ParamLoweringMode}, mapping::{from_chalk, ToChalk}, method_resolution::{self, VisibleFromModule}, next_solver::mapping::ChalkToNextSolver, primitive::{self, UintTy}, static_lifetime, to_chalk_trait_id, traits::FnTrait, Adjust, Adjustment, AdtId, AutoBorrow, Binders, CallableDefId, CallableSig, DeclContext, DeclOrigin, IncorrectGenericsLenKind, Interner, LifetimeElisionKind, Rawness, Scalar, Substitution, TraitEnvironment, TraitRef, Ty, TyBuilder, TyExt, TyKind
26+
Adjust, Adjustment, AdtId, AutoBorrow, Binders, CallableDefId, CallableSig, DeclContext,
27+
DeclOrigin, IncorrectGenericsLenKind, Interner, LifetimeElisionKind, Rawness, Scalar,
28+
Substitution, TraitEnvironment, TraitRef, Ty, TyBuilder, TyExt, TyKind,
29+
autoderef::{Autoderef, builtin_deref, deref_by_trait},
30+
consteval,
31+
generics::generics,
32+
infer::{
33+
BreakableKind,
34+
coerce::{CoerceMany, CoerceNever, CoercionCause},
35+
find_continuable,
36+
pat::contains_explicit_ref_binding,
37+
},
38+
lang_items::lang_items_for_bin_op,
39+
lower::{
40+
ParamLoweringMode, lower_to_chalk_mutability,
41+
path::{GenericArgsLowerer, TypeLikeConst, substs_from_args_and_bindings},
42+
},
43+
mapping::{ToChalk, from_chalk},
44+
method_resolution::{self, VisibleFromModule},
45+
next_solver::mapping::ChalkToNextSolver,
46+
primitive::{self, UintTy},
47+
static_lifetime, to_chalk_trait_id,
48+
traits::FnTrait,
2949
};
3050

3151
use super::{
@@ -807,10 +827,10 @@ impl InferenceContext<'_> {
807827
let index_ty = self.infer_expr(*index, &Expectation::none(), ExprIsRead::Yes);
808828

809829
if let Some(index_trait) = self.resolve_lang_trait(LangItem::Index) {
810-
let canonicalized = ChalkToNextSolver::from_nextsolver(self.canonicalize(base_ty.clone().to_nextsolver(self.table.interner)), self.table.interner);
830+
let canonicalized =
831+
self.canonicalize(base_ty.clone().to_nextsolver(self.table.interner));
811832
let receiver_adjustments = method_resolution::resolve_indexing_op(
812-
self.db,
813-
self.table.trait_env.clone(),
833+
&mut self.table,
814834
canonicalized,
815835
index_trait,
816836
);
@@ -1660,7 +1680,8 @@ impl InferenceContext<'_> {
16601680
None => {
16611681
// no field found, lets attempt to resolve it like a function so that IDE things
16621682
// work out while people are typing
1663-
let canonicalized_receiver = self.canonicalize(receiver_ty.clone().to_nextsolver(self.table.interner));
1683+
let canonicalized_receiver =
1684+
self.canonicalize(receiver_ty.clone().to_nextsolver(self.table.interner));
16641685
let resolved = method_resolution::lookup_method(
16651686
self.db,
16661687
&canonicalized_receiver,
@@ -1806,7 +1827,8 @@ impl InferenceContext<'_> {
18061827
expected: &Expectation,
18071828
) -> Ty {
18081829
let receiver_ty = self.infer_expr_inner(receiver, &Expectation::none(), ExprIsRead::Yes);
1809-
let canonicalized_receiver = self.canonicalize(receiver_ty.clone().to_nextsolver(self.table.interner));
1830+
let canonicalized_receiver =
1831+
self.canonicalize(receiver_ty.clone().to_nextsolver(self.table.interner));
18101832

18111833
let resolved = method_resolution::lookup_method(
18121834
self.db,

0 commit comments

Comments
 (0)