Strongly prefer alias and param-env bounds
This commit is contained in:
parent
a2d806d56d
commit
97c11ffb22
8 changed files with 78 additions and 32 deletions
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
use super::search_graph::OverflowHandler;
|
use super::search_graph::OverflowHandler;
|
||||||
use super::{EvalCtxt, SolverMode};
|
use super::{EvalCtxt, SolverMode};
|
||||||
use crate::solve::CanonicalResponseExt;
|
|
||||||
use crate::traits::coherence;
|
use crate::traits::coherence;
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::fx::FxIndexSet;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -744,13 +743,18 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
||||||
SolverMode::Normal => {
|
SolverMode::Normal => {
|
||||||
let param_env_responses = candidates
|
let param_env_responses = candidates
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|c| matches!(c.source, CandidateSource::ParamEnv(_)))
|
.filter(|c| {
|
||||||
|
matches!(
|
||||||
|
c.source,
|
||||||
|
CandidateSource::ParamEnv(_) | CandidateSource::AliasBound
|
||||||
|
)
|
||||||
|
})
|
||||||
.map(|c| c.result)
|
.map(|c| c.result)
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
if let Some(result) = self.try_merge_responses(¶m_env_responses) {
|
if let Some(result) = self.try_merge_responses(¶m_env_responses) {
|
||||||
if result.has_only_region_constraints() {
|
// We strongly prefer alias and param-env bounds here, even if they affect inference.
|
||||||
return Ok(result);
|
// See https://github.com/rust-lang/trait-system-refactor-initiative/issues/11.
|
||||||
}
|
return Ok(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ LL | #![feature(dyn_star, pointer_like_trait)]
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed
|
||||||
--> $DIR/param-env-infer.rs:12:10
|
--> $DIR/param-env-infer.rs:13:10
|
||||||
|
|
|
|
||||||
LL | t as _
|
LL | t as _
|
||||||
| ^ cannot infer type
|
| ^ cannot infer type
|
||||||
|
|
|
@ -7,12 +7,67 @@ LL | #![feature(dyn_star, pointer_like_trait)]
|
||||||
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
error[E0391]: cycle detected when computing type of `make_dyn_star::{opaque#0}`
|
||||||
--> $DIR/param-env-infer.rs:12:10
|
--> $DIR/param-env-infer.rs:11:60
|
||||||
|
|
|
|
||||||
LL | t as _
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
| ^ cannot infer type
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: ...which requires borrow-checking `make_dyn_star`...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: ...which requires promoting constants in MIR for `make_dyn_star`...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: ...which requires preparing `make_dyn_star` for borrow checking...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: ...which requires unsafety-checking `make_dyn_star`...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: ...which requires building MIR for `make_dyn_star`...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: ...which requires match-checking `make_dyn_star`...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: ...which requires building THIR for `make_dyn_star`...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: ...which requires type-checking `make_dyn_star`...
|
||||||
|
--> $DIR/param-env-infer.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
= note: ...which requires computing layout of `make_dyn_star::{opaque#0}`...
|
||||||
|
= note: ...which requires normalizing `make_dyn_star::{opaque#0}`...
|
||||||
|
= note: ...which again requires computing type of `make_dyn_star::{opaque#0}`, completing the cycle
|
||||||
|
note: cycle used when checking item types in top-level module
|
||||||
|
--> $DIR/param-env-infer.rs:5:1
|
||||||
|
|
|
||||||
|
LL | / #![feature(dyn_star, pointer_like_trait)]
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
|
LL | | use std::fmt::Debug;
|
||||||
|
... |
|
||||||
|
LL | |
|
||||||
|
LL | | fn main() {}
|
||||||
|
| |____________^
|
||||||
|
|
||||||
error: aborting due to previous error; 1 warning emitted
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0282`.
|
For more information about this error, try `rustc --explain E0391`.
|
||||||
|
|
|
@ -9,8 +9,9 @@ use std::fmt::Debug;
|
||||||
use std::marker::PointerLike;
|
use std::marker::PointerLike;
|
||||||
|
|
||||||
fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
//[next]~^ ERROR cycle detected when computing type of `make_dyn_star::{opaque#0}`
|
||||||
t as _
|
t as _
|
||||||
//~^ ERROR type annotations needed
|
//[current]~^ ERROR type annotations needed
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Ztrait-solver=next
|
// compile-flags: -Ztrait-solver=next
|
||||||
|
|
||||||
|
// check-pass
|
||||||
|
// (should not pass, should be turned into a coherence-only test)
|
||||||
|
|
||||||
// check that when computing `alias-eq(<() as Foo<u16, T>>::Assoc, <() as Foo<?0, T>>::Assoc)`
|
// check that when computing `alias-eq(<() as Foo<u16, T>>::Assoc, <() as Foo<?0, T>>::Assoc)`
|
||||||
// we do not infer `?0 = u8` via the `for<STOP> (): Foo<u8, STOP>` impl or `?0 = u16` by
|
// we do not infer `?0 = u8` via the `for<STOP> (): Foo<u8, STOP>` impl or `?0 = u16` by
|
||||||
// relating substs as either could be a valid solution.
|
// relating substs as either could be a valid solution.
|
||||||
|
@ -36,7 +39,6 @@ where
|
||||||
{
|
{
|
||||||
// `<() as Foo<u16, STOP>>::Assoc == <() as Foo<_, STOP>>::Assoc`
|
// `<() as Foo<u16, STOP>>::Assoc == <() as Foo<_, STOP>>::Assoc`
|
||||||
let _: <() as Foo<u16, T>>::Assoc = output::<_, T>();
|
let _: <() as Foo<u16, T>>::Assoc = output::<_, T>();
|
||||||
//~^ error: type annotations needed
|
|
||||||
|
|
||||||
// let _: <() as Foo<u16, T>>::Assoc = output::<u8, T>(); // OK
|
// let _: <() as Foo<u16, T>>::Assoc = output::<u8, T>(); // OK
|
||||||
// let _: <() as Foo<u16, T>>::Assoc = output::<u16, T>(); // OK
|
// let _: <() as Foo<u16, T>>::Assoc = output::<u16, T>(); // OK
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
error[E0282]: type annotations needed
|
|
||||||
--> $DIR/alias_eq_dont_use_normalizes_to_if_substs_eq.rs:38:41
|
|
||||||
|
|
|
||||||
LL | let _: <() as Foo<u16, T>>::Assoc = output::<_, T>();
|
|
||||||
| ^^^^^^^^^^^^^^ cannot infer type of the type parameter `T` declared on the function `output`
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0282`.
|
|
|
@ -1,5 +1,8 @@
|
||||||
// compile-flags: -Ztrait-solver=next
|
// compile-flags: -Ztrait-solver=next
|
||||||
|
|
||||||
|
// check-pass
|
||||||
|
// (should not pass, should be turned into a coherence-only test)
|
||||||
|
|
||||||
// check that a `alias-eq(<?0 as TraitB>::Assoc, <T as TraitB>::Assoc)` goal fails.
|
// check that a `alias-eq(<?0 as TraitB>::Assoc, <T as TraitB>::Assoc)` goal fails.
|
||||||
|
|
||||||
// FIXME(deferred_projection_equality): add a test that this is true during coherence
|
// FIXME(deferred_projection_equality): add a test that this is true during coherence
|
||||||
|
@ -14,7 +17,6 @@ fn needs_a<T: TraitB>() -> T::Assoc {
|
||||||
|
|
||||||
fn bar<T: TraitB>() {
|
fn bar<T: TraitB>() {
|
||||||
let _: <_ as TraitB>::Assoc = needs_a::<T>();
|
let _: <_ as TraitB>::Assoc = needs_a::<T>();
|
||||||
//~^ error: type annotations needed
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
error[E0282]: type annotations needed
|
|
||||||
--> $DIR/alias_eq_substs_eq_not_intercrate.rs:16:12
|
|
||||||
|
|
|
||||||
LL | let _: <_ as TraitB>::Assoc = needs_a::<T>();
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^ cannot infer type for associated type `<_ as TraitB>::Assoc`
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0282`.
|
|
Loading…
Add table
Add a link
Reference in a new issue