Skip to content

Commit 4b64bc1

Browse files
committed
Upgrade Chalk
1 parent e0d9f79 commit 4b64bc1

File tree

20 files changed

+207
-51
lines changed

20 files changed

+207
-51
lines changed

Cargo.lock

+10-12
Original file line numberDiff line numberDiff line change
@@ -496,9 +496,8 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
496496

497497
[[package]]
498498
name = "chalk-derive"
499-
version = "0.36.0"
500-
source = "registry+https://github.com/rust-lang/crates.io-index"
501-
checksum = "9f88ce4deae1dace71e49b7611cfae2d5489de3530d6daba5758043c47ac3a10"
499+
version = "0.47.0-dev.0"
500+
source = "git+https://github.com/jackh726/chalk.git?rev=972534b01b54f96ff37e5afa4ce18d8a7cdd932d#972534b01b54f96ff37e5afa4ce18d8a7cdd932d"
502501
dependencies = [
503502
"proc-macro2",
504503
"quote",
@@ -508,9 +507,8 @@ dependencies = [
508507

509508
[[package]]
510509
name = "chalk-engine"
511-
version = "0.36.0"
512-
source = "registry+https://github.com/rust-lang/crates.io-index"
513-
checksum = "0e34c9b1b10616782143d7f49490f91ae94afaf2202de3ab0b2835e78b4f0ccc"
510+
version = "0.47.0-dev.0"
511+
source = "git+https://github.com/jackh726/chalk.git?rev=972534b01b54f96ff37e5afa4ce18d8a7cdd932d#972534b01b54f96ff37e5afa4ce18d8a7cdd932d"
514512
dependencies = [
515513
"chalk-derive",
516514
"chalk-ir",
@@ -521,19 +519,18 @@ dependencies = [
521519

522520
[[package]]
523521
name = "chalk-ir"
524-
version = "0.36.0"
525-
source = "registry+https://github.com/rust-lang/crates.io-index"
526-
checksum = "63362c629c2014ab639b04029070763fb8224df136d1363d30e9ece4c8877da3"
522+
version = "0.47.0-dev.0"
523+
source = "git+https://github.com/jackh726/chalk.git?rev=972534b01b54f96ff37e5afa4ce18d8a7cdd932d#972534b01b54f96ff37e5afa4ce18d8a7cdd932d"
527524
dependencies = [
525+
"bitflags",
528526
"chalk-derive",
529527
"lazy_static",
530528
]
531529

532530
[[package]]
533531
name = "chalk-solve"
534-
version = "0.36.0"
535-
source = "registry+https://github.com/rust-lang/crates.io-index"
536-
checksum = "cac338a67af52a7f50bb2f8232e730a3518ce432dbe303246acfe525ddd838c7"
532+
version = "0.47.0-dev.0"
533+
source = "git+https://github.com/jackh726/chalk.git?rev=972534b01b54f96ff37e5afa4ce18d8a7cdd932d#972534b01b54f96ff37e5afa4ce18d8a7cdd932d"
537534
dependencies = [
538535
"chalk-derive",
539536
"chalk-ir",
@@ -4312,6 +4309,7 @@ dependencies = [
43124309
"chalk-ir",
43134310
"chalk-solve",
43144311
"rustc_ast",
4312+
"rustc_attr",
43154313
"rustc_data_structures",
43164314
"rustc_hir",
43174315
"rustc_index",

compiler/rustc_infer/src/infer/canonical/canonicalizer.rs

+4-8
Original file line numberDiff line numberDiff line change
@@ -353,10 +353,8 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> {
353353
// `TyVar(vid)` is unresolved, track its universe index in the canonicalized
354354
// result.
355355
Err(mut ui) => {
356-
if !self.infcx.unwrap().tcx.sess.opts.debugging_opts.chalk {
357-
// FIXME: perf problem described in #55921.
358-
ui = ty::UniverseIndex::ROOT;
359-
}
356+
// FIXME: perf problem described in #55921.
357+
ui = ty::UniverseIndex::ROOT;
360358
self.canonicalize_ty_var(
361359
CanonicalVarInfo {
362360
kind: CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)),
@@ -440,10 +438,8 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> {
440438
// `ConstVar(vid)` is unresolved, track its universe index in the
441439
// canonicalized result
442440
Err(mut ui) => {
443-
if !self.infcx.unwrap().tcx.sess.opts.debugging_opts.chalk {
444-
// FIXME: perf problem described in #55921.
445-
ui = ty::UniverseIndex::ROOT;
446-
}
441+
// FIXME: perf problem described in #55921.
442+
ui = ty::UniverseIndex::ROOT;
447443
return self.canonicalize_const_var(
448444
CanonicalVarInfo { kind: CanonicalVarKind::Const(ui) },
449445
ct,

compiler/rustc_middle/Cargo.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ rustc_index = { path = "../rustc_index" }
2626
rustc_serialize = { path = "../rustc_serialize" }
2727
rustc_ast = { path = "../rustc_ast" }
2828
rustc_span = { path = "../rustc_span" }
29-
chalk-ir = "0.36.0"
29+
#chalk-ir = {"0.46.0"}
30+
chalk-ir = { git = "https://github.com/jackh726/chalk.git", rev = "972534b01b54f96ff37e5afa4ce18d8a7cdd932d" }
3031
smallvec = { version = "1.0", features = ["union", "may_dangle"] }
3132
measureme = "9.0.0"
3233
rustc_session = { path = "../rustc_session" }

compiler/rustc_middle/src/traits/chalk.rs

+15
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ impl<'tcx> chalk_ir::interner::Interner for RustInterner<'tcx> {
7272
type InternedQuantifiedWhereClauses = Vec<chalk_ir::QuantifiedWhereClause<Self>>;
7373
type InternedVariableKinds = Vec<chalk_ir::VariableKind<Self>>;
7474
type InternedCanonicalVarKinds = Vec<chalk_ir::CanonicalVarKind<Self>>;
75+
type InternedVariances = Vec<chalk_ir::Variance>;
7576
type InternedConstraints = Vec<chalk_ir::InEnvironment<chalk_ir::Constraint<Self>>>;
7677
type DefId = DefId;
7778
type InternedAdtId = &'tcx AdtDef;
@@ -351,6 +352,20 @@ impl<'tcx> chalk_ir::interner::Interner for RustInterner<'tcx> {
351352
) -> &'a [chalk_ir::InEnvironment<chalk_ir::Constraint<Self>>] {
352353
constraints
353354
}
355+
356+
fn intern_variances<E>(
357+
&self,
358+
data: impl IntoIterator<Item = Result<chalk_ir::Variance, E>>,
359+
) -> Result<Self::InternedVariances, E> {
360+
data.into_iter().collect::<Result<Vec<_>, _>>()
361+
}
362+
363+
fn variances_data<'a>(
364+
&self,
365+
variances: &'a Self::InternedVariances,
366+
) -> &'a [chalk_ir::Variance] {
367+
variances
368+
}
354369
}
355370

356371
impl<'tcx> chalk_ir::interner::HasInterner for RustInterner<'tcx> {

compiler/rustc_traits/Cargo.toml

+7-3
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@ edition = "2018"
66

77
[dependencies]
88
tracing = "0.1"
9+
rustc_attr = { path = "../rustc_attr" }
910
rustc_middle = { path = "../rustc_middle" }
1011
rustc_data_structures = { path = "../rustc_data_structures" }
1112
rustc_hir = { path = "../rustc_hir" }
1213
rustc_index = { path = "../rustc_index" }
1314
rustc_ast = { path = "../rustc_ast" }
1415
rustc_span = { path = "../rustc_span" }
15-
chalk-ir = "0.36.0"
16-
chalk-solve = "0.36.0"
17-
chalk-engine = "0.36.0"
16+
#chalk-ir = "0.46.0"
17+
chalk-ir = { git = "https://github.com/jackh726/chalk.git", rev = "972534b01b54f96ff37e5afa4ce18d8a7cdd932d" }
18+
#chalk-solve = "0.46.0"
19+
chalk-solve = { git = "https://github.com/jackh726/chalk.git", rev = "972534b01b54f96ff37e5afa4ce18d8a7cdd932d" }
20+
#chalk-engine = "0.46.0"
21+
chalk-engine = { git = "https://github.com/jackh726/chalk.git", rev = "972534b01b54f96ff37e5afa4ce18d8a7cdd932d" }
1822
smallvec = { version = "1.0", features = ["union", "may_dangle"] }
1923
rustc_infer = { path = "../rustc_infer" }
2024
rustc_trait_selection = { path = "../rustc_trait_selection" }

compiler/rustc_traits/src/chalk/db.rs

+80-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ use rustc_middle::traits::ChalkRustInterner as RustInterner;
1010
use rustc_middle::ty::subst::{InternalSubsts, Subst, SubstsRef};
1111
use rustc_middle::ty::{self, AssocItemContainer, AssocKind, TyCtxt, TypeFoldable};
1212

13+
use rustc_ast::ast;
14+
use rustc_attr as attr;
15+
1316
use rustc_hir::def_id::DefId;
1417

1518
use rustc_span::symbol::sym;
@@ -18,7 +21,6 @@ use std::fmt;
1821
use std::sync::Arc;
1922

2023
use crate::chalk::lowering::{self, LowerInto};
21-
use rustc_ast::ast;
2224

2325
pub struct RustIrDatabase<'tcx> {
2426
pub(crate) interner: RustInterner<'tcx>,
@@ -205,12 +207,32 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
205207
fn adt_repr(
206208
&self,
207209
adt_id: chalk_ir::AdtId<RustInterner<'tcx>>,
208-
) -> chalk_solve::rust_ir::AdtRepr {
210+
) -> Arc<chalk_solve::rust_ir::AdtRepr<RustInterner<'tcx>>> {
209211
let adt_def = adt_id.0;
210-
chalk_solve::rust_ir::AdtRepr {
211-
repr_c: adt_def.repr.c(),
212-
repr_packed: adt_def.repr.packed(),
213-
}
212+
let int = |i| chalk_ir::TyKind::Scalar(chalk_ir::Scalar::Int(i)).intern(&self.interner);
213+
let uint = |i| chalk_ir::TyKind::Scalar(chalk_ir::Scalar::Uint(i)).intern(&self.interner);
214+
Arc::new(chalk_solve::rust_ir::AdtRepr {
215+
c: adt_def.repr.c(),
216+
packed: adt_def.repr.packed(),
217+
int: adt_def.repr.int.map(|i| match i {
218+
attr::IntType::SignedInt(ty) => match ty {
219+
ast::IntTy::Isize => int(chalk_ir::IntTy::Isize),
220+
ast::IntTy::I8 => int(chalk_ir::IntTy::I8),
221+
ast::IntTy::I16 => int(chalk_ir::IntTy::I16),
222+
ast::IntTy::I32 => int(chalk_ir::IntTy::I32),
223+
ast::IntTy::I64 => int(chalk_ir::IntTy::I64),
224+
ast::IntTy::I128 => int(chalk_ir::IntTy::I128),
225+
},
226+
attr::IntType::UnsignedInt(ty) => match ty {
227+
ast::UintTy::Usize => uint(chalk_ir::UintTy::Usize),
228+
ast::UintTy::U8 => uint(chalk_ir::UintTy::U8),
229+
ast::UintTy::U16 => uint(chalk_ir::UintTy::U16),
230+
ast::UintTy::U32 => uint(chalk_ir::UintTy::U32),
231+
ast::UintTy::U64 => uint(chalk_ir::UintTy::U64),
232+
ast::UintTy::U128 => uint(chalk_ir::UintTy::U128),
233+
},
234+
}),
235+
})
214236
}
215237

216238
fn fn_def_datum(
@@ -316,7 +338,11 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
316338
let self_ty = self_ty.fold_with(&mut regions_substitutor);
317339
let lowered_ty = self_ty.lower_into(&self.interner);
318340

319-
parameters[0].assert_ty_ref(&self.interner).could_match(&self.interner, &lowered_ty)
341+
parameters[0].assert_ty_ref(&self.interner).could_match(
342+
&self.interner,
343+
self.unification_database(),
344+
&lowered_ty,
345+
)
320346
});
321347

322348
let impls = matched_impls.map(chalk_ir::ImplId).collect();
@@ -541,6 +567,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
541567
Unsize => lang_items.unsize_trait(),
542568
Unpin => lang_items.unpin_trait(),
543569
CoerceUnsized => lang_items.coerce_unsized_trait(),
570+
DiscriminantKind => lang_items.discriminant_kind_trait(),
544571
};
545572
def_id.map(chalk_ir::TraitId)
546573
}
@@ -586,7 +613,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
586613
let sig = &substs.as_slice(&self.interner)[substs.len(&self.interner) - 2];
587614
match sig.assert_ty_ref(&self.interner).kind(&self.interner) {
588615
chalk_ir::TyKind::Function(f) => {
589-
let substitution = f.substitution.as_slice(&self.interner);
616+
let substitution = f.substitution.0.as_slice(&self.interner);
590617
let return_type =
591618
substitution.last().unwrap().assert_ty_ref(&self.interner).clone();
592619
// Closure arguments are tupled
@@ -644,6 +671,51 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
644671
) -> Arc<chalk_solve::rust_ir::GeneratorWitnessDatum<RustInterner<'tcx>>> {
645672
unimplemented!()
646673
}
674+
675+
fn unification_database(&self) -> &dyn chalk_ir::UnificationDatabase<RustInterner<'tcx>> {
676+
self
677+
}
678+
679+
fn discriminant_type(
680+
&self,
681+
_: chalk_ir::Ty<RustInterner<'tcx>>,
682+
) -> chalk_ir::Ty<RustInterner<'tcx>> {
683+
unimplemented!()
684+
}
685+
}
686+
687+
impl<'tcx> chalk_ir::UnificationDatabase<RustInterner<'tcx>> for RustIrDatabase<'tcx> {
688+
fn fn_def_variance(
689+
&self,
690+
def_id: chalk_ir::FnDefId<RustInterner<'tcx>>,
691+
) -> chalk_ir::Variances<RustInterner<'tcx>> {
692+
let variances = self.interner.tcx.variances_of(def_id.0);
693+
chalk_ir::Variances::from(
694+
&self.interner,
695+
variances.iter().map(|v| match v {
696+
ty::Variance::Invariant => chalk_ir::Variance::Invariant,
697+
ty::Variance::Covariant => chalk_ir::Variance::Covariant,
698+
ty::Variance::Contravariant => chalk_ir::Variance::Contravariant,
699+
ty::Variance::Bivariant => unimplemented!(),
700+
}),
701+
)
702+
}
703+
704+
fn adt_variance(
705+
&self,
706+
def_id: chalk_ir::AdtId<RustInterner<'tcx>>,
707+
) -> chalk_ir::Variances<RustInterner<'tcx>> {
708+
let variances = self.interner.tcx.variances_of(def_id.0.did);
709+
chalk_ir::Variances::from(
710+
&self.interner,
711+
variances.iter().map(|v| match v {
712+
ty::Variance::Invariant => chalk_ir::Variance::Invariant,
713+
ty::Variance::Covariant => chalk_ir::Variance::Covariant,
714+
ty::Variance::Contravariant => chalk_ir::Variance::Contravariant,
715+
ty::Variance::Bivariant => unimplemented!(),
716+
}),
717+
)
718+
}
647719
}
648720

