Opportunistically resolve region var in canonicalizer
This commit is contained in:
parent
03515c6a22
commit
146e345d8b
@ -381,17 +381,13 @@ fn probe_ty_var(&self, vid: TyVid) -> Option<Ty<'tcx>> {
|
|||||||
self.probe_ty_var(vid).ok()
|
self.probe_ty_var(vid).ok()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn root_lt_var(&self, vid: ty::RegionVid) -> ty::RegionVid {
|
fn opportunistic_resolve_lt_var(&self, vid: ty::RegionVid) -> Option<ty::Region<'tcx>> {
|
||||||
self.root_region_var(vid)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn probe_lt_var(&self, vid: ty::RegionVid) -> Option<ty::Region<'tcx>> {
|
|
||||||
let re = self
|
let re = self
|
||||||
.inner
|
.inner
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.unwrap_region_constraints()
|
.unwrap_region_constraints()
|
||||||
.opportunistic_resolve_var(self.tcx, vid);
|
.opportunistic_resolve_var(self.tcx, vid);
|
||||||
if re.is_var() { None } else { Some(re) }
|
if *re == ty::ReVar(vid) { None } else { Some(re) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn root_ct_var(&self, vid: ConstVid) -> ConstVid {
|
fn root_ct_var(&self, vid: ConstVid) -> ConstVid {
|
||||||
@ -1367,10 +1363,6 @@ pub fn root_var(&self, var: ty::TyVid) -> ty::TyVid {
|
|||||||
self.inner.borrow_mut().type_variables().root_var(var)
|
self.inner.borrow_mut().type_variables().root_var(var)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn root_region_var(&self, var: ty::RegionVid) -> ty::RegionVid {
|
|
||||||
self.inner.borrow_mut().unwrap_region_constraints().root_var(var)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid {
|
pub fn root_const_var(&self, var: ty::ConstVid) -> ty::ConstVid {
|
||||||
self.inner.borrow_mut().const_unification_table().find(var).vid
|
self.inner.borrow_mut().const_unification_table().find(var).vid
|
||||||
}
|
}
|
||||||
|
@ -623,11 +623,6 @@ pub fn opportunistic_resolve_var(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn root_var(&mut self, vid: ty::RegionVid) -> ty::RegionVid {
|
|
||||||
let mut ut = self.unification_table_mut(); // FIXME(rust-lang/ena#42): unnecessary mut
|
|
||||||
ut.find(vid).vid
|
|
||||||
}
|
|
||||||
|
|
||||||
fn combine_map(&mut self, t: CombineMapType) -> &mut CombineMap<'tcx> {
|
fn combine_map(&mut self, t: CombineMapType) -> &mut CombineMap<'tcx> {
|
||||||
match t {
|
match t {
|
||||||
Glb => &mut self.glbs,
|
Glb => &mut self.glbs,
|
||||||
|
@ -242,16 +242,10 @@ fn fold_region(&mut self, r: I::Region) -> I::Region {
|
|||||||
|
|
||||||
ty::ReVar(vid) => {
|
ty::ReVar(vid) => {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
self.infcx.root_lt_var(vid),
|
self.infcx.opportunistic_resolve_lt_var(vid),
|
||||||
vid,
|
|
||||||
"region vid should have been resolved fully before canonicalization"
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
self.infcx.probe_lt_var(vid),
|
|
||||||
None,
|
None,
|
||||||
"region vid should have been resolved fully before canonicalization"
|
"region vid should have been resolved fully before canonicalization"
|
||||||
);
|
);
|
||||||
|
|
||||||
match self.canonicalize_mode {
|
match self.canonicalize_mode {
|
||||||
CanonicalizeMode::Input => CanonicalVarKind::Region(ty::UniverseIndex::ROOT),
|
CanonicalizeMode::Input => CanonicalVarKind::Region(ty::UniverseIndex::ROOT),
|
||||||
CanonicalizeMode::Response { .. } => {
|
CanonicalizeMode::Response { .. } => {
|
||||||
|
@ -32,11 +32,7 @@ fn probe_ty_var(&self, _vid: TyVid) -> Option<I::Ty> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn root_lt_var(&self, vid: I::InferRegion) -> I::InferRegion {
|
fn opportunistic_resolve_lt_var(&self, _vid: I::InferRegion) -> Option<I::Region> {
|
||||||
vid
|
|
||||||
}
|
|
||||||
|
|
||||||
fn probe_lt_var(&self, _vid: I::InferRegion) -> Option<I::Region> {
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,14 +18,14 @@ fn universe_of_lt(
|
|||||||
lt: <Self::Interner as Interner>::InferRegion,
|
lt: <Self::Interner as Interner>::InferRegion,
|
||||||
) -> Option<UniverseIndex>;
|
) -> Option<UniverseIndex>;
|
||||||
|
|
||||||
/// Resolve `InferRegion` to its root `InferRegion`.
|
/// Resolve `InferRegion` to its inferred region, if it has been equated with
|
||||||
fn root_lt_var(
|
/// a non-infer region.
|
||||||
&self,
|
///
|
||||||
vid: <Self::Interner as Interner>::InferRegion,
|
/// FIXME: This has slightly different semantics than `{probe,resolve}_{ty,ct}_var`,
|
||||||
) -> <Self::Interner as Interner>::InferRegion;
|
/// that has to do with the fact unlike `Ty` or `Const` vars, in rustc, we may
|
||||||
|
/// not always be able to *name* the root region var from the universe of the
|
||||||
/// Resolve `InferRegion` to its inferred region, if it has been equated with a non-infer region.
|
/// var we're trying to resolve. That's why it's called *opportunistic*.
|
||||||
fn probe_lt_var(
|
fn opportunistic_resolve_lt_var(
|
||||||
&self,
|
&self,
|
||||||
vid: <Self::Interner as Interner>::InferRegion,
|
vid: <Self::Interner as Interner>::InferRegion,
|
||||||
) -> Option<<Self::Interner as Interner>::Region>;
|
) -> Option<<Self::Interner as Interner>::Region>;
|
||||||
|
22
tests/ui/traits/next-solver/issue-118950-root-region.rs
Normal file
22
tests/ui/traits/next-solver/issue-118950-root-region.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// compile-flags: -Znext-solver
|
||||||
|
//
|
||||||
|
// This is a gnarly test but I don't know how to minimize it, frankly.
|
||||||
|
|
||||||
|
#![feature(lazy_type_alias)]
|
||||||
|
//~^ WARN the feature `lazy_type_alias` is incomplete
|
||||||
|
|
||||||
|
trait ToUnit<'a> {
|
||||||
|
type Unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Overlap<T> {}
|
||||||
|
|
||||||
|
type Assoc<'a, T> = <*const T as ToUnit<'a>>::Unit;
|
||||||
|
|
||||||
|
impl<T> Overlap<T> for T {}
|
||||||
|
|
||||||
|
impl<T> Overlap<for<'a> fn(Assoc<'a, T>)> for T where Missing: Overlap<T> {}
|
||||||
|
//~^ ERROR conflicting implementations of trait `Overlap<fn(_)>` for type `fn(_)`
|
||||||
|
//~| ERROR cannot find type `Missing` in this scope
|
||||||
|
|
||||||
|
fn main() {}
|
36
tests/ui/traits/next-solver/issue-118950-root-region.stderr
Normal file
36
tests/ui/traits/next-solver/issue-118950-root-region.stderr
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
error[E0412]: cannot find type `Missing` in this scope
|
||||||
|
--> $DIR/issue-118950-root-region.rs:18:55
|
||||||
|
|
|
||||||
|
LL | impl<T> Overlap<for<'a> fn(Assoc<'a, T>)> for T where Missing: Overlap<T> {}
|
||||||
|
| ^^^^^^^ not found in this scope
|
||||||
|
|
||||||
|
warning: the feature `lazy_type_alias` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/issue-118950-root-region.rs:5:12
|
||||||
|
|
|
||||||
|
LL | #![feature(lazy_type_alias)]
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #112792 <https://github.com/rust-lang/rust/issues/112792> for more information
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [ReBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [RePlaceholder(!1_BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [ReBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [RePlaceholder(!1_BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [ReBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [RePlaceholder(!1_BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [ReBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
WARN rustc_infer::infer::generalize may incompletely handle alias type: Alias(Weak, AliasTy { args: [RePlaceholder(!1_BoundRegion { var: 0, kind: BrNamed(DefId(0:15 ~ issue_118950_root_region[d54f]::{impl#1}::'a), 'a) }), ?1t], def_id: DefId(0:8 ~ issue_118950_root_region[d54f]::Assoc) })
|
||||||
|
error[E0119]: conflicting implementations of trait `Overlap<fn(_)>` for type `fn(_)`
|
||||||
|
--> $DIR/issue-118950-root-region.rs:18:1
|
||||||
|
|
|
||||||
|
LL | impl<T> Overlap<T> for T {}
|
||||||
|
| ------------------------ first implementation here
|
||||||
|
LL |
|
||||||
|
LL | impl<T> Overlap<for<'a> fn(Assoc<'a, T>)> for T where Missing: Overlap<T> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `fn(_)`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0119, E0412.
|
||||||
|
For more information about an error, try `rustc --explain E0119`.
|
Loading…
Reference in New Issue
Block a user