Fix ICE caused by ignoring EffectVars in type inference

Signed-off-by: Andrew Wock <ajwock@gmail.com>
This commit is contained in:
Andrew Wock 2024-06-01 14:59:13 -04:00
parent ada5e2c7b5
commit 66a13861ae
5 changed files with 98 additions and 11 deletions

View file

@ -587,6 +587,7 @@ pub enum FixupError {
UnresolvedFloatTy(FloatVid),
UnresolvedTy(TyVid),
UnresolvedConst(ConstVid),
UnresolvedEffect(EffectVid),
}
/// See the `region_obligations` field for more information.
@ -614,6 +615,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
),
UnresolvedTy(_) => write!(f, "unconstrained type"),
UnresolvedConst(_) => write!(f, "unconstrained const value"),
UnresolvedEffect(_) => write!(f, "unconstrained effect value"),
}
}
}

View file

@ -167,6 +167,9 @@ fn try_fold_const(&mut self, c: ty::Const<'tcx>) -> Result<ty::Const<'tcx>, Self
ty::ConstKind::Infer(InferConst::Fresh(_)) => {
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)

View file

@ -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 {}

View file

@ -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() {
}

View file

@ -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`.