mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Auto merge of #114616 - oli-obk:gotta_capture_'em_all, r=compiler-errors
Capture all lifetimes for TAITs and impl trait in associated types This reverts commitcb9467515b
, reversing changes made to57781b24c5
. (This is only true for the tests, the change itself was done from scratch, as the compiler has diverged sufficiently for a revert to not make sense anymore). This implements the lang team decision from this meeting: https://hackmd.io/sFaSIMJOQcuwCdnUvCxtuQ?view r? `@cjgillot` on the impl
This commit is contained in:
commit
ac02e40380
@ -129,7 +129,15 @@ fn variance_of_opaque(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Varianc
|
||||
|
||||
// By default, RPIT are invariant wrt type and const generics, but they are bivariant wrt
|
||||
// lifetime generics.
|
||||
let mut variances: Vec<_> = std::iter::repeat(ty::Invariant).take(generics.count()).collect();
|
||||
let variances = std::iter::repeat(ty::Invariant).take(generics.count());
|
||||
|
||||
let mut variances: Vec<_> = match tcx.opaque_type_origin(item_def_id) {
|
||||
rustc_hir::OpaqueTyOrigin::FnReturn(_) | rustc_hir::OpaqueTyOrigin::AsyncFn(_) => {
|
||||
variances.collect()
|
||||
}
|
||||
// But TAIT are invariant for all generics
|
||||
rustc_hir::OpaqueTyOrigin::TyAlias { .. } => return tcx.arena.alloc_from_iter(variances),
|
||||
};
|
||||
|
||||
// Mark all lifetimes from parent generics as unused (Bivariant).
|
||||
// This will be overridden later if required.
|
||||
|
@ -13,7 +13,8 @@ impl MyTy<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
type Opaque<'a> = impl Sized;
|
||||
type Opaque2 = impl Sized;
|
||||
type Opaque<'a> = Opaque2;
|
||||
fn define<'a>() -> Opaque<'a> {}
|
||||
|
||||
fn test<'a>() {
|
||||
|
@ -11,7 +11,8 @@ fn test_closure() {
|
||||
closure(&opaque());
|
||||
}
|
||||
|
||||
type Opaque<'a> = impl Sized;
|
||||
type Opaque2 = impl Sized;
|
||||
type Opaque<'a> = Opaque2;
|
||||
fn define<'a>() -> Opaque<'a> {}
|
||||
|
||||
fn test_tait(_: &Opaque<'_>) {
|
||||
|
@ -1,10 +1,6 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
pub trait Captures<'a> {}
|
||||
|
||||
impl<'a, T: ?Sized> Captures<'a> for T {}
|
||||
|
||||
type X<'a, 'b> = impl std::fmt::Debug + Captures<'a> + Captures<'b>;
|
||||
type X<'a, 'b> = impl std::fmt::Debug;
|
||||
|
||||
fn f<'t, 'u>(a: &'t u32, b: &'u u32) -> (X<'t, 'u>, X<'u, 't>) {
|
||||
(a, a)
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: concrete type differs from previous defining opaque type use
|
||||
--> $DIR/issue-86465.rs:10:5
|
||||
--> $DIR/issue-86465.rs:6:5
|
||||
|
|
||||
LL | (a, a)
|
||||
| ^^^^^^
|
||||
|
@ -1,11 +1,7 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
pub trait Captures<'a> {}
|
||||
|
||||
impl<'a, T: ?Sized> Captures<'a> for T {}
|
||||
|
||||
type OneLifetime<'a, 'b> = impl std::fmt::Debug + Captures<'a> + Captures<'b>;
|
||||
type OneLifetime<'a, 'b> = impl std::fmt::Debug;
|
||||
|
||||
fn foo<'a, 'b>(a: &'a u32, b: &'b u32) -> OneLifetime<'a, 'b> {
|
||||
a
|
||||
|
@ -1,11 +1,11 @@
|
||||
error: concrete type differs from previous defining opaque type use
|
||||
--> $DIR/different_lifetimes_defining_uses.rs:15:5
|
||||
--> $DIR/different_lifetimes_defining_uses.rs:11:5
|
||||
|
|
||||
LL | b
|
||||
| ^ expected `&'a u32`, got `&'b u32`
|
||||
|
|
||||
note: previous use here
|
||||
--> $DIR/different_lifetimes_defining_uses.rs:11:5
|
||||
--> $DIR/different_lifetimes_defining_uses.rs:7:5
|
||||
|
|
||||
LL | a
|
||||
| ^
|
||||
|
@ -2,11 +2,7 @@
|
||||
|
||||
fn main() {}
|
||||
|
||||
pub trait Captures<'a> {}
|
||||
|
||||
impl<'a, T: ?Sized> Captures<'a> for T {}
|
||||
|
||||
type Two<'a, 'b> = impl std::fmt::Debug + Captures<'a> + Captures<'b>;
|
||||
type Two<'a, 'b> = impl std::fmt::Debug;
|
||||
|
||||
fn one<'a>(t: &'a ()) -> Two<'a, 'a> {
|
||||
//~^ ERROR non-defining opaque type use
|
||||
|
@ -1,25 +1,25 @@
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:11:26
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:7:26
|
||||
|
|
||||
LL | fn one<'a>(t: &'a ()) -> Two<'a, 'a> {
|
||||
| ^^^^^^^^^^^ generic argument `'a` used twice
|
||||
|
|
||||
note: for this opaque type
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:9:20
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:5:20
|
||||
|
|
||||
LL | type Two<'a, 'b> = impl std::fmt::Debug + Captures<'a> + Captures<'b>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
LL | type Two<'a, 'b> = impl std::fmt::Debug;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:13:5
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:9:5
|
||||
|
|
||||
LL | t
|
||||
| ^
|
||||
|
|
||||
note: lifetime used multiple times
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:9:10
|
||||
--> $DIR/generic_duplicate_lifetime_param.rs:5:10
|
||||
|
|
||||
LL | type Two<'a, 'b> = impl std::fmt::Debug + Captures<'a> + Captures<'b>;
|
||||
LL | type Two<'a, 'b> = impl std::fmt::Debug;
|
||||
| ^^ ^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -14,11 +14,7 @@ fn main() {}
|
||||
// test that unused generic parameters are ok
|
||||
type TwoTys<T, U> = impl Debug;
|
||||
|
||||
pub trait Captures<'a> {}
|
||||
|
||||
impl<'a, T: ?Sized> Captures<'a> for T {}
|
||||
|
||||
type TwoLifetimes<'a, 'b> = impl Debug + Captures<'a> + Captures<'b>;
|
||||
type TwoLifetimes<'a, 'b> = impl Debug;
|
||||
|
||||
type TwoConsts<const X: usize, const Y: usize> = impl Debug;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_param_use.rs:25:30
|
||||
--> $DIR/generic_duplicate_param_use.rs:21:30
|
||||
|
|
||||
LL | fn one_ty<T: Debug>(t: T) -> TwoTys<T, T> {
|
||||
| ^^^^^^^^^^^^ generic argument `T` used twice
|
||||
@ -11,7 +11,7 @@ LL | type TwoTys<T, U> = impl Debug;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_param_use.rs:27:5
|
||||
--> $DIR/generic_duplicate_param_use.rs:23:5
|
||||
|
|
||||
LL | t
|
||||
| ^
|
||||
@ -23,49 +23,49 @@ LL | type TwoTys<T, U> = impl Debug;
|
||||
| ^ ^
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_param_use.rs:31:36
|
||||
--> $DIR/generic_duplicate_param_use.rs:27:36
|
||||
|
|
||||
LL | fn one_lifetime<'a>(t: &'a u32) -> TwoLifetimes<'a, 'a> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^ generic argument `'a` used twice
|
||||
|
|
||||
note: for this opaque type
|
||||
--> $DIR/generic_duplicate_param_use.rs:21:29
|
||||
--> $DIR/generic_duplicate_param_use.rs:17:29
|
||||
|
|
||||
LL | type TwoLifetimes<'a, 'b> = impl Debug + Captures<'a> + Captures<'b>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
LL | type TwoLifetimes<'a, 'b> = impl Debug;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_param_use.rs:33:5
|
||||
--> $DIR/generic_duplicate_param_use.rs:29:5
|
||||
|
|
||||
LL | t
|
||||
| ^
|
||||
|
|
||||
note: lifetime used multiple times
|
||||
--> $DIR/generic_duplicate_param_use.rs:21:19
|
||||
--> $DIR/generic_duplicate_param_use.rs:17:19
|
||||
|
|
||||
LL | type TwoLifetimes<'a, 'b> = impl Debug + Captures<'a> + Captures<'b>;
|
||||
LL | type TwoLifetimes<'a, 'b> = impl Debug;
|
||||
| ^^ ^^
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_param_use.rs:37:50
|
||||
--> $DIR/generic_duplicate_param_use.rs:33:50
|
||||
|
|
||||
LL | fn one_const<const N: usize>(t: *mut [u8; N]) -> TwoConsts<N, N> {
|
||||
| ^^^^^^^^^^^^^^^ generic argument `N` used twice
|
||||
|
|
||||
note: for this opaque type
|
||||
--> $DIR/generic_duplicate_param_use.rs:23:50
|
||||
--> $DIR/generic_duplicate_param_use.rs:19:50
|
||||
|
|
||||
LL | type TwoConsts<const X: usize, const Y: usize> = impl Debug;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: non-defining opaque type use in defining scope
|
||||
--> $DIR/generic_duplicate_param_use.rs:39:5
|
||||
--> $DIR/generic_duplicate_param_use.rs:35:5
|
||||
|
|
||||
LL | t
|
||||
| ^
|
||||
|
|
||||
note: constant used multiple times
|
||||
--> $DIR/generic_duplicate_param_use.rs:23:16
|
||||
--> $DIR/generic_duplicate_param_use.rs:19:16
|
||||
|
|
||||
LL | type TwoConsts<const X: usize, const Y: usize> = impl Debug;
|
||||
| ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
|
||||
|
@ -1,11 +1,10 @@
|
||||
// check-pass
|
||||
// build-pass (FIXME(62277): could be check-pass?)
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
fn main() {}
|
||||
|
||||
type Region<'a> = impl std::fmt::Debug + 'a;
|
||||
|
||||
type Region<'a> = impl std::fmt::Debug;
|
||||
|
||||
fn region<'b>(a: &'b ()) -> Region<'b> {
|
||||
a
|
||||
|
@ -1,7 +1,7 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
mod test_lifetime_param {
|
||||
type Ty<'a> = impl Sized + 'a;
|
||||
type Ty<'a> = impl Sized;
|
||||
fn defining(a: &str) -> Ty<'_> { a }
|
||||
fn assert_static<'a: 'static>() {}
|
||||
fn test<'a>() where Ty<'a>: 'static { assert_static::<'a>() }
|
||||
@ -9,7 +9,7 @@ mod test_lifetime_param {
|
||||
}
|
||||
|
||||
mod test_higher_kinded_lifetime_param {
|
||||
type Ty<'a> = impl Sized + 'a;
|
||||
type Ty<'a> = impl Sized;
|
||||
fn defining(a: &str) -> Ty<'_> { a }
|
||||
fn assert_static<'a: 'static>() {}
|
||||
fn test<'a>() where for<'b> Ty<'b>: 'a { assert_static::<'a>() }
|
||||
|
@ -1,16 +1,20 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(impl_trait_in_assoc_type)]
|
||||
#![feature(impl_trait_in_assoc_type, type_alias_impl_trait)]
|
||||
|
||||
trait Callable {
|
||||
type Output;
|
||||
fn call() -> Self::Output;
|
||||
}
|
||||
mod foo {
|
||||
pub trait Callable {
|
||||
type Output;
|
||||
fn call() -> Self::Output;
|
||||
}
|
||||
|
||||
impl<'a> Callable for &'a () {
|
||||
type Output = impl Sized;
|
||||
fn call() -> Self::Output {}
|
||||
pub type OutputHelper = impl Sized;
|
||||
impl<'a> Callable for &'a () {
|
||||
type Output = OutputHelper;
|
||||
fn call() -> Self::Output {}
|
||||
}
|
||||
}
|
||||
use foo::*;
|
||||
|
||||
fn test<'a>() -> impl Sized {
|
||||
<&'a () as Callable>::call()
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
use std::future::Future;
|
||||
|
||||
type G<'a, T> = impl Future<Output = ()> + 'a;
|
||||
type G<'a, T> = impl Future<Output = ()>;
|
||||
|
||||
trait Trait {
|
||||
type F: Future<Output = ()>;
|
||||
|
@ -6,7 +6,7 @@ LL | async move { self.f().await }
|
||||
|
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
LL | type G<'a, T: Trait> = impl Future<Output = ()> + 'a;
|
||||
LL | type G<'a, T: Trait> = impl Future<Output = ()>;
|
||||
| +++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,7 +1,8 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
type Opaque<'a, T> = impl Sized;
|
||||
type Opaque2<T> = impl Sized;
|
||||
type Opaque<'a, T> = Opaque2<T>;
|
||||
fn defining<'a, T>(x: &'a i32) -> Opaque<T> { x }
|
||||
//~^ ERROR: hidden type for `Opaque<'a, T>` captures lifetime that does not appear in bounds
|
||||
//~^ ERROR: hidden type for `Opaque2<T>` captures lifetime that does not appear in bounds
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,8 +1,9 @@
|
||||
error[E0700]: hidden type for `Opaque<'a, T>` captures lifetime that does not appear in bounds
|
||||
--> $DIR/missing_lifetime_bound.rs:4:47
|
||||
error[E0700]: hidden type for `Opaque2<T>` captures lifetime that does not appear in bounds
|
||||
--> $DIR/missing_lifetime_bound.rs:5:47
|
||||
|
|
||||
LL | type Opaque<'a, T> = impl Sized;
|
||||
| ---------- opaque type defined here
|
||||
LL | type Opaque2<T> = impl Sized;
|
||||
| ---------- opaque type defined here
|
||||
LL | type Opaque<'a, T> = Opaque2<T>;
|
||||
LL | fn defining<'a, T>(x: &'a i32) -> Opaque<T> { x }
|
||||
| -- ^
|
||||
| |
|
||||
|
@ -1,10 +1,6 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
pub trait Captures<'a> {}
|
||||
|
||||
impl<'a, T: ?Sized> Captures<'a> for T {}
|
||||
|
||||
type Foo<'a, 'b> = impl std::fmt::Debug + Captures<'a> + Captures<'b>;
|
||||
type Foo<'a, 'b> = impl std::fmt::Debug;
|
||||
|
||||
fn foo<'x, 'y>(i: &'x i32, j: &'y i32) -> (Foo<'x, 'y>, Foo<'y, 'x>) {
|
||||
(i, i) //~ ERROR concrete type differs from previous
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: concrete type differs from previous defining opaque type use
|
||||
--> $DIR/multiple-def-uses-in-one-fn-lifetimes.rs:10:5
|
||||
--> $DIR/multiple-def-uses-in-one-fn-lifetimes.rs:6:5
|
||||
|
|
||||
LL | (i, i)
|
||||
| ^^^^^^
|
||||
|
@ -7,11 +7,7 @@ fn f<A: ToString + Clone, B: ToString + Clone>(a: A, b: B) -> (X<A, B>, X<A, B>)
|
||||
(a.clone(), a)
|
||||
}
|
||||
|
||||
pub trait Captures<'a> {}
|
||||
|
||||
impl<'a, T: ?Sized> Captures<'a> for T {}
|
||||
|
||||
type Foo<'a, 'b> = impl std::fmt::Debug + Captures<'a> + Captures<'b>;
|
||||
type Foo<'a, 'b> = impl std::fmt::Debug;
|
||||
|
||||
fn foo<'x, 'y>(i: &'x i32, j: &'y i32) -> (Foo<'x, 'y>, Foo<'y, 'x>) {
|
||||
(i, j)
|
||||
|
@ -22,9 +22,9 @@ fn bar() {
|
||||
}
|
||||
|
||||
// desugared
|
||||
type FooX<'a> = impl Sized;
|
||||
type FooX = impl Sized;
|
||||
impl<'a> Foo<'a> {
|
||||
fn foo(&self) -> FooX<'a> {}
|
||||
fn foo(&self) -> FooX {}
|
||||
}
|
||||
|
||||
// use site
|
||||
|
50
tests/ui/type-alias-impl-trait/variance.rs
Normal file
50
tests/ui/type-alias-impl-trait/variance.rs
Normal file
@ -0,0 +1,50 @@
|
||||
#![feature(rustc_attrs, type_alias_impl_trait, impl_trait_in_assoc_type)]
|
||||
#![allow(internal_features)]
|
||||
#![rustc_variance_of_opaques]
|
||||
|
||||
trait Captures<'a> {}
|
||||
impl<T> Captures<'_> for T {}
|
||||
|
||||
type NotCapturedEarly<'a> = impl Sized; //~ [o]
|
||||
|
||||
type CapturedEarly<'a> = impl Sized + Captures<'a>; //~ [o]
|
||||
|
||||
type NotCapturedLate<'a> = dyn for<'b> Iterator<Item = impl Sized>; //~ [o]
|
||||
|
||||
type CapturedLate<'a> = dyn for<'b> Iterator<Item = impl Sized + Captures<'b>>; //~ [o]
|
||||
|
||||
type Captured<'a> = dyn for<'b> Iterator<Item = impl Sized + Captures<'a> + Captures<'b>>; //~ [o]
|
||||
|
||||
type Bar<'a, 'b: 'b, T> = impl Sized; //~ ERROR [o, o, o]
|
||||
|
||||
trait Foo<'i> {
|
||||
type ImplicitCapturedEarly<'a>;
|
||||
|
||||
type ExplicitCaptureEarly<'a>;
|
||||
|
||||
type ImplicitCaptureLate<'a>;
|
||||
|
||||
type ExplicitCaptureLate<'a>;
|
||||
}
|
||||
|
||||
impl<'i> Foo<'i> for &'i () {
|
||||
type ImplicitCapturedEarly<'a> = impl Sized; //~ [o, o]
|
||||
|
||||
type ExplicitCaptureEarly<'a> = impl Sized + Captures<'i>; //~ [o, o]
|
||||
|
||||
type ImplicitCaptureLate<'a> = impl Sized; //~ [o, o]
|
||||
|
||||
type ExplicitCaptureLate<'a> = impl Sized + Captures<'a>; //~ [o, o]
|
||||
}
|
||||
|
||||
impl<'i> Foo<'i> for () {
|
||||
type ImplicitCapturedEarly<'a> = impl Sized; //~ [o, o]
|
||||
|
||||
type ExplicitCaptureEarly<'a> = impl Sized + Captures<'i>; //~ [o, o]
|
||||
|
||||
type ImplicitCaptureLate<'a> = impl Sized; //~ [o, o]
|
||||
|
||||
type ExplicitCaptureLate<'a> = impl Sized + Captures<'a>; //~ [o, o]
|
||||
}
|
||||
|
||||
fn main() {}
|
86
tests/ui/type-alias-impl-trait/variance.stderr
Normal file
86
tests/ui/type-alias-impl-trait/variance.stderr
Normal file
@ -0,0 +1,86 @@
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:8:29
|
||||
|
|
||||
LL | type NotCapturedEarly<'a> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:10:26
|
||||
|
|
||||
LL | type CapturedEarly<'a> = impl Sized + Captures<'a>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:12:56
|
||||
|
|
||||
LL | type NotCapturedLate<'a> = dyn for<'b> Iterator<Item = impl Sized>;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:14:53
|
||||
|
|
||||
LL | type CapturedLate<'a> = dyn for<'b> Iterator<Item = impl Sized + Captures<'b>>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: [o]
|
||||
--> $DIR/variance.rs:16:49
|
||||
|
|
||||
LL | type Captured<'a> = dyn for<'b> Iterator<Item = impl Sized + Captures<'a> + Captures<'b>>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: [o, o, o]
|
||||
--> $DIR/variance.rs:18:27
|
||||
|
|
||||
LL | type Bar<'a, 'b: 'b, T> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:31:38
|
||||
|
|
||||
LL | type ImplicitCapturedEarly<'a> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:33:37
|
||||
|
|
||||
LL | type ExplicitCaptureEarly<'a> = impl Sized + Captures<'i>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:35:36
|
||||
|
|
||||
LL | type ImplicitCaptureLate<'a> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:37:36
|
||||
|
|
||||
LL | type ExplicitCaptureLate<'a> = impl Sized + Captures<'a>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:41:38
|
||||
|
|
||||
LL | type ImplicitCapturedEarly<'a> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:43:37
|
||||
|
|
||||
LL | type ExplicitCaptureEarly<'a> = impl Sized + Captures<'i>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:45:36
|
||||
|
|
||||
LL | type ImplicitCaptureLate<'a> = impl Sized;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: [o, o]
|
||||
--> $DIR/variance.rs:47:36
|
||||
|
|
||||
LL | type ExplicitCaptureLate<'a> = impl Sized + Captures<'a>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 14 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user