Add opaque type test
This commit is contained in:
parent
1208eddaff
commit
53f10b936b
@ -0,0 +1,9 @@
|
|||||||
|
error[E0284]: type annotations needed: cannot satisfy `Foo == _`
|
||||||
|
--> $DIR/norm-before-method-resolution-opaque-type.rs:16:19
|
||||||
|
|
|
||||||
|
LL | fn weird_bound<X>(x: &<X as Trait<'static>>::Out<Foo>) -> X
|
||||||
|
| ^ cannot satisfy `Foo == _`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0284`.
|
@ -0,0 +1,36 @@
|
|||||||
|
error: item does not constrain `Foo::{opaque#0}`, but has it in its signature
|
||||||
|
--> $DIR/norm-before-method-resolution-opaque-type.rs:16:4
|
||||||
|
|
|
||||||
|
LL | fn weird_bound<X>(x: &<X as Trait<'static>>::Out<Foo>) -> X
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: consider moving the opaque type's declaration and defining uses into a separate module
|
||||||
|
note: this opaque type is in the signature
|
||||||
|
--> $DIR/norm-before-method-resolution-opaque-type.rs:13:12
|
||||||
|
|
|
||||||
|
LL | type Foo = impl Sized;
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error: unconstrained opaque type
|
||||||
|
--> $DIR/norm-before-method-resolution-opaque-type.rs:13:12
|
||||||
|
|
|
||||||
|
LL | type Foo = impl Sized;
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `Foo` must be used in combination with a concrete type within the same module
|
||||||
|
|
||||||
|
error[E0507]: cannot move out of `*x` which is behind a shared reference
|
||||||
|
--> $DIR/norm-before-method-resolution-opaque-type.rs:23:13
|
||||||
|
|
|
||||||
|
LL | let x = *x;
|
||||||
|
| ^^ move occurs because `*x` has type `<X as Trait<'_>>::Out<Foo>`, which does not implement the `Copy` trait
|
||||||
|
|
|
||||||
|
help: consider removing the dereference here
|
||||||
|
|
|
||||||
|
LL - let x = *x;
|
||||||
|
LL + let x = x;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0507`.
|
@ -0,0 +1,29 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
trait Trait<'a> {
|
||||||
|
type Out<U>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, T> Trait<'a> for T {
|
||||||
|
type Out<U> = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
type Foo = impl Sized;
|
||||||
|
//[old]~^ ERROR: unconstrained opaque type
|
||||||
|
|
||||||
|
fn weird_bound<X>(x: &<X as Trait<'static>>::Out<Foo>) -> X
|
||||||
|
//[old]~^ ERROR: item does not constrain
|
||||||
|
//[next]~^^ ERROR: cannot satisfy `Foo == _`
|
||||||
|
where
|
||||||
|
for<'a> X: Trait<'a>,
|
||||||
|
for<'a> <X as Trait<'a>>::Out<()>: Copy,
|
||||||
|
{
|
||||||
|
let x = *x; //[old]~ ERROR: cannot move out of `*x`
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _: () = weird_bound(&());
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
// Should pass, but we normalize and check bounds before we resolve the generics
|
// We normalize and check bounds before we resolve the generics
|
||||||
// of the function (which we know because of the return type).
|
// of the function (which we know because of the return type).
|
||||||
|
|
||||||
trait Trait<'a> {
|
trait Trait<'a> {
|
||||||
@ -12,10 +12,12 @@ impl<'a, T> Trait<'a> for T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn weird_bound<X>() -> X
|
fn weird_bound<X>() -> X
|
||||||
where
|
where
|
||||||
for<'a> X: Trait<'a>,
|
for<'a> X: Trait<'a>,
|
||||||
for<'a> <X as Trait<'a>>::Out: Copy
|
for<'a> <X as Trait<'a>>::Out: Copy,
|
||||||
{ todo!() }
|
{
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _: () = weird_bound();
|
let _: () = weird_bound();
|
||||||
|
Loading…
Reference in New Issue
Block a user