Skip to content

Commit

Permalink
Fix ICE caused by ignoring EffectVars in type inference
Browse files Browse the repository at this point in the history
Signed-off-by: Andrew Wock <ajwock@gmail.com>
  • Loading branch information
ajwock committed Jun 1, 2024
1 parent ada5e2c commit 35a6916
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 11 deletions.
2 changes: 2 additions & 0 deletions compiler/rustc_infer/src/infer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,7 @@ pub enum FixupError {
UnresolvedFloatTy(FloatVid),
UnresolvedTy(TyVid),
UnresolvedConst(ConstVid),
UnresolvedEffect(EffectVid),
}

/// See the `region_obligations` field for more information.
Expand Down Expand Up @@ -614,6 +615,7 @@ impl fmt::Display for FixupError {
),
UnresolvedTy(_) => write!(f, "unconstrained type"),
UnresolvedConst(_) => write!(f, "unconstrained const value"),
UnresolvedEffect(_) => write!(f, "unconstrained effect value"),
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions compiler/rustc_infer/src/infer/resolve.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,9 @@ impl<'a, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for FullTypeResolver<'a, 'tcx> {
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)
Expand Down
11 changes: 0 additions & 11 deletions tests/crashes/119830.rs

This file was deleted.

24 changes: 24 additions & 0 deletions tests/ui/specialization/spec-effectvar-ice.rs
Original file line number Diff line number Diff line change
@@ -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() {
}
69 changes: 69 additions & 0 deletions tests/ui/specialization/spec-effectvar-ice.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 35a6916

Please sign in to comment.