mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
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
@ -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 @@ impl fmt::Display for FixupError {
|
||||
),
|
||||
UnresolvedTy(_) => write!(f, "unconstrained type"),
|
||||
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(_)) => {
|
||||
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)
|
||||
|
@ -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…
Reference in New Issue
Block a user