Resolve target type of coercion
This commit is contained in:
parent
fb9030d7dd
commit
ba4a2f7cb7
8 changed files with 53 additions and 50 deletions
|
@ -1012,6 +1012,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
cause: Option<ObligationCause<'tcx>>,
|
||||
) -> RelateResult<'tcx, Ty<'tcx>> {
|
||||
let source = self.try_structurally_resolve_type(expr.span, expr_ty);
|
||||
let target = self.try_structurally_resolve_type(
|
||||
cause.as_ref().map_or(expr.span, |cause| cause.span),
|
||||
target,
|
||||
);
|
||||
debug!("coercion::try({:?}: {:?} -> {:?})", expr, source, target);
|
||||
|
||||
let cause =
|
||||
|
@ -1097,8 +1101,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
where
|
||||
E: AsCoercionSite,
|
||||
{
|
||||
let prev_ty = self.resolve_vars_with_obligations(prev_ty);
|
||||
let new_ty = self.resolve_vars_with_obligations(new_ty);
|
||||
let prev_ty = self.try_structurally_resolve_type(cause.span, prev_ty);
|
||||
let new_ty = self.try_structurally_resolve_type(new.span, new_ty);
|
||||
debug!(
|
||||
"coercion::try_find_coercion_lub({:?}, {:?}, exprs={:?} exprs)",
|
||||
prev_ty,
|
||||
|
|
|
@ -34,12 +34,6 @@ error: the type `&mut <dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIte
|
|||
LL | for item in *things { *item = 0 }
|
||||
| ^^^^^^^
|
||||
|
||||
error[E0614]: type `<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item` cannot be dereferenced
|
||||
--> $DIR/issue-20605.rs:5:27
|
||||
|
|
||||
LL | for item in *things { *item = 0 }
|
||||
| ^^^^^
|
||||
|
||||
error[E0277]: the size for values of type `<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item` cannot be known at compilation time
|
||||
--> $DIR/issue-20605.rs:5:9
|
||||
|
|
||||
|
@ -66,6 +60,12 @@ LL | for item in *things { *item = 0 }
|
|||
note: required by a bound in `None`
|
||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||
|
||||
error[E0614]: type `<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item` cannot be dereferenced
|
||||
--> $DIR/issue-20605.rs:5:27
|
||||
|
|
||||
LL | for item in *things { *item = 0 }
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0277, E0614.
|
||||
|
|
11
tests/ui/lazy-type-alias/coerce-behind-lazy.current.stderr
Normal file
11
tests/ui/lazy-type-alias/coerce-behind-lazy.current.stderr
Normal file
|
@ -0,0 +1,11 @@
|
|||
warning: the feature `lazy_type_alias` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/coerce-behind-lazy.rs:5:12
|
||||
|
|
||||
LL | #![feature(lazy_type_alias)]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #112792 <https://github.com/rust-lang/rust/issues/112792> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
11
tests/ui/lazy-type-alias/coerce-behind-lazy.next.stderr
Normal file
11
tests/ui/lazy-type-alias/coerce-behind-lazy.next.stderr
Normal file
|
@ -0,0 +1,11 @@
|
|||
warning: the feature `lazy_type_alias` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/coerce-behind-lazy.rs:5:12
|
||||
|
|
||||
LL | #![feature(lazy_type_alias)]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #112792 <https://github.com/rust-lang/rust/issues/112792> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
16
tests/ui/lazy-type-alias/coerce-behind-lazy.rs
Normal file
16
tests/ui/lazy-type-alias/coerce-behind-lazy.rs
Normal file
|
@ -0,0 +1,16 @@
|
|||
// check-pass
|
||||
// revisions: current next
|
||||
//[next] compile-flags: -Ztrait-solver=next
|
||||
|
||||
#![feature(lazy_type_alias)]
|
||||
//~^ WARN the feature `lazy_type_alias` is incomplete
|
||||
|
||||
use std::any::Any;
|
||||
|
||||
type Coerce = Box<dyn Any>;
|
||||
|
||||
fn test() -> Coerce {
|
||||
Box::new(1)
|
||||
}
|
||||
|
||||
fn main() {}
|
|
@ -1,5 +1,5 @@
|
|||
// compile-flags: -Ztrait-solver=next
|
||||
// known-bug: #95863
|
||||
// check-pass
|
||||
|
||||
pub trait With {
|
||||
type F;
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/lazy-nested-obligations-2.rs:15:23
|
||||
|
|
||||
LL | let _: V<i32> = V(f);
|
||||
| - ^ types differ
|
||||
| |
|
||||
| arguments to this struct are incorrect
|
||||
|
|
||||
= note: expected associated type `<i32 as With>::F`
|
||||
found fn item `for<'a> fn(&'a str) {f}`
|
||||
= help: consider constraining the associated type `<i32 as With>::F` to `for<'a> fn(&'a str) {f}` or calling a method that returns `<i32 as With>::F`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
note: tuple struct defined here
|
||||
--> $DIR/lazy-nested-obligations-2.rs:16:16
|
||||
|
|
||||
LL | pub struct V<T: With>(<T as With>::F);
|
||||
| ^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/lazy-nested-obligations-2.rs:21:30
|
||||
|
|
||||
LL | let _: E3<i32> = E3::Var(f);
|
||||
| ------- ^ types differ
|
||||
| |
|
||||
| arguments to this enum variant are incorrect
|
||||
|
|
||||
= note: expected associated type `<i32 as With>::F`
|
||||
found fn item `for<'a> fn(&'a str) {f}`
|
||||
= help: consider constraining the associated type `<i32 as With>::F` to `for<'a> fn(&'a str) {f}` or calling a method that returns `<i32 as With>::F`
|
||||
= note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
|
||||
note: tuple variant defined here
|
||||
--> $DIR/lazy-nested-obligations-2.rs:19:9
|
||||
|
|
||||
LL | Var(<T as With>::F),
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
|
@ -1,8 +1,8 @@
|
|||
error[E0277]: the trait bound `dyn Trait<A = A, B = B>: Trait` is not satisfied
|
||||
--> $DIR/more-object-bound.rs:12:17
|
||||
--> $DIR/more-object-bound.rs:12:5
|
||||
|
|
||||
LL | foo::<A, B, dyn Trait<A = A, B = B>>(x)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `dyn Trait<A = A, B = B>`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `dyn Trait<A = A, B = B>`
|
||||
|
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/more-object-bound.rs:18:8
|
||||
|
|
Loading…
Add table
Reference in a new issue