649721
/// Creates a `InternalSubsts` that maps each generic parameter to a higher-ranked

compiler/rustc_traits/src/chalk/lowering.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -287,12 +287,12 @@ impl<'tcx> LowerInto<'tcx, chalk_ir::Ty<RustInterner<'tcx>>> for Ty<'tcx> {
287287
chalk_ir::TyKind::Function(chalk_ir::FnPointer {
288288
num_binders: binders.len(interner),
289289
sig: sig.lower_into(interner),
290-
substitution: chalk_ir::Substitution::from_iter(
290+
substitution: chalk_ir::FnSubst(chalk_ir::Substitution::from_iter(
291291
interner,
292292
inputs_and_outputs.iter().map(|ty| {
293293
chalk_ir::GenericArgData::Ty(ty.lower_into(interner)).intern(interner)
294294
}),
295-
),
295+
)),
296296
})
297297
}
298298
ty::Dynamic(predicates, region) => chalk_ir::TyKind::Dyn(chalk_ir::DynTy {
@@ -478,6 +478,10 @@ impl<'tcx> LowerInto<'tcx, Region<'tcx>> for &chalk_ir::Lifetime<RustInterner<'t
478478
}
479479
chalk_ir::LifetimeData::Static => ty::RegionKind::ReStatic,
480480
chalk_ir::LifetimeData::Phantom(_, _) => unimplemented!(),
481+
chalk_ir::LifetimeData::Empty(ui) => {
482+
ty::RegionKind::ReEmpty(ty::UniverseIndex::from_usize(ui.counter))
483+
}
484+
chalk_ir::LifetimeData::Erased => ty::RegionKind::ReErased,
481485
};
482486
interner.tcx.mk_region(kind)
483487
}

