-
Notifications
You must be signed in to change notification settings - Fork 13.6k
suggest doubling recursion limit in more situations #39655
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// Test that the recursion limit can be changed and that the compiler | ||
// suggests a fix. In this case, we have deeply nested types that will | ||
// fail the `Send` check by overflow when the recursion limit is set | ||
// very low. | ||
|
||
#![allow(dead_code)] | ||
#![recursion_limit="10"] | ||
|
||
macro_rules! link { | ||
($id:ident, $t:ty) => { | ||
enum $id { $id($t) } | ||
} | ||
} | ||
|
||
link! { A, B } | ||
link! { B, C } | ||
link! { C, D } | ||
link! { D, E } | ||
link! { E, F } | ||
link! { F, G } | ||
link! { G, H } | ||
link! { H, I } | ||
link! { I, J } | ||
link! { J, K } | ||
link! { K, L } | ||
link! { L, M } | ||
link! { M, N } | ||
|
||
enum N { N(usize) } | ||
|
||
fn is_send<T:Send>() { } | ||
|
||
fn main() { | ||
is_send::<A>(); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
error[E0275]: overflow evaluating the requirement `K: std::marker::Send` | ||
--> $DIR/recursion_limit.rs:44:5 | ||
| | ||
44 | is_send::<A>(); | ||
| ^^^^^^^^^^^^ | ||
| | ||
= note: consider adding a `#![recursion_limit="20"]` attribute to your crate | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This will need update to |
||
= note: required because it appears within the type `J` | ||
= note: required because it appears within the type `I` | ||
= note: required because it appears within the type `H` | ||
= note: required because it appears within the type `G` | ||
= note: required because it appears within the type `F` | ||
= note: required because it appears within the type `E` | ||
= note: required because it appears within the type `D` | ||
= note: required because it appears within the type `C` | ||
= note: required because it appears within the type `B` | ||
= note: required because it appears within the type `A` | ||
= note: required by `is_send` | ||
|
||
error: aborting due to previous error | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// Test that the recursion limit can be changed and that the compiler | ||
// suggests a fix. In this case, we have a long chain of Deref impls | ||
// which will cause an overflow during the autoderef loop. | ||
|
||
#![allow(dead_code)] | ||
#![recursion_limit="10"] | ||
|
||
macro_rules! link { | ||
($outer:ident, $inner:ident) => { | ||
struct $outer($inner); | ||
|
||
impl $outer { | ||
fn new() -> $outer { | ||
$outer($inner::new()) | ||
} | ||
} | ||
|
||
impl std::ops::Deref for $outer { | ||
type Target = $inner; | ||
|
||
fn deref(&self) -> &$inner { | ||
&self.0 | ||
} | ||
} | ||
} | ||
} | ||
|
||
struct Bottom; | ||
impl Bottom { | ||
fn new() -> Bottom { | ||
Bottom | ||
} | ||
} | ||
|
||
link!(Top, A); | ||
link!(A, B); | ||
link!(B, C); | ||
link!(C, D); | ||
link!(D, E); | ||
link!(E, F); | ||
link!(F, G); | ||
link!(G, H); | ||
link!(H, I); | ||
link!(I, J); | ||
link!(J, K); | ||
link!(K, Bottom); | ||
|
||
fn main() { | ||
let t = Top::new(); | ||
let x: &Bottom = &t; | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
error[E0055]: reached the recursion limit while auto-dereferencing I | ||
--> $DIR/recursion_limit_deref.rs:60:22 | ||
| | ||
60 | let x: &Bottom = &t; | ||
| ^^ deref recursion limit reached | ||
| | ||
= help: consider adding a `#[recursion_limit="20"]` attribute to your crate | ||
|
||
error[E0055]: reached the recursion limit while auto-dereferencing I | ||
| | ||
= help: consider adding a `#[recursion_limit="20"]` attribute to your crate | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This duplicate error shouldn't be here and yet it is. cc #38940 @jseyfried |
||
|
||
error[E0308]: mismatched types | ||
--> $DIR/recursion_limit_deref.rs:60:22 | ||
| | ||
60 | let x: &Bottom = &t; | ||
| ^^ expected struct `Bottom`, found struct `Top` | ||
| | ||
= note: expected type `&Bottom` | ||
found type `&Top` | ||
|
||
error: aborting due to 3 previous errors | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// Test that the recursion limit can be changed and that the compiler | ||
// suggests a fix. In this case, we have a recursing macro that will | ||
// overflow if the number of arguments surpasses the recursion limit. | ||
|
||
#![allow(dead_code)] | ||
#![recursion_limit="10"] | ||
|
||
macro_rules! recurse { | ||
() => { }; | ||
($t:tt $($tail:tt)*) => { recurse!($($tail)*) }; | ||
} | ||
|
||
fn main() { | ||
recurse!(0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9); | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
error: recursion limit reached while expanding the macro `recurse` | ||
--> $DIR/recursion_limit_macro.rs:20:31 | ||
| | ||
20 | ($t:tt $($tail:tt)*) => { recurse!($($tail)*) }; | ||
| ^^^^^^^^^^^^^^^^^^^ | ||
... | ||
24 | recurse!(0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9); | ||
| -------------------------------------------------- in this macro invocation | ||
| | ||
= note: consider adding a `#![recursion_limit="20"]` attribute to your crate | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can this be
.help()
too or is there a reason it can't?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I think it can be.