suppress fulfillment errors for super projections
This commit is contained in:
parent
443c816261
commit
aa55f6daa2
@ -1389,38 +1389,45 @@ fn error_implies(&self, cond: ty::Predicate<'tcx>, error: ty::Predicate<'tcx>) -
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: It should be possible to deal with `ForAll` in a cleaner way.
|
if let Some(error) = error.to_opt_poly_trait_pred() {
|
||||||
let bound_error = error.kind();
|
elaborate(self.tcx, std::iter::once(cond))
|
||||||
let (cond, error) = match (cond.kind().skip_binder(), bound_error.skip_binder()) {
|
.filter_map(|implied| implied.to_opt_poly_trait_pred())
|
||||||
(
|
.any(|implied| {
|
||||||
ty::PredicateKind::Clause(ty::ClauseKind::Trait(..)),
|
if error.polarity() != implied.polarity() {
|
||||||
ty::PredicateKind::Clause(ty::ClauseKind::Trait(error)),
|
return false;
|
||||||
) => (cond, bound_error.rebind(error)),
|
}
|
||||||
_ => {
|
let error = error.to_poly_trait_ref();
|
||||||
// FIXME: make this work in other cases too.
|
let implied = implied.to_poly_trait_ref();
|
||||||
return false;
|
// FIXME: I'm just not taking associated types at all here.
|
||||||
}
|
// Eventually I'll need to implement param-env-aware
|
||||||
};
|
// `Γ₁ ⊦ φ₁ => Γ₂ ⊦ φ₂` logic.
|
||||||
|
let param_env = ty::ParamEnv::empty();
|
||||||
for pred in elaborate(self.tcx, std::iter::once(cond)) {
|
let is_implied = self.can_sub(param_env, error, implied);
|
||||||
let bound_predicate = pred.kind();
|
if is_implied {
|
||||||
if let ty::PredicateKind::Clause(ty::ClauseKind::Trait(implication)) =
|
debug!("error_implies: {:?} -> {:?} -> {:?}", cond, error, implied);
|
||||||
bound_predicate.skip_binder()
|
}
|
||||||
{
|
is_implied
|
||||||
let error = error.to_poly_trait_ref();
|
})
|
||||||
let implication = bound_predicate.rebind(implication.trait_ref);
|
} else if let Some(error) = error.to_opt_poly_projection_pred() {
|
||||||
// FIXME: I'm just not taking associated types at all here.
|
self.enter_forall(error, |error| {
|
||||||
// Eventually I'll need to implement param-env-aware
|
elaborate(self.tcx, std::iter::once(cond))
|
||||||
// `Γ₁ ⊦ φ₁ => Γ₂ ⊦ φ₂` logic.
|
.filter_map(|implied| implied.to_opt_poly_projection_pred())
|
||||||
let param_env = ty::ParamEnv::empty();
|
.any(|implied| {
|
||||||
if self.can_sub(param_env, error, implication) {
|
self.enter_forall(implied, |implied| {
|
||||||
debug!("error_implies: {:?} -> {:?} -> {:?}", cond, error, implication);
|
let param_env = ty::ParamEnv::empty();
|
||||||
return true;
|
let is_implied =
|
||||||
}
|
self.can_eq(param_env, error.projection_ty, implied.projection_ty)
|
||||||
}
|
&& self.can_eq(param_env, error.term, implied.term);
|
||||||
|
if is_implied {
|
||||||
|
debug!("error_implies: {:?} -> {:?} -> {:?}", cond, error, implied);
|
||||||
|
}
|
||||||
|
is_implied
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(skip(self), level = "debug")]
|
#[instrument(skip(self), level = "debug")]
|
||||||
|
@ -5,5 +5,4 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
for _ in HashMap::new().iter().cloned() {} //~ ERROR expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but it yields `(&_, &_)`
|
for _ in HashMap::new().iter().cloned() {} //~ ERROR expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but it yields `(&_, &_)`
|
||||||
//~^ ERROR expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but it yields `(&_, &_)`
|
//~^ ERROR expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but it yields `(&_, &_)`
|
||||||
//~| ERROR expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but it yields `(&_, &_)`
|
|
||||||
}
|
}
|
||||||
|
@ -27,16 +27,6 @@ LL | for _ in HashMap::new().iter().cloned() {}
|
|||||||
= note: required for `Cloned<std::collections::hash_map::Iter<'_, _, _>>` to implement `Iterator`
|
= note: required for `Cloned<std::collections::hash_map::Iter<'_, _, _>>` to implement `Iterator`
|
||||||
= note: required for `Cloned<std::collections::hash_map::Iter<'_, _, _>>` to implement `IntoIterator`
|
= note: required for `Cloned<std::collections::hash_map::Iter<'_, _, _>>` to implement `IntoIterator`
|
||||||
|
|
||||||
error[E0271]: expected `Iter<'_, _, _>` to be an iterator that yields `&_`, but it yields `(&_, &_)`
|
error: aborting due to 2 previous errors
|
||||||
--> $DIR/issue-33941.rs:6:14
|
|
||||||
|
|
|
||||||
LL | for _ in HashMap::new().iter().cloned() {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(&_, &_)`, found `&_`
|
|
||||||
|
|
|
||||||
= note: expected tuple `(&_, &_)`
|
|
||||||
found reference `&_`
|
|
||||||
= note: required for `Cloned<std::collections::hash_map::Iter<'_, _, _>>` to implement `Iterator`
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0271`.
|
For more information about this error, try `rustc --explain E0271`.
|
||||||
|
@ -9,12 +9,10 @@ trait Sub: Super<Assoc = u16> {}
|
|||||||
trait BoundOnSelf: Sub {}
|
trait BoundOnSelf: Sub {}
|
||||||
impl BoundOnSelf for () {}
|
impl BoundOnSelf for () {}
|
||||||
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
||||||
//~| ERROR type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
||||||
trait BoundOnParam<T: Sub> {}
|
trait BoundOnParam<T: Sub> {}
|
||||||
impl BoundOnParam<()> for () {}
|
impl BoundOnParam<()> for () {}
|
||||||
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
||||||
//~| ERROR type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
||||||
trait BoundOnAssoc {
|
trait BoundOnAssoc {
|
||||||
type Assoc: Sub;
|
type Assoc: Sub;
|
||||||
@ -22,7 +20,6 @@ trait BoundOnAssoc {
|
|||||||
impl BoundOnAssoc for () {
|
impl BoundOnAssoc for () {
|
||||||
type Assoc = ();
|
type Assoc = ();
|
||||||
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
||||||
//~| ERROR type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trait BoundOnGat where Self::Assoc<u8>: Sub {
|
trait BoundOnGat where Self::Assoc<u8>: Sub {
|
||||||
@ -31,11 +28,9 @@ trait BoundOnGat where Self::Assoc<u8>: Sub {
|
|||||||
impl BoundOnGat for u8 {
|
impl BoundOnGat for u8 {
|
||||||
type Assoc<T> = ();
|
type Assoc<T> = ();
|
||||||
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
||||||
//~| ERROR type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn trivial_bound() where (): Sub {}
|
fn trivial_bound() where (): Sub {}
|
||||||
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
//~^ ERROR the trait bound `(): Sub` is not satisfied
|
||||||
//~| ERROR type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -15,30 +15,8 @@ note: required by a bound in `BoundOnSelf`
|
|||||||
LL | trait BoundOnSelf: Sub {}
|
LL | trait BoundOnSelf: Sub {}
|
||||||
| ^^^ required by this bound in `BoundOnSelf`
|
| ^^^ required by this bound in `BoundOnSelf`
|
||||||
|
|
||||||
error[E0271]: type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:10:22
|
|
||||||
|
|
|
||||||
LL | impl BoundOnSelf for () {}
|
|
||||||
| ^^ type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
|
||||||
note: expected this to be `u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:5:18
|
|
||||||
|
|
|
||||||
LL | type Assoc = u8;
|
|
||||||
| ^^
|
|
||||||
note: required for `()` to implement `Sub`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:7:7
|
|
||||||
|
|
|
||||||
LL | trait Sub: Super<Assoc = u16> {}
|
|
||||||
| ^^^
|
|
||||||
note: required by a bound in `BoundOnSelf`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:9:20
|
|
||||||
|
|
|
||||||
LL | trait BoundOnSelf: Sub {}
|
|
||||||
| ^^^ required by this bound in `BoundOnSelf`
|
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): Sub` is not satisfied
|
error[E0277]: the trait bound `(): Sub` is not satisfied
|
||||||
--> $DIR/super-assoc-mismatch.rs:15:27
|
--> $DIR/super-assoc-mismatch.rs:14:27
|
||||||
|
|
|
|
||||||
LL | impl BoundOnParam<()> for () {}
|
LL | impl BoundOnParam<()> for () {}
|
||||||
| ^^ the trait `Sub` is not implemented for `()`
|
| ^^ the trait `Sub` is not implemented for `()`
|
||||||
@ -49,35 +27,13 @@ help: this trait has no implementations, consider adding one
|
|||||||
LL | trait Sub: Super<Assoc = u16> {}
|
LL | trait Sub: Super<Assoc = u16> {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
note: required by a bound in `BoundOnParam`
|
note: required by a bound in `BoundOnParam`
|
||||||
--> $DIR/super-assoc-mismatch.rs:14:23
|
--> $DIR/super-assoc-mismatch.rs:13:23
|
||||||
|
|
|
||||||
LL | trait BoundOnParam<T: Sub> {}
|
|
||||||
| ^^^ required by this bound in `BoundOnParam`
|
|
||||||
|
|
||||||
error[E0271]: type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:15:27
|
|
||||||
|
|
|
||||||
LL | impl BoundOnParam<()> for () {}
|
|
||||||
| ^^ type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
|
||||||
note: expected this to be `u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:5:18
|
|
||||||
|
|
|
||||||
LL | type Assoc = u8;
|
|
||||||
| ^^
|
|
||||||
note: required for `()` to implement `Sub`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:7:7
|
|
||||||
|
|
|
||||||
LL | trait Sub: Super<Assoc = u16> {}
|
|
||||||
| ^^^
|
|
||||||
note: required by a bound in `BoundOnParam`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:14:23
|
|
||||||
|
|
|
|
||||||
LL | trait BoundOnParam<T: Sub> {}
|
LL | trait BoundOnParam<T: Sub> {}
|
||||||
| ^^^ required by this bound in `BoundOnParam`
|
| ^^^ required by this bound in `BoundOnParam`
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): Sub` is not satisfied
|
error[E0277]: the trait bound `(): Sub` is not satisfied
|
||||||
--> $DIR/super-assoc-mismatch.rs:23:18
|
--> $DIR/super-assoc-mismatch.rs:21:18
|
||||||
|
|
|
|
||||||
LL | type Assoc = ();
|
LL | type Assoc = ();
|
||||||
| ^^ the trait `Sub` is not implemented for `()`
|
| ^^ the trait `Sub` is not implemented for `()`
|
||||||
@ -88,35 +44,13 @@ help: this trait has no implementations, consider adding one
|
|||||||
LL | trait Sub: Super<Assoc = u16> {}
|
LL | trait Sub: Super<Assoc = u16> {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
note: required by a bound in `BoundOnAssoc::Assoc`
|
note: required by a bound in `BoundOnAssoc::Assoc`
|
||||||
--> $DIR/super-assoc-mismatch.rs:20:17
|
--> $DIR/super-assoc-mismatch.rs:18:17
|
||||||
|
|
|
||||||
LL | type Assoc: Sub;
|
|
||||||
| ^^^ required by this bound in `BoundOnAssoc::Assoc`
|
|
||||||
|
|
||||||
error[E0271]: type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:23:18
|
|
||||||
|
|
|
||||||
LL | type Assoc = ();
|
|
||||||
| ^^ type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
|
||||||
note: expected this to be `u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:5:18
|
|
||||||
|
|
|
||||||
LL | type Assoc = u8;
|
|
||||||
| ^^
|
|
||||||
note: required for `<() as BoundOnAssoc>::Assoc` to implement `Sub`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:7:7
|
|
||||||
|
|
|
||||||
LL | trait Sub: Super<Assoc = u16> {}
|
|
||||||
| ^^^
|
|
||||||
note: required by a bound in `BoundOnAssoc::Assoc`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:20:17
|
|
||||||
|
|
|
|
||||||
LL | type Assoc: Sub;
|
LL | type Assoc: Sub;
|
||||||
| ^^^ required by this bound in `BoundOnAssoc::Assoc`
|
| ^^^ required by this bound in `BoundOnAssoc::Assoc`
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): Sub` is not satisfied
|
error[E0277]: the trait bound `(): Sub` is not satisfied
|
||||||
--> $DIR/super-assoc-mismatch.rs:32:21
|
--> $DIR/super-assoc-mismatch.rs:29:21
|
||||||
|
|
|
|
||||||
LL | type Assoc<T> = ();
|
LL | type Assoc<T> = ();
|
||||||
| ^^ the trait `Sub` is not implemented for `()`, which is required by `<u8 as BoundOnGat>::Assoc<u8>: Sub`
|
| ^^ the trait `Sub` is not implemented for `()`, which is required by `<u8 as BoundOnGat>::Assoc<u8>: Sub`
|
||||||
@ -127,35 +61,13 @@ help: this trait has no implementations, consider adding one
|
|||||||
LL | trait Sub: Super<Assoc = u16> {}
|
LL | trait Sub: Super<Assoc = u16> {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
note: required by a bound in `BoundOnGat`
|
note: required by a bound in `BoundOnGat`
|
||||||
--> $DIR/super-assoc-mismatch.rs:28:41
|
--> $DIR/super-assoc-mismatch.rs:25:41
|
||||||
|
|
|
||||||
LL | trait BoundOnGat where Self::Assoc<u8>: Sub {
|
|
||||||
| ^^^ required by this bound in `BoundOnGat`
|
|
||||||
|
|
||||||
error[E0271]: type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:32:21
|
|
||||||
|
|
|
||||||
LL | type Assoc<T> = ();
|
|
||||||
| ^^ type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
|
||||||
note: expected this to be `u16`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:5:18
|
|
||||||
|
|
|
||||||
LL | type Assoc = u8;
|
|
||||||
| ^^
|
|
||||||
note: required for `<u8 as BoundOnGat>::Assoc<u8>` to implement `Sub`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:7:7
|
|
||||||
|
|
|
||||||
LL | trait Sub: Super<Assoc = u16> {}
|
|
||||||
| ^^^
|
|
||||||
note: required by a bound in `BoundOnGat`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:28:41
|
|
||||||
|
|
|
|
||||||
LL | trait BoundOnGat where Self::Assoc<u8>: Sub {
|
LL | trait BoundOnGat where Self::Assoc<u8>: Sub {
|
||||||
| ^^^ required by this bound in `BoundOnGat`
|
| ^^^ required by this bound in `BoundOnGat`
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): Sub` is not satisfied
|
error[E0277]: the trait bound `(): Sub` is not satisfied
|
||||||
--> $DIR/super-assoc-mismatch.rs:37:26
|
--> $DIR/super-assoc-mismatch.rs:33:26
|
||||||
|
|
|
|
||||||
LL | fn trivial_bound() where (): Sub {}
|
LL | fn trivial_bound() where (): Sub {}
|
||||||
| ^^^^^^^ the trait `Sub` is not implemented for `()`
|
| ^^^^^^^ the trait `Sub` is not implemented for `()`
|
||||||
@ -168,21 +80,6 @@ LL | trait Sub: Super<Assoc = u16> {}
|
|||||||
= help: see issue #48214
|
= help: see issue #48214
|
||||||
= help: add `#![feature(trivial_bounds)]` to the crate attributes to enable
|
= help: add `#![feature(trivial_bounds)]` to the crate attributes to enable
|
||||||
|
|
||||||
error[E0271]: type mismatch resolving `<() as Super>::Assoc == u16`
|
error: aborting due to 5 previous errors
|
||||||
--> $DIR/super-assoc-mismatch.rs:37:26
|
|
||||||
|
|
|
||||||
LL | fn trivial_bound() where (): Sub {}
|
|
||||||
| ^^^^^^^ type mismatch resolving `<() as Super>::Assoc == u16`
|
|
||||||
|
|
|
||||||
note: expected this to be `u8`
|
|
||||||
--> $DIR/super-assoc-mismatch.rs:5:18
|
|
||||||
|
|
|
||||||
LL | type Assoc = u8;
|
|
||||||
| ^^
|
|
||||||
= help: see issue #48214
|
|
||||||
= help: add `#![feature(trivial_bounds)]` to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to 10 previous errors
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
|
|
||||||
Some errors have detailed explanations: E0271, E0277.
|
|
||||||
For more information about an error, try `rustc --explain E0271`.
|
|
||||||
|
Loading…
Reference in New Issue
Block a user