mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Strongly prefer alias and param-env bounds
This commit is contained in:
parent
a2d806d56d
commit
97c11ffb22
@ -2,7 +2,6 @@
|
||||
|
||||
use super::search_graph::OverflowHandler;
|
||||
use super::{EvalCtxt, SolverMode};
|
||||
use crate::solve::CanonicalResponseExt;
|
||||
use crate::traits::coherence;
|
||||
use rustc_data_structures::fx::FxIndexSet;
|
||||
use rustc_hir::def_id::DefId;
|
||||
@ -744,13 +743,18 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
||||
SolverMode::Normal => {
|
||||
let param_env_responses = candidates
|
||||
.iter()
|
||||
.filter(|c| matches!(c.source, CandidateSource::ParamEnv(_)))
|
||||
.filter(|c| {
|
||||
matches!(
|
||||
c.source,
|
||||
CandidateSource::ParamEnv(_) | CandidateSource::AliasBound
|
||||
)
|
||||
})
|
||||
.map(|c| c.result)
|
||||
.collect::<Vec<_>>();
|
||||
if let Some(result) = self.try_merge_responses(¶m_env_responses) {
|
||||
if result.has_only_region_constraints() {
|
||||
return Ok(result);
|
||||
}
|
||||
// We strongly prefer alias and param-env bounds here, even if they affect inference.
|
||||
// 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
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/param-env-infer.rs:12:10
|
||||
--> $DIR/param-env-infer.rs:13:10
|
||||
|
|
||||
LL | t as _
|
||||
| ^ 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: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/param-env-infer.rs:12:10
|
||||
error[E0391]: cycle detected when computing type of `make_dyn_star::{opaque#0}`
|
||||
--> $DIR/param-env-infer.rs:11:60
|
||||
|
|
||||
LL | t as _
|
||||
| ^ cannot infer type
|
||||
LL | fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
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
|
||||
|
||||
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;
|
||||
|
||||
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 _
|
||||
//~^ ERROR type annotations needed
|
||||
//[current]~^ ERROR type annotations needed
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,5 +1,8 @@
|
||||
// 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)`
|
||||
// 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.
|
||||
@ -36,7 +39,6 @@ where
|
||||
{
|
||||
// `<() as Foo<u16, STOP>>::Assoc == <() as Foo<_, STOP>>::Assoc`
|
||||
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::<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
|
||||
|
||||
// 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.
|
||||
|
||||
// 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>() {
|
||||
let _: <_ as TraitB>::Assoc = needs_a::<T>();
|
||||
//~^ error: type annotations needed
|
||||
}
|
||||
|
||||
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…
Reference in New Issue
Block a user