Rollup merge of #125865 - ajwock:ice_not_fully_resolved, r=fee1-dead
Fix ICE caused by ignoring EffectVars in type inference Fixes #119830 r? ```@matthiaskrgr```
This commit is contained in:
commit
7699da4858
5 changed files with 98 additions and 11 deletions
|
@ -587,6 +587,7 @@ pub enum FixupError {
|
||||||
UnresolvedFloatTy(FloatVid),
|
UnresolvedFloatTy(FloatVid),
|
||||||
UnresolvedTy(TyVid),
|
UnresolvedTy(TyVid),
|
||||||
UnresolvedConst(ConstVid),
|
UnresolvedConst(ConstVid),
|
||||||
|
UnresolvedEffect(EffectVid),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// See the `region_obligations` field for more information.
|
/// See the `region_obligations` field for more information.
|
||||||
|
@ -614,6 +615,7 @@ impl fmt::Display for FixupError {
|
||||||
),
|
),
|
||||||
UnresolvedTy(_) => write!(f, "unconstrained type"),
|
UnresolvedTy(_) => write!(f, "unconstrained type"),
|
||||||
UnresolvedConst(_) => write!(f, "unconstrained const value"),
|
UnresolvedConst(_) => write!(f, "unconstrained const value"),
|
||||||
|
UnresolvedEffect(_) => write!(f, "unconstrained effect value"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,6 +167,9 @@ impl<'a, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for FullTypeResolver<'a, 'tcx> {
|
||||||
ty::ConstKind::Infer(InferConst::Fresh(_)) => {
|
ty::ConstKind::Infer(InferConst::Fresh(_)) => {
|
||||||
bug!("Unexpected const in full const resolver: {:?}", c);
|
bug!("Unexpected const in full const resolver: {:?}", c);
|
||||||
}
|
}
|
||||||
|
ty::ConstKind::Infer(InferConst::EffectVar(evid)) => {
|
||||||
|
return Err(FixupError::UnresolvedEffect(evid));
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
c.try_super_fold_with(self)
|
c.try_super_fold_with(self)
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
//@ known-bug: #119830
|
|
||||||
#![feature(effects)]
|
|
||||||
#![feature(min_specialization)]
|
|
||||||
|
|
||||||
trait Specialize {}
|
|
||||||
|
|
||||||
trait Foo {}
|
|
||||||
|
|
||||||
impl<T> const Foo for T {}
|
|
||||||
|
|
||||||
impl<T> const Foo for T where T: const Specialize {}
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
//@ check-fail
|
||||||
|
// Fixes #119830
|
||||||
|
|
||||||
|
#![feature(effects)]
|
||||||
|
#![feature(min_specialization)]
|
||||||
|
#![feature(const_trait_impl)]
|
||||||
|
|
||||||
|
trait Specialize {}
|
||||||
|
|
||||||
|
trait Foo {}
|
||||||
|
|
||||||
|
impl<T> const Foo for T {}
|
||||||
|
//~^ error: const `impl` for trait `Foo` which is not marked with `#[const_trait]`
|
||||||
|
//~| error: the const parameter `host` is not constrained by the impl trait, self type, or predicates [E0207]
|
||||||
|
|
||||||
|
impl<T> const Foo for T where T: const Specialize {}
|
||||||
|
//~^ error: const `impl` for trait `Foo` which is not marked with `#[const_trait]`
|
||||||
|
//~| error: `const` can only be applied to `#[const_trait]` traits
|
||||||
|
//~| error: the const parameter `host` is not constrained by the impl trait, self type, or predicates [E0207]
|
||||||
|
//~| error: specialization impl does not specialize any associated items
|
||||||
|
//~| error: could not resolve generic parameters on overridden impl
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
error: const `impl` for trait `Foo` which is not marked with `#[const_trait]`
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:12:15
|
||||||
|
|
|
||||||
|
LL | trait Foo {}
|
||||||
|
| - help: mark `Foo` as const: `#[const_trait]`
|
||||||
|
LL |
|
||||||
|
LL | impl<T> const Foo for T {}
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
|
||||||
|
= note: adding a non-const method body in the future would be a breaking change
|
||||||
|
|
||||||
|
error: const `impl` for trait `Foo` which is not marked with `#[const_trait]`
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:16:15
|
||||||
|
|
|
||||||
|
LL | trait Foo {}
|
||||||
|
| - help: mark `Foo` as const: `#[const_trait]`
|
||||||
|
...
|
||||||
|
LL | impl<T> const Foo for T where T: const Specialize {}
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: marking a trait with `#[const_trait]` ensures all default method bodies are `const`
|
||||||
|
= note: adding a non-const method body in the future would be a breaking change
|
||||||
|
|
||||||
|
error: `const` can only be applied to `#[const_trait]` traits
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:16:40
|
||||||
|
|
|
||||||
|
LL | impl<T> const Foo for T where T: const Specialize {}
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0207]: the const parameter `host` is not constrained by the impl trait, self type, or predicates
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:12:9
|
||||||
|
|
|
||||||
|
LL | impl<T> const Foo for T {}
|
||||||
|
| ^^^^^ unconstrained const parameter
|
||||||
|
|
|
||||||
|
= note: expressions using a const parameter must map each value to a distinct output value
|
||||||
|
= note: proving the result of expressions other than the parameter are unique is not supported
|
||||||
|
|
||||||
|
error[E0207]: the const parameter `host` is not constrained by the impl trait, self type, or predicates
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:16:9
|
||||||
|
|
|
||||||
|
LL | impl<T> const Foo for T where T: const Specialize {}
|
||||||
|
| ^^^^^ unconstrained const parameter
|
||||||
|
|
|
||||||
|
= note: expressions using a const parameter must map each value to a distinct output value
|
||||||
|
= note: proving the result of expressions other than the parameter are unique is not supported
|
||||||
|
|
||||||
|
error: specialization impl does not specialize any associated items
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:16:1
|
||||||
|
|
|
||||||
|
LL | impl<T> const Foo for T where T: const Specialize {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: impl is a specialization of this impl
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:12:1
|
||||||
|
|
|
||||||
|
LL | impl<T> const Foo for T {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: could not resolve generic parameters on overridden impl
|
||||||
|
--> $DIR/spec-effectvar-ice.rs:16:1
|
||||||
|
|
|
||||||
|
LL | impl<T> const Foo for T where T: const Specialize {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0207`.
|
Loading…
Add table
Add a link
Reference in a new issue