Skip to content

Commit 7107aa2

Browse files
Add regression tests for unconditional_recursion
1 parent d3bde85 commit 7107aa2

File tree

2 files changed

+101
-10
lines changed

2 files changed

+101
-10
lines changed

tests/ui/unconditional_recursion.rs

+52-6
Original file line numberDiff line numberDiff line change
@@ -158,28 +158,74 @@ struct S5;
158158
impl_partial_eq!(S5);
159159
//~^ ERROR: function cannot return without recursing
160160

161-
struct S6;
161+
struct S6 {
162+
field: String,
163+
}
164+
165+
impl PartialEq for S6 {
166+
fn eq(&self, other: &Self) -> bool {
167+
let mine = &self.field;
168+
let theirs = &other.field;
169+
mine == theirs // Should not warn!
170+
}
171+
}
172+
173+
struct S7<'a> {
174+
field: &'a S7<'a>,
175+
}
176+
177+
impl<'a> PartialEq for S7<'a> {
178+
fn eq(&self, other: &Self) -> bool {
179+
//~^ ERROR: function cannot return without recursing
180+
let mine = &self.field;
181+
let theirs = &other.field;
182+
mine == theirs
183+
}
184+
}
185+
186+
struct S8 {
187+
num: i32,
188+
field: Option<Box<S8>>,
189+
}
190+
191+
impl PartialEq for S8 {
192+
fn eq(&self, other: &Self) -> bool {
193+
if self.num != other.num {
194+
return false;
195+
}
196+
197+
let (this, other) = match (self.field.as_deref(), other.field.as_deref()) {
198+
(Some(x1), Some(x2)) => (x1, x2),
199+
(None, None) => return true,
200+
_ => return false,
201+
};
202+
203+
this == other
204+
}
205+
}
206+
207+
struct S9;
162208

163-
impl std::string::ToString for S6 {
209+
impl std::string::ToString for S9 {
164210
fn to_string(&self) -> String {
165211
//~^ ERROR: function cannot return without recursing
166212
self.to_string()
167213
}
168214
}
169215

170-
struct S7;
216+
struct S10;
171217

172-
impl std::string::ToString for S7 {
218+
impl std::string::ToString for S10 {
173219
fn to_string(&self) -> String {
174220
//~^ ERROR: function cannot return without recursing
175221
let x = self;
176222
x.to_string()
177223
}
178224
}
179225

180-
struct S8;
226+
struct S11;
181227

182-
impl std::string::ToString for S8 {
228+
impl std::string::ToString for S11 {
183229
fn to_string(&self) -> String {
184230
//~^ ERROR: function cannot return without recursing
185231
(self as &Self).to_string()

tests/ui/unconditional_recursion.stderr

+49-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ LL | self.eq(other)
2323
= help: a `loop` may express intention better if this is on purpose
2424

2525
error: function cannot return without recursing
26-
--> $DIR/unconditional_recursion.rs:164:5
26+
--> $DIR/unconditional_recursion.rs:210:5
2727
|
2828
LL | fn to_string(&self) -> String {
2929
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
@@ -34,7 +34,7 @@ LL | self.to_string()
3434
= help: a `loop` may express intention better if this is on purpose
3535

3636
error: function cannot return without recursing
37-
--> $DIR/unconditional_recursion.rs:173:5
37+
--> $DIR/unconditional_recursion.rs:219:5
3838
|
3939
LL | fn to_string(&self) -> String {
4040
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
@@ -45,7 +45,7 @@ LL | x.to_string()
4545
= help: a `loop` may express intention better if this is on purpose
4646

4747
error: function cannot return without recursing
48-
--> $DIR/unconditional_recursion.rs:183:5
48+
--> $DIR/unconditional_recursion.rs:229:5
4949
|
5050
LL | fn to_string(&self) -> String {
5151
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
@@ -87,6 +87,34 @@ note: recursive call site
8787
LL | self == other
8888
| ^^^^^^^^^^^^^
8989

90+
error: function cannot return without recursing
91+
--> $DIR/unconditional_recursion.rs:28:5
92+
|
93+
LL | / fn ne(&self, other: &Self) -> bool {
94+
LL | | self != &Foo2::B // no error here
95+
LL | | }
96+
| |_____^
97+
|
98+
note: recursive call site
99+
--> $DIR/unconditional_recursion.rs:29:9
100+
|
101+
LL | self != &Foo2::B // no error here
102+
| ^^^^^^^^^^^^^^^^
103+
104+
error: function cannot return without recursing
105+
--> $DIR/unconditional_recursion.rs:31:5
106+
|
107+
LL | / fn eq(&self, other: &Self) -> bool {
108+
LL | | self == &Foo2::B // no error here
109+
LL | | }
110+
| |_____^
111+
|
112+
note: recursive call site
113+
--> $DIR/unconditional_recursion.rs:32:9
114+
|
115+
LL | self == &Foo2::B // no error here
116+
| ^^^^^^^^^^^^^^^^
117+
90118
error: function cannot return without recursing
91119
--> $DIR/unconditional_recursion.rs:42:5
92120
|
@@ -280,5 +308,22 @@ LL | impl_partial_eq!(S5);
280308
| -------------------- in this macro invocation
281309
= note: this error originates in the macro `impl_partial_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
282310

283-
error: aborting due to 22 previous errors
311+
error: function cannot return without recursing
312+
--> $DIR/unconditional_recursion.rs:178:5
313+
|
314+
LL | / fn eq(&self, other: &Self) -> bool {
315+
LL | |
316+
LL | | let mine = &self.field;
317+
LL | | let theirs = &other.field;
318+
LL | | mine == theirs
319+
LL | | }
320+
| |_____^
321+
|
322+
note: recursive call site
323+
--> $DIR/unconditional_recursion.rs:182:9
324+
|
325+
LL | mine == theirs
326+
| ^^^^^^^^^^^^^^
327+
328+
error: aborting due to 25 previous errors
284329

0 commit comments

Comments
 (0)