Skip to content

Commit 3e215a3

Browse files
committed
Typeck existential types properly
1 parent 53d2ebb commit 3e215a3

File tree

3 files changed

+50
-9
lines changed

3 files changed

+50
-9
lines changed

src/librustc_typeck/check/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,6 +1309,7 @@ pub fn check_item_type<'a,'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, it: &'tcx hir::Item
13091309
hir::ItemKind::Union(..) => {
13101310
check_union(tcx, it.id, it.span);
13111311
}
1312+
hir::ItemKind::Existential(..) |
13121313
hir::ItemKind::Ty(..) => {
13131314
let def_id = tcx.hir.local_def_id(it.id);
13141315
let pty_ty = tcx.type_of(def_id);

src/test/ui/impl-trait/auto-trait-leak.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ fn main() {
2323
// return type, which can't depend on the obligation.
2424
fn cycle1() -> impl Clone {
2525
//~^ ERROR cycle detected
26+
//~| ERROR cycle detected
2627
send(cycle2().clone());
28+
//~^ ERROR cannot be sent between threads safely
2729

2830
Rc::new(Cell::new(5))
2931
}
Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,67 @@
1-
error[E0391]: cycle detected when processing `cycle1`
1+
error[E0391]: cycle detected when processing `cycle1::{{impl-Trait}}`
2+
--> $DIR/auto-trait-leak.rs:24:16
3+
|
4+
LL | fn cycle1() -> impl Clone {
5+
| ^^^^^^^^^^
6+
|
7+
note: ...which requires processing `cycle1`...
28
--> $DIR/auto-trait-leak.rs:24:1
39
|
410
LL | fn cycle1() -> impl Clone {
511
| ^^^^^^^^^^^^^^^^^^^^^^^^^
6-
|
712
note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
813
note: ...which requires processing `cycle2::{{impl-Trait}}`...
9-
--> $DIR/auto-trait-leak.rs:31:16
14+
--> $DIR/auto-trait-leak.rs:33:16
1015
|
1116
LL | fn cycle2() -> impl Clone {
1217
| ^^^^^^^^^^
1318
note: ...which requires processing `cycle2`...
14-
--> $DIR/auto-trait-leak.rs:31:1
19+
--> $DIR/auto-trait-leak.rs:33:1
1520
|
1621
LL | fn cycle2() -> impl Clone {
1722
| ^^^^^^^^^^^^^^^^^^^^^^^^^
1823
note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
19-
note: ...which requires processing `cycle1::{{impl-Trait}}`...
24+
= note: ...which again requires processing `cycle1::{{impl-Trait}}`, completing the cycle
25+
26+
error[E0391]: cycle detected when processing `cycle1::{{impl-Trait}}`
2027
--> $DIR/auto-trait-leak.rs:24:16
2128
|
2229
LL | fn cycle1() -> impl Clone {
2330
| ^^^^^^^^^^
24-
= note: ...which again requires processing `cycle1`, completing the cycle
25-
note: cycle used when type-checking all item bodies
31+
|
32+
note: ...which requires processing `cycle1`...
33+
--> $DIR/auto-trait-leak.rs:24:1
34+
|
35+
LL | fn cycle1() -> impl Clone {
36+
| ^^^^^^^^^^^^^^^^^^^^^^^^^
37+
note: ...which requires evaluating trait selection obligation `impl std::clone::Clone: std::marker::Send`...
38+
note: ...which requires processing `cycle2::{{impl-Trait}}`...
39+
--> $DIR/auto-trait-leak.rs:33:16
40+
|
41+
LL | fn cycle2() -> impl Clone {
42+
| ^^^^^^^^^^
43+
note: ...which requires processing `cycle2`...
44+
--> $DIR/auto-trait-leak.rs:33:1
45+
|
46+
LL | fn cycle2() -> impl Clone {
47+
| ^^^^^^^^^^^^^^^^^^^^^^^^^
48+
= note: ...which again requires processing `cycle1::{{impl-Trait}}`, completing the cycle
49+
50+
error[E0277]: `std::rc::Rc<std::string::String>` cannot be sent between threads safely
51+
--> $DIR/auto-trait-leak.rs:27:5
52+
|
53+
LL | send(cycle2().clone());
54+
| ^^^^ `std::rc::Rc<std::string::String>` cannot be sent between threads safely
55+
|
56+
= help: within `impl std::clone::Clone`, the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::string::String>`
57+
= note: required because it appears within the type `impl std::clone::Clone`
58+
note: required by `send`
59+
--> $DIR/auto-trait-leak.rs:16:1
60+
|
61+
LL | fn send<T: Send>(_: T) {}
62+
| ^^^^^^^^^^^^^^^^^^^^^^
2663

27-
error: aborting due to previous error
64+
error: aborting due to 3 previous errors
2865

29-
For more information about this error, try `rustc --explain E0391`.
66+
Some errors occurred: E0277, E0391.
67+
For more information about an error, try `rustc --explain E0277`.

0 commit comments

Comments
 (0)