compiler/rustc_traits/src/chalk/mod.rs

+34-5
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ crate fn evaluate_goal<'tcx>(
9797
use chalk_solve::Solver;
9898
let mut solver = chalk_engine::solve::SLGSolver::new(32, None);
9999
let db = ChalkRustIrDatabase { interner, reempty_placeholder };
100+
//dbg!("evaluate_goal_pre", &obligation, &lowered_goal);
100101
let solution = solver.solve(&db, &lowered_goal);
101102
debug!(?obligation, ?solution, "evaluate goal");
102103

@@ -105,14 +106,40 @@ crate fn evaluate_goal<'tcx>(
105106
// really need this and so it's really minimal.
106107
// Right now, we also treat a `Unique` solution the same as
107108
// `Ambig(Definite)`. This really isn't right.
108-
let make_solution = |subst: chalk_ir::Substitution<_>| {
109+
let make_solution = |subst: chalk_ir::Substitution<_>,
110+
binders: chalk_ir::CanonicalVarKinds<_>| {
111+
use rustc_middle::infer::canonical::CanonicalVarInfo;
112+
109113
let mut var_values: IndexVec<BoundVar, GenericArg<'tcx>> = IndexVec::new();
110114
subst.as_slice(&interner).iter().for_each(|p| {
111115
var_values.push(p.lower_into(&interner));
112116
});
117+
let variables: Vec<_> = binders
118+
.iter(&interner)
119+
.map(|var| {
120+
let kind = match var.kind {
121+
chalk_ir::VariableKind::Ty(ty_kind) => CanonicalVarKind::Ty(match ty_kind {
122+
chalk_ir::TyVariableKind::General => CanonicalTyVarKind::General(
123+
ty::UniverseIndex::from_usize(var.skip_kind().counter),
124+
),
125+
chalk_ir::TyVariableKind::Integer => CanonicalTyVarKind::Int,
126+
chalk_ir::TyVariableKind::Float => CanonicalTyVarKind::Float,
127+
}),
128+
chalk_ir::VariableKind::Lifetime => CanonicalVarKind::Region(
129+
ty::UniverseIndex::from_usize(var.skip_kind().counter),
130+
),
131+
chalk_ir::VariableKind::Const(_) => CanonicalVarKind::Const(
132+
ty::UniverseIndex::from_usize(var.skip_kind().counter),
133+
),
134+
};
135+
CanonicalVarInfo { kind }
136+
})
137+
.collect();
138+
let max_universe =
139+
binders.iter(&interner).map(|v| v.skip_kind().counter).max().unwrap_or(0);
113140
let sol = Canonical {
114-
max_universe: ty::UniverseIndex::from_usize(0),
115-
variables: obligation.variables.clone(),
141+
max_universe: ty::UniverseIndex::from_usize(max_universe),
142+
variables: tcx.intern_canonical_var_infos(&variables),
116143
value: QueryResponse {
117144
var_values: CanonicalVarValues { var_values },
118145
region_constraints: QueryRegionConstraints::default(),
@@ -126,11 +153,13 @@ crate fn evaluate_goal<'tcx>(
126153
.map(|s| match s {
127154
Solution::Unique(subst) => {
128155
// FIXME(chalk): handle constraints
129-
make_solution(subst.value.subst)
156+
make_solution(subst.value.subst, subst.binders)
130157
}
131158
Solution::Ambig(guidance) => {
132159
match guidance {
133-
chalk_solve::Guidance::Definite(subst) => make_solution(subst.value),
160+
chalk_solve::Guidance::Definite(subst) => {
161+
make_solution(subst.value, subst.binders)
162+
}
134163
chalk_solve::Guidance::Suggested(_) => unimplemented!(),
135164
chalk_solve::Guidance::Unknown => {
136165
// chalk_fulfill doesn't use the var_values here, so

src/doc/book

Submodule book updated 59 files

src/doc/embedded-book

src/llvm-project

Submodule llvm-project updated 190 files

0 commit comments

Comments
 (0)