File tree Expand file tree Collapse file tree 9 files changed +230
-0
lines changed Expand file tree Collapse file tree 9 files changed +230
-0
lines changed Original file line number Diff line number Diff line change
1
+ #![ feature( type_alias_impl_trait) ]
2
+
3
+ trait Duh { }
4
+
5
+ impl Duh for i32 { }
6
+
7
+ trait Trait {
8
+ type Assoc : Duh ;
9
+ }
10
+
11
+ // the fact that `R` is the `::Output` projection on `F` causes
12
+ // an intermediate inference var to be generated which is then later
13
+ // compared against the actually found `Assoc` type.
14
+ impl < R : Duh , F : FnMut ( ) -> R > Trait for F {
15
+ type Assoc = R ;
16
+ }
17
+
18
+ type Sendable = impl Send ;
19
+
20
+ // The `Sendable` here is then later compared against the inference var
21
+ // created, causing the inference var to be set to `Sendable` instead of
22
+ // the hidden type. We already have obligations registered on the inference
23
+ // var to make it uphold the `: Duh` bound on `Trait::Assoc`. The opaque
24
+ // type does not implement `Duh`, even if its hidden type does. So we error out.
25
+ fn foo ( ) -> impl Trait < Assoc = Sendable > {
26
+ //~^ ERROR `Sendable: Duh` is not satisfied
27
+ //~| ERROR `Sendable: Duh` is not satisfied
28
+ || 42
29
+ }
30
+
31
+ fn main ( ) {
32
+ }
Original file line number Diff line number Diff line change
1
+ error[E0277]: the trait bound `Sendable: Duh` is not satisfied
2
+ --> $DIR/nested-return-type2-tait.rs:25:13
3
+ |
4
+ LL | fn foo() -> impl Trait<Assoc = Sendable> {
5
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Duh` is not implemented for `Sendable`
6
+ |
7
+ note: required because of the requirements on the impl of `Trait` for `[closure@$DIR/nested-return-type2-tait.rs:28:5: 28:10]`
8
+ --> $DIR/nested-return-type2-tait.rs:14:31
9
+ |
10
+ LL | impl<R: Duh, F: FnMut() -> R> Trait for F {
11
+ | ^^^^^ ^
12
+
13
+ error[E0277]: the trait bound `Sendable: Duh` is not satisfied
14
+ --> $DIR/nested-return-type2-tait.rs:25:42
15
+ |
16
+ LL | fn foo() -> impl Trait<Assoc = Sendable> {
17
+ | __________________________________________^
18
+ LL | |
19
+ LL | |
20
+ LL | | || 42
21
+ LL | | }
22
+ | |_^ the trait `Duh` is not implemented for `Sendable`
23
+ |
24
+ note: required because of the requirements on the impl of `Trait` for `[closure@$DIR/nested-return-type2-tait.rs:28:5: 28:10]`
25
+ --> $DIR/nested-return-type2-tait.rs:14:31
26
+ |
27
+ LL | impl<R: Duh, F: FnMut() -> R> Trait for F {
28
+ | ^^^^^ ^
29
+
30
+ error: aborting due to 2 previous errors
31
+
32
+ For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
1
+ #![ feature( type_alias_impl_trait) ]
2
+
3
+ trait Duh { }
4
+
5
+ impl Duh for i32 { }
6
+
7
+ trait Trait {
8
+ type Assoc : Duh ;
9
+ }
10
+
11
+ // the fact that `R` is the `::Output` projection on `F` causes
12
+ // an intermediate inference var to be generated which is then later
13
+ // compared against the actually found `Assoc` type.
14
+ impl < R : Duh , F : FnMut ( ) -> R > Trait for F {
15
+ type Assoc = R ;
16
+ }
17
+
18
+ type Sendable = impl Send ;
19
+ type Traitable = impl Trait < Assoc = Sendable > ;
20
+
21
+ // The `impl Send` here is then later compared against the inference var
22
+ // created, causing the inference var to be set to `impl Send` instead of
23
+ // the hidden type. We already have obligations registered on the inference
24
+ // var to make it uphold the `: Duh` bound on `Trait::Assoc`. The opaque
25
+ // type does not implement `Duh`, even if its hidden type does. So we error out.
26
+ fn foo ( ) -> Traitable {
27
+ || 42
28
+ //~^ ERROR `Sendable: Duh` is not satisfied
29
+ }
30
+
31
+ fn main ( ) {
32
+ }
Original file line number Diff line number Diff line change
1
+ error[E0277]: the trait bound `Sendable: Duh` is not satisfied
2
+ --> $DIR/nested-return-type2-tait2.rs:27:5
3
+ |
4
+ LL | || 42
5
+ | ^^^^^ the trait `Duh` is not implemented for `Sendable`
6
+ |
7
+ note: required because of the requirements on the impl of `Trait` for `[closure@$DIR/nested-return-type2-tait2.rs:27:5: 27:10]`
8
+ --> $DIR/nested-return-type2-tait2.rs:14:31
9
+ |
10
+ LL | impl<R: Duh, F: FnMut() -> R> Trait for F {
11
+ | ^^^^^ ^
12
+
13
+ error: aborting due to previous error
14
+
15
+ For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
1
+ #![ feature( type_alias_impl_trait) ]
2
+
3
+ trait Duh { }
4
+
5
+ impl Duh for i32 { }
6
+
7
+ trait Trait {
8
+ type Assoc : Duh ;
9
+ }
10
+
11
+ // the fact that `R` is the `::Output` projection on `F` causes
12
+ // an intermediate inference var to be generated which is then later
13
+ // compared against the actually found `Assoc` type.
14
+ impl < R : Duh , F : FnMut ( ) -> R > Trait for F {
15
+ type Assoc = R ;
16
+ }
17
+
18
+ type Traitable = impl Trait < Assoc = impl Send > ;
19
+
20
+ // The `impl Send` here is then later compared against the inference var
21
+ // created, causing the inference var to be set to `impl Send` instead of
22
+ // the hidden type. We already have obligations registered on the inference
23
+ // var to make it uphold the `: Duh` bound on `Trait::Assoc`. The opaque
24
+ // type does not implement `Duh`, even if its hidden type does. So we error out.
25
+ fn foo ( ) -> Traitable {
26
+ || 42
27
+ //~^ ERROR `impl Send: Duh` is not satisfied
28
+ }
29
+
30
+ fn main ( ) {
31
+ }
Original file line number Diff line number Diff line change
1
+ error[E0277]: the trait bound `impl Send: Duh` is not satisfied
2
+ --> $DIR/nested-return-type2-tait3.rs:26:5
3
+ |
4
+ LL | || 42
5
+ | ^^^^^ the trait `Duh` is not implemented for `impl Send`
6
+ |
7
+ note: required because of the requirements on the impl of `Trait` for `[closure@$DIR/nested-return-type2-tait3.rs:26:5: 26:10]`
8
+ --> $DIR/nested-return-type2-tait3.rs:14:31
9
+ |
10
+ LL | impl<R: Duh, F: FnMut() -> R> Trait for F {
11
+ | ^^^^^ ^
12
+
13
+ error: aborting due to previous error
14
+
15
+ For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
1
+ // check-pass
2
+
3
+ #![ feature( type_alias_impl_trait) ]
4
+
5
+ trait Duh { }
6
+
7
+ impl Duh for i32 { }
8
+
9
+ trait Trait {
10
+ type Assoc : Duh ;
11
+ }
12
+
13
+ impl < F : Duh > Trait for F {
14
+ type Assoc = F ;
15
+ }
16
+
17
+ type Sendable = impl Send ;
18
+
19
+ fn foo ( ) -> impl Trait < Assoc = Sendable > {
20
+ 42
21
+ }
22
+
23
+ fn main ( ) {
24
+ }
Original file line number Diff line number Diff line change
1
+ // check-pass
2
+
3
+ #![ feature( type_alias_impl_trait) ]
4
+
5
+ trait Duh { }
6
+
7
+ impl Duh for i32 { }
8
+
9
+ trait Trait {
10
+ type Assoc : Duh ;
11
+ }
12
+
13
+ impl < F : Duh > Trait for F {
14
+ type Assoc = F ;
15
+ }
16
+
17
+ type Sendable = impl Send ;
18
+ type Traitable = impl Trait < Assoc = Sendable > ;
19
+
20
+ fn foo ( ) -> Traitable {
21
+ 42
22
+ }
23
+
24
+ fn main ( ) {
25
+ }
Original file line number Diff line number Diff line change
1
+ // check-pass
2
+
3
+ #![ feature( type_alias_impl_trait) ]
4
+
5
+ trait Duh { }
6
+
7
+ impl Duh for i32 { }
8
+
9
+ trait Trait {
10
+ type Assoc : Duh ;
11
+ }
12
+
13
+ impl < F : Duh > Trait for F {
14
+ type Assoc = F ;
15
+ }
16
+
17
+ type Traitable = impl Trait < Assoc = impl Send > ;
18
+
19
+ fn foo ( ) -> Traitable {
20
+ 42
21
+ }
22
+
23
+ fn main ( ) {
24
+ }
You can’t perform that action at this time.
0 commit comments