Skip to content

Commit

Permalink
Rollup merge of rust-lang#65777 - matthewjasper:allow-impl-trait-expa…
Browse files Browse the repository at this point in the history
…nsion, r=davidtwco

Don't ICE for completely unexpandable `impl Trait` types

Save the resolution of these types (to themselves) to the typeck tables so that they will eventually reach E0720.

closes rust-lang#65561
  • Loading branch information
Centril committed Oct 26, 2019
2 parents 3cf7f5a + 0c05ed2 commit 0498da3
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 28 deletions.
10 changes: 6 additions & 4 deletions src/librustc_typeck/check/writeback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -479,10 +479,12 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
let mut skip_add = false;

if let ty::Opaque(defin_ty_def_id, _substs) = definition_ty.kind {
if def_id == defin_ty_def_id {
debug!("Skipping adding concrete definition for opaque type {:?} {:?}",
opaque_defn, defin_ty_def_id);
skip_add = true;
if let hir::OpaqueTyOrigin::TypeAlias = opaque_defn.origin {
if def_id == defin_ty_def_id {
debug!("Skipping adding concrete definition for opaque type {:?} {:?}",
opaque_defn, defin_ty_def_id);
skip_add = true;
}
}
}

Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/impl-trait/recursive-impl-trait-type-direct.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Test that an `impl Trait` type that expands to itself is an error.

fn test() -> impl Sized { //~ ERROR E0720
test()
}

fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/impl-trait/recursive-impl-trait-type-direct.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type-direct.rs:3:14
|
LL | fn test() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: type resolves to itself

error: aborting due to previous error

For more information about this error, try `rustc --explain E0720`.
Original file line number Diff line number Diff line change
@@ -1,109 +1,109 @@
error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:6:22
--> $DIR/recursive-impl-trait-type-indirect.rs:6:22
|
LL | fn option(i: i32) -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `std::option::Option<(impl Sized, i32)>`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:14:15
--> $DIR/recursive-impl-trait-type-indirect.rs:14:15
|
LL | fn tuple() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `(impl Sized,)`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:18:15
--> $DIR/recursive-impl-trait-type-indirect.rs:18:15
|
LL | fn array() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `[impl Sized; 1]`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:22:13
--> $DIR/recursive-impl-trait-type-indirect.rs:22:13
|
LL | fn ptr() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `*const impl Sized`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:26:16
--> $DIR/recursive-impl-trait-type-indirect.rs:26:16
|
LL | fn fn_ptr() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `fn() -> impl Sized`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:30:25
--> $DIR/recursive-impl-trait-type-indirect.rs:30:25
|
LL | fn closure_capture() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type.rs:32:5: 32:19 x:impl Sized]`
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type-indirect.rs:32:5: 32:19 x:impl Sized]`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:35:29
--> $DIR/recursive-impl-trait-type-indirect.rs:35:29
|
LL | fn closure_ref_capture() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type.rs:37:5: 37:20 x:impl Sized]`
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type-indirect.rs:37:5: 37:20 x:impl Sized]`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:40:21
--> $DIR/recursive-impl-trait-type-indirect.rs:40:21
|
LL | fn closure_sig() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type.rs:41:5: 41:21]`
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type-indirect.rs:41:5: 41:21]`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:44:23
--> $DIR/recursive-impl-trait-type-indirect.rs:44:23
|
LL | fn generator_sig() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type.rs:45:5: 45:23]`
= note: expanded type is `[closure@$DIR/recursive-impl-trait-type-indirect.rs:45:5: 45:23]`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:48:27
--> $DIR/recursive-impl-trait-type-indirect.rs:48:27
|
LL | fn generator_capture() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `[generator@$DIR/recursive-impl-trait-type.rs:50:5: 50:26 x:impl Sized {()}]`
= note: expanded type is `[generator@$DIR/recursive-impl-trait-type-indirect.rs:50:5: 50:26 x:impl Sized {()}]`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:53:26
--> $DIR/recursive-impl-trait-type-indirect.rs:53:26
|
LL | fn substs_change<T>() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `(impl Sized,)`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:57:24
--> $DIR/recursive-impl-trait-type-indirect.rs:57:24
|
LL | fn generator_hold() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `[generator@$DIR/recursive-impl-trait-type.rs:58:5: 62:6 {impl Sized, ()}]`
= note: expanded type is `[generator@$DIR/recursive-impl-trait-type-indirect.rs:58:5: 62:6 {impl Sized, ()}]`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:69:26
--> $DIR/recursive-impl-trait-type-indirect.rs:69:26
|
LL | fn mutual_recursion() -> impl Sync {
| ^^^^^^^^^ expands to a recursive type
|
= note: type resolves to itself

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type.rs:73:28
--> $DIR/recursive-impl-trait-type-indirect.rs:73:28
|
LL | fn mutual_recursion_b() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type--through-non-recursize.rs:7:22
--> $DIR/recursive-impl-trait-type-through-non-recursive.rs:7:22
|
LL | fn recursive_id() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: type resolves to itself

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type--through-non-recursize.rs:11:23
--> $DIR/recursive-impl-trait-type-through-non-recursive.rs:11:23
|
LL | fn recursive_id2() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: type resolves to itself

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type--through-non-recursize.rs:17:24
--> $DIR/recursive-impl-trait-type-through-non-recursive.rs:17:24
|
LL | fn recursive_wrap() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
|
= note: expanded type is `((impl Sized,),)`

error[E0720]: opaque type expands to a recursive type
--> $DIR/recursive-impl-trait-type--through-non-recursize.rs:21:25
--> $DIR/recursive-impl-trait-type-through-non-recursive.rs:21:25
|
LL | fn recursive_wrap2() -> impl Sized {
| ^^^^^^^^^^ expands to a recursive type
Expand Down

0 comments on commit 0498da3

Please sign in to comment.