next-solver: normalize in LoweredTy::from_raw
This commit is contained in:
parent
1fc46f3a8f
commit
a39a2f73d6
7 changed files with 59 additions and 13 deletions
|
@ -369,6 +369,14 @@ pub struct LoweredTy<'tcx> {
|
||||||
|
|
||||||
impl<'tcx> LoweredTy<'tcx> {
|
impl<'tcx> LoweredTy<'tcx> {
|
||||||
pub fn from_raw(fcx: &FnCtxt<'_, 'tcx>, span: Span, raw: Ty<'tcx>) -> LoweredTy<'tcx> {
|
pub fn from_raw(fcx: &FnCtxt<'_, 'tcx>, span: Span, raw: Ty<'tcx>) -> LoweredTy<'tcx> {
|
||||||
LoweredTy { raw, normalized: fcx.normalize(span, raw) }
|
// FIXME(-Znext-solver): We're still figuring out how to best handle
|
||||||
|
// normalization and this doesn't feel too great. We should look at this
|
||||||
|
// code again before stabilizing it.
|
||||||
|
let normalized = if fcx.next_trait_solver() {
|
||||||
|
fcx.try_structurally_resolve_type(span, raw)
|
||||||
|
} else {
|
||||||
|
fcx.normalize(span, raw)
|
||||||
|
};
|
||||||
|
LoweredTy { raw, normalized }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,15 +34,11 @@ error: the type `&mut <dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIte
|
||||||
LL | for item in *things { *item = 0 }
|
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
|
error: the type `Option<<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item>` is not well-formed
|
||||||
--> $DIR/issue-20605.rs:5:9
|
--> $DIR/issue-20605.rs:5:17
|
||||||
|
|
|
|
||||||
LL | for item in *things { *item = 0 }
|
LL | for item in *things { *item = 0 }
|
||||||
| ^^^^ doesn't have a size known at compile-time
|
| ^^^^^^^
|
||||||
|
|
|
||||||
= help: the trait `Sized` is not implemented for `<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item`
|
|
||||||
= note: all local variables must have a statically known size
|
|
||||||
= help: unsized locals are gated as an unstable feature
|
|
||||||
|
|
||||||
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
|
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:5
|
--> $DIR/issue-20605.rs:5:5
|
||||||
|
@ -54,11 +50,15 @@ LL | for item in *things { *item = 0 }
|
||||||
note: required by a bound in `None`
|
note: required by a bound in `None`
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
|
|
||||||
error: the type `Option<<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item>` is not well-formed
|
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:17
|
--> $DIR/issue-20605.rs:5:9
|
||||||
|
|
|
|
||||||
LL | for item in *things { *item = 0 }
|
LL | for item in *things { *item = 0 }
|
||||||
| ^^^^^^^
|
| ^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item`
|
||||||
|
= note: all local variables must have a statically known size
|
||||||
|
= help: unsized locals are gated as an unstable feature
|
||||||
|
|
||||||
error[E0614]: type `<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item` cannot be dereferenced
|
error[E0614]: type `<<dyn Iterator<Item = &'a mut u8> as IntoIterator>::IntoIter as Iterator>::Item` cannot be dereferenced
|
||||||
--> $DIR/issue-20605.rs:5:27
|
--> $DIR/issue-20605.rs:5:27
|
||||||
|
|
18
tests/ui/traits/next-solver/normalize-path-for-method.rs
Normal file
18
tests/ui/traits/next-solver/normalize-path-for-method.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// compile-flags: -Znext-solver
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
trait Mirror {
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
impl<T> Mirror for T {
|
||||||
|
type Assoc = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Foo;
|
||||||
|
impl Foo {
|
||||||
|
fn new() -> Self { Foo }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
<Foo as Mirror>::Assoc::new();
|
||||||
|
}
|
|
@ -16,6 +16,7 @@ fn test<T: Foo1<Assoc1 = <T as Foo2>::Assoc2> + Foo2<Assoc2 = <T as Foo1>::Assoc
|
||||||
//~^ ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
//~^ ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
||||||
//~| ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
//~| ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
||||||
//~| ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
//~| ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
||||||
|
//~| ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
||||||
//~| ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1: Bar`
|
//~| ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1: Bar`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
error[E0275]: overflow evaluating the requirement `<T as Foo1>::Assoc1 == _`
|
||||||
|
--> $DIR/recursive-self-normalization-2.rs:15:17
|
||||||
|
|
|
||||||
|
LL | needs_bar::<T::Assoc1>();
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization_2`)
|
||||||
|
|
||||||
error[E0275]: overflow evaluating the requirement `<T as Foo1>::Assoc1: Bar`
|
error[E0275]: overflow evaluating the requirement `<T as Foo1>::Assoc1: Bar`
|
||||||
--> $DIR/recursive-self-normalization-2.rs:15:17
|
--> $DIR/recursive-self-normalization-2.rs:15:17
|
||||||
|
|
|
|
||||||
|
@ -35,7 +43,8 @@ LL | needs_bar::<T::Assoc1>();
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization_2`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization_2`)
|
||||||
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0275`.
|
For more information about this error, try `rustc --explain E0275`.
|
||||||
|
|
|
@ -12,6 +12,7 @@ fn test<T: Foo<Assoc = <T as Foo>::Assoc>>() {
|
||||||
//~^ ERROR overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
//~^ ERROR overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
||||||
//~| ERROR overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
//~| ERROR overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
||||||
//~| ERROR overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
//~| ERROR overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
||||||
|
//~| ERROR overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
||||||
//~| ERROR overflow evaluating the requirement `<T as Foo>::Assoc: Bar`
|
//~| ERROR overflow evaluating the requirement `<T as Foo>::Assoc: Bar`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
error[E0275]: overflow evaluating the requirement `<T as Foo>::Assoc == _`
|
||||||
|
--> $DIR/recursive-self-normalization.rs:11:17
|
||||||
|
|
|
||||||
|
LL | needs_bar::<T::Assoc>();
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization`)
|
||||||
|
|
||||||
error[E0275]: overflow evaluating the requirement `<T as Foo>::Assoc: Bar`
|
error[E0275]: overflow evaluating the requirement `<T as Foo>::Assoc: Bar`
|
||||||
--> $DIR/recursive-self-normalization.rs:11:17
|
--> $DIR/recursive-self-normalization.rs:11:17
|
||||||
|
|
|
|
||||||
|
@ -35,7 +43,8 @@ LL | needs_bar::<T::Assoc>();
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization`)
|
||||||
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0275`.
|
For more information about this error, try `rustc --explain E0275`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue