mirror of https://github.com/rust-lang/rust.git
Handle sub-typing in chalk-engine
This commit is contained in:
parent
ba6314a0d6
commit
da9467d147
|
@ -273,7 +273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chalk-engine"
|
name = "chalk-engine"
|
||||||
version = "0.8.0"
|
version = "0.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chalk-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"chalk-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2067,7 +2067,7 @@ dependencies = [
|
||||||
"backtrace 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"backtrace 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"chalk-engine 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"chalk-engine 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fmt_macros 0.0.0",
|
"fmt_macros 0.0.0",
|
||||||
"graphviz 0.0.0",
|
"graphviz 0.0.0",
|
||||||
|
@ -2640,7 +2640,7 @@ name = "rustc_traits"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"chalk-engine 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"chalk-engine 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"graphviz 0.0.0",
|
"graphviz 0.0.0",
|
||||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc 0.0.0",
|
"rustc 0.0.0",
|
||||||
|
@ -3403,7 +3403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum cargo_metadata 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d8dfe3adeb30f7938e6c1dd5327f29235d8ada3e898aeb08c343005ec2915a2"
|
"checksum cargo_metadata 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d8dfe3adeb30f7938e6c1dd5327f29235d8ada3e898aeb08c343005ec2915a2"
|
||||||
"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16"
|
"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16"
|
||||||
"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
|
"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
|
||||||
"checksum chalk-engine 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6749eb72e7d4355d944a99f15fbaea701b978c18c5e184a025fcde942b0c9779"
|
"checksum chalk-engine 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17ec698a6f053a23bfbe646d9f2fde4b02abc19125595270a99e6f44ae0bdd1a"
|
||||||
"checksum chalk-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "295635afd6853aa9f20baeb7f0204862440c0fe994c5a253d5f479dac41d047e"
|
"checksum chalk-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "295635afd6853aa9f20baeb7f0204862440c0fe994c5a253d5f479dac41d047e"
|
||||||
"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878"
|
"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878"
|
||||||
"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
|
"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
|
||||||
|
|
|
@ -30,7 +30,7 @@ syntax_pos = { path = "../libsyntax_pos" }
|
||||||
backtrace = "0.3.3"
|
backtrace = "0.3.3"
|
||||||
parking_lot = "0.6"
|
parking_lot = "0.6"
|
||||||
byteorder = { version = "1.1", features = ["i128"]}
|
byteorder = { version = "1.1", features = ["i128"]}
|
||||||
chalk-engine = { version = "0.8.0", default-features=false }
|
chalk-engine = { version = "0.9.0", default-features=false }
|
||||||
rustc_fs_util = { path = "../librustc_fs_util" }
|
rustc_fs_util = { path = "../librustc_fs_util" }
|
||||||
smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }
|
smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }
|
||||||
|
|
||||||
|
|
|
@ -1195,6 +1195,10 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for traits::Goal<'tcx> {
|
||||||
quantifier.hash_stable(hcx, hasher);
|
quantifier.hash_stable(hcx, hasher);
|
||||||
goal.hash_stable(hcx, hasher);
|
goal.hash_stable(hcx, hasher);
|
||||||
},
|
},
|
||||||
|
Subtype(a, b) => {
|
||||||
|
a.hash_stable(hcx, hasher);
|
||||||
|
b.hash_stable(hcx, hasher);
|
||||||
|
}
|
||||||
CannotProve => { },
|
CannotProve => { },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -324,6 +324,7 @@ pub enum GoalKind<'tcx> {
|
||||||
Not(Goal<'tcx>),
|
Not(Goal<'tcx>),
|
||||||
DomainGoal(DomainGoal<'tcx>),
|
DomainGoal(DomainGoal<'tcx>),
|
||||||
Quantified(QuantifierKind, ty::Binder<Goal<'tcx>>),
|
Quantified(QuantifierKind, ty::Binder<Goal<'tcx>>),
|
||||||
|
Subtype(Ty<'tcx>, Ty<'tcx>),
|
||||||
CannotProve,
|
CannotProve,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -395,6 +395,7 @@ impl<'tcx> fmt::Display for traits::Goal<'tcx> {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Subtype(a, b) => write!(fmt, "{} <: {}", a, b),
|
||||||
CannotProve => write!(fmt, "CannotProve"),
|
CannotProve => write!(fmt, "CannotProve"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -668,6 +669,7 @@ EnumLiftImpl! {
|
||||||
(traits::GoalKind::Not)(goal),
|
(traits::GoalKind::Not)(goal),
|
||||||
(traits::GoalKind::DomainGoal)(domain_goal),
|
(traits::GoalKind::DomainGoal)(domain_goal),
|
||||||
(traits::GoalKind::Quantified)(kind, goal),
|
(traits::GoalKind::Quantified)(kind, goal),
|
||||||
|
(traits::GoalKind::Subtype)(a, b),
|
||||||
(traits::GoalKind::CannotProve),
|
(traits::GoalKind::CannotProve),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -864,6 +866,7 @@ EnumTypeFoldableImpl! {
|
||||||
(traits::GoalKind::Not)(goal),
|
(traits::GoalKind::Not)(goal),
|
||||||
(traits::GoalKind::DomainGoal)(domain_goal),
|
(traits::GoalKind::DomainGoal)(domain_goal),
|
||||||
(traits::GoalKind::Quantified)(qkind, goal),
|
(traits::GoalKind::Quantified)(qkind, goal),
|
||||||
|
(traits::GoalKind::Subtype)(a, b),
|
||||||
(traits::GoalKind::CannotProve),
|
(traits::GoalKind::CannotProve),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,5 +17,5 @@ rustc_data_structures = { path = "../librustc_data_structures" }
|
||||||
rustc_target = { path = "../librustc_target" }
|
rustc_target = { path = "../librustc_target" }
|
||||||
syntax = { path = "../libsyntax" }
|
syntax = { path = "../libsyntax" }
|
||||||
syntax_pos = { path = "../libsyntax_pos" }
|
syntax_pos = { path = "../libsyntax_pos" }
|
||||||
chalk-engine = { version = "0.8.0", default-features=false }
|
chalk-engine = { version = "0.9.0", default-features=false }
|
||||||
smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }
|
smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }
|
||||||
|
|
|
@ -116,6 +116,8 @@ impl context::Context for ChalkArenas<'tcx> {
|
||||||
|
|
||||||
type UnificationResult = UnificationResult<'tcx>;
|
type UnificationResult = UnificationResult<'tcx>;
|
||||||
|
|
||||||
|
type Variance = ty::Variance;
|
||||||
|
|
||||||
fn goal_in_environment(
|
fn goal_in_environment(
|
||||||
env: &Environment<'tcx>,
|
env: &Environment<'tcx>,
|
||||||
goal: Goal<'tcx>,
|
goal: Goal<'tcx>,
|
||||||
|
@ -332,6 +334,11 @@ impl context::InferenceTable<ChalkArenas<'gcx>, ChalkArenas<'tcx>>
|
||||||
GoalKind::DomainGoal(d) => HhGoal::DomainGoal(d),
|
GoalKind::DomainGoal(d) => HhGoal::DomainGoal(d),
|
||||||
GoalKind::Quantified(QuantifierKind::Universal, binder) => HhGoal::ForAll(binder),
|
GoalKind::Quantified(QuantifierKind::Universal, binder) => HhGoal::ForAll(binder),
|
||||||
GoalKind::Quantified(QuantifierKind::Existential, binder) => HhGoal::Exists(binder),
|
GoalKind::Quantified(QuantifierKind::Existential, binder) => HhGoal::Exists(binder),
|
||||||
|
GoalKind::Subtype(a, b) => HhGoal::Unify(
|
||||||
|
ty::Variance::Covariant,
|
||||||
|
a.into(),
|
||||||
|
b.into()
|
||||||
|
),
|
||||||
GoalKind::CannotProve => HhGoal::CannotProve,
|
GoalKind::CannotProve => HhGoal::CannotProve,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -444,11 +451,13 @@ impl context::UnificationOps<ChalkArenas<'gcx>, ChalkArenas<'tcx>>
|
||||||
fn unify_parameters(
|
fn unify_parameters(
|
||||||
&mut self,
|
&mut self,
|
||||||
environment: &Environment<'tcx>,
|
environment: &Environment<'tcx>,
|
||||||
|
variance: ty::Variance,
|
||||||
a: &Kind<'tcx>,
|
a: &Kind<'tcx>,
|
||||||
b: &Kind<'tcx>,
|
b: &Kind<'tcx>,
|
||||||
) -> Fallible<UnificationResult<'tcx>> {
|
) -> Fallible<UnificationResult<'tcx>> {
|
||||||
self.infcx.commit_if_ok(|_| {
|
self.infcx.commit_if_ok(|_| {
|
||||||
unify(self.infcx, *environment, a, b).map_err(|_| chalk_engine::fallible::NoSolution)
|
unify(self.infcx, *environment, variance, a, b)
|
||||||
|
.map_err(|_| chalk_engine::fallible::NoSolution)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -673,6 +682,13 @@ crate fn evaluate_goal<'a, 'tcx>(
|
||||||
GoalKind::DomainGoal(DomainGoal::WellFormed(WellFormed::Ty(ty)))
|
GoalKind::DomainGoal(DomainGoal::WellFormed(WellFormed::Ty(ty)))
|
||||||
),
|
),
|
||||||
|
|
||||||
|
ty::Predicate::Subtype(predicate) => tcx.mk_goal(
|
||||||
|
GoalKind::Quantified(
|
||||||
|
QuantifierKind::Universal,
|
||||||
|
predicate.map_bound(|pred| tcx.mk_goal(GoalKind::Subtype(pred.a, pred.b)))
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
other => tcx.mk_goal(
|
other => tcx.mk_goal(
|
||||||
GoalKind::from_poly_domain_goal(other.lower(), tcx)
|
GoalKind::from_poly_domain_goal(other.lower(), tcx)
|
||||||
),
|
),
|
||||||
|
|
|
@ -51,8 +51,13 @@ impl context::ResolventOps<ChalkArenas<'gcx>, ChalkArenas<'tcx>>
|
||||||
).0,
|
).0,
|
||||||
};
|
};
|
||||||
|
|
||||||
let result = unify(self.infcx, *environment, goal, &consequence)
|
let result = unify(
|
||||||
.map_err(|_| NoSolution)?;
|
self.infcx,
|
||||||
|
*environment,
|
||||||
|
ty::Variance::Invariant,
|
||||||
|
goal,
|
||||||
|
&consequence
|
||||||
|
).map_err(|_| NoSolution)?;
|
||||||
|
|
||||||
let mut ex_clause = ExClause {
|
let mut ex_clause = ExClause {
|
||||||
subst: subst.clone(),
|
subst: subst.clone(),
|
||||||
|
@ -139,7 +144,7 @@ impl AnswerSubstitutor<'cx, 'gcx, 'tcx> {
|
||||||
);
|
);
|
||||||
|
|
||||||
super::into_ex_clause(
|
super::into_ex_clause(
|
||||||
unify(self.infcx, self.environment, answer_param, pending)?,
|
unify(self.infcx, self.environment, ty::Variance::Invariant, answer_param, pending)?,
|
||||||
&mut self.ex_clause
|
&mut self.ex_clause
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ crate struct UnificationResult<'tcx> {
|
||||||
crate fn unify<'me, 'gcx, 'tcx, T: Relate<'tcx>>(
|
crate fn unify<'me, 'gcx, 'tcx, T: Relate<'tcx>>(
|
||||||
infcx: &'me InferCtxt<'me, 'gcx, 'tcx>,
|
infcx: &'me InferCtxt<'me, 'gcx, 'tcx>,
|
||||||
environment: Environment<'tcx>,
|
environment: Environment<'tcx>,
|
||||||
|
variance: ty::Variance,
|
||||||
a: &T,
|
a: &T,
|
||||||
b: &T
|
b: &T
|
||||||
) -> RelateResult<'tcx, UnificationResult<'tcx>> {
|
) -> RelateResult<'tcx, UnificationResult<'tcx>> {
|
||||||
|
@ -30,7 +31,7 @@ crate fn unify<'me, 'gcx, 'tcx, T: Relate<'tcx>>(
|
||||||
TypeRelating::new(
|
TypeRelating::new(
|
||||||
infcx,
|
infcx,
|
||||||
&mut delegate,
|
&mut delegate,
|
||||||
ty::Variance::Invariant
|
variance
|
||||||
).relate(a, b)?;
|
).relate(a, b)?;
|
||||||
|
|
||||||
debug!("unify: goals = {:?}, constraints = {:?}", delegate.goals, delegate.constraints);
|
debug!("unify: goals = {:?}, constraints = {:?}", delegate.goals, delegate.constraints);
|
||||||
|
|
Loading…
Reference in New Issue