mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 23:34:48 +00:00
Rollup merge of #64038 - matthewjasper:deny-mutual-impl-trait-recursion, r=varkor
Check impl trait substs when checking for recursive types closes #64004
This commit is contained in:
commit
9024032591
@ -709,8 +709,10 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
substs: SubstsRef<'tcx>,
|
||||
) -> Option<Ty<'tcx>> {
|
||||
if self.found_recursion {
|
||||
None
|
||||
} else if self.seen_opaque_tys.insert(def_id) {
|
||||
return None;
|
||||
}
|
||||
let substs = substs.fold_with(self);
|
||||
if self.seen_opaque_tys.insert(def_id) {
|
||||
let generic_ty = self.tcx.type_of(def_id);
|
||||
let concrete_ty = generic_ty.subst(self.tcx, substs);
|
||||
let expanded_ty = self.fold_ty(concrete_ty);
|
||||
|
@ -1420,8 +1420,8 @@ fn check_opaque_for_cycles<'tcx>(
|
||||
tcx.sess, span, E0733,
|
||||
"recursion in an `async fn` requires boxing",
|
||||
)
|
||||
.span_label(span, "an `async fn` cannot invoke itself directly")
|
||||
.note("a recursive `async fn` must be rewritten to return a boxed future.")
|
||||
.span_label(span, "recursive `async fn`")
|
||||
.note("a recursive `async fn` must be rewritten to return a boxed `dyn Future`.")
|
||||
.emit();
|
||||
} else {
|
||||
let mut err = struct_span_err!(
|
||||
|
@ -0,0 +1,13 @@
|
||||
// edition:2018
|
||||
// Test that impl trait does not allow creating recursive types that are
|
||||
// otherwise forbidden when using `async` and `await`.
|
||||
|
||||
async fn rec_1() { //~ ERROR recursion in an `async fn`
|
||||
rec_2().await;
|
||||
}
|
||||
|
||||
async fn rec_2() { //~ ERROR recursion in an `async fn`
|
||||
rec_1().await;
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,19 @@
|
||||
error[E0733]: recursion in an `async fn` requires boxing
|
||||
--> $DIR/mutually-recursive-async-impl-trait-type.rs:5:18
|
||||
|
|
||||
LL | async fn rec_1() {
|
||||
| ^ recursive `async fn`
|
||||
|
|
||||
= note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`.
|
||||
|
||||
error[E0733]: recursion in an `async fn` requires boxing
|
||||
--> $DIR/mutually-recursive-async-impl-trait-type.rs:9:18
|
||||
|
|
||||
LL | async fn rec_2() {
|
||||
| ^ recursive `async fn`
|
||||
|
|
||||
= note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`.
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0733`.
|
@ -2,9 +2,9 @@ error[E0733]: recursion in an `async fn` requires boxing
|
||||
--> $DIR/recursive-async-impl-trait-type.rs:5:40
|
||||
|
|
||||
LL | async fn recursive_async_function() -> () {
|
||||
| ^^ an `async fn` cannot invoke itself directly
|
||||
| ^^ recursive `async fn`
|
||||
|
|
||||
= note: a recursive `async fn` must be rewritten to return a boxed future.
|
||||
= note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`.
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -0,0 +1,25 @@
|
||||
// Test that impl trait does not allow creating recursive types that are
|
||||
// otherwise forbidden. Even when there's an opaque type in another crate
|
||||
// hiding this.
|
||||
|
||||
fn id<T>(t: T) -> impl Sized { t }
|
||||
|
||||
fn recursive_id() -> impl Sized { //~ ERROR opaque type expands to a recursive type
|
||||
id(recursive_id2())
|
||||
}
|
||||
|
||||
fn recursive_id2() -> impl Sized { //~ ERROR opaque type expands to a recursive type
|
||||
id(recursive_id())
|
||||
}
|
||||
|
||||
fn wrap<T>(t: T) -> impl Sized { (t,) }
|
||||
|
||||
fn recursive_wrap() -> impl Sized { //~ ERROR opaque type expands to a recursive type
|
||||
wrap(recursive_wrap2())
|
||||
}
|
||||
|
||||
fn recursive_wrap2() -> impl Sized { //~ ERROR opaque type expands to a recursive type
|
||||
wrap(recursive_wrap())
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,35 @@
|
||||
error[E0720]: opaque type expands to a recursive type
|
||||
--> $DIR/recursive-impl-trait-type--through-non-recursize.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
|
||||
|
|
||||
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
|
||||
|
|
||||
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
|
||||
|
|
||||
LL | fn recursive_wrap2() -> impl Sized {
|
||||
| ^^^^^^^^^^ expands to a recursive type
|
||||
|
|
||||
= note: expanded type is `((impl Sized,),)`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0720`.
|
Loading…
Reference in New Issue
Block a user