Skip to content

Commit 30fba22

Browse files
authoredJun 23, 2020
Rollup merge of #73601 - Aaron1011:fix/better-mono-overflow-err, r=ecstatic-morse
Point at the call span when overflow occurs during monomorphization This improves the output for issue #72577, but there's still more work to be done. Currently, an overflow error during monomorphization results in an error that points at the function we were unable to monomorphize. However, we don't point at the call that caused the monomorphization to happen. In the overflow occurs in a large recursive function, it may be difficult to determine where the issue is. This commit tracks and `Span` information during collection of `MonoItem`s, which is used when emitting an overflow error. `MonoItem` itself is unchanged, so this only affects `src/librustc_mir/monomorphize/collector.rs`
2 parents 045761c + 3ed96a6 commit 30fba22

10 files changed

+132
-80
lines changed
 

‎src/librustc_mir/monomorphize/collector.rs

+80-57
Large diffs are not rendered by default.

‎src/test/ui/infinite/infinite-instantiation.rs

+1-9
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
//
2-
// We get an error message at the top of file (dummy span).
3-
// This is not helpful, but also kind of annoying to prevent,
4-
// so for now just live with it.
5-
// This test case was originally for issue #2258.
6-
71
// build-fail
82

93
trait ToOpt: Sized {
@@ -23,11 +17,9 @@ impl<T:Clone> ToOpt for Option<T> {
2317
}
2418

2519
fn function<T:ToOpt + Clone>(counter: usize, t: T) {
26-
//~^ ERROR reached the recursion limit while instantiating `function::<std::option::Option<
2720
if counter > 0 {
2821
function(counter - 1, t.to_option());
29-
// FIXME(#4287) Error message should be here. It should be
30-
// a type error to instantiate `test` at a type other than T.
22+
//~^ ERROR reached the recursion limit while instantiating `function::<std::option::Option<
3123
}
3224
}
3325

‎src/test/ui/infinite/infinite-instantiation.stderr

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
error: reached the recursion limit while instantiating `function::<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<usize>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
2-
--> $DIR/infinite-instantiation.rs:25:1
2+
--> $DIR/infinite-instantiation.rs:21:9
3+
|
4+
LL | function(counter - 1, t.to_option());
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
note: `function` defined here
8+
--> $DIR/infinite-instantiation.rs:19:1
39
|
410
LL | / fn function<T:ToOpt + Clone>(counter: usize, t: T) {
5-
LL | |
611
LL | | if counter > 0 {
712
LL | | function(counter - 1, t.to_option());
8-
... |
13+
LL | |
914
LL | | }
1015
LL | | }
1116
| |_^

‎src/test/ui/issues/issue-67552.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ fn identity<T>(x: T) -> T {
1818
}
1919

2020
fn rec<T>(mut it: T)
21-
//~^ ERROR reached the recursion limit while instantiating
2221
where
2322
T: Iterator,
2423
{
2524
if () == () {
2625
T::count(it);
2726
} else {
2827
rec(identity(&mut it))
28+
//~^ ERROR reached the recursion limit while instantiating
2929
}
3030
}

‎src/test/ui/issues/issue-67552.stderr

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut Empty>`
2+
--> $DIR/issue-67552.rs:27:9
3+
|
4+
LL | rec(identity(&mut it))
5+
| ^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
note: `rec` defined here
28
--> $DIR/issue-67552.rs:20:1
39
|
410
LL | / fn rec<T>(mut it: T)
5-
LL | |
611
LL | | where
712
LL | | T: Iterator,
13+
LL | | {
814
... |
915
LL | | }
1016
LL | | }

‎src/test/ui/issues/issue-8727.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33

44
// build-fail
55

6-
fn generic<T>() {
6+
fn generic<T>() { //~ WARN function cannot return without recursing
77
generic::<Option<T>>();
88
}
9-
//~^^^ ERROR reached the recursion limit while instantiating `generic::<std::option::Option<
10-
//~| WARN function cannot return without recursing
11-
9+
//~^^ ERROR reached the recursion limit while instantiating `generic::<std::option::Option<
1210

1311

1412
fn main () {

‎src/test/ui/issues/issue-8727.stderr

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ LL | generic::<Option<T>>();
1010
= help: a `loop` may express intention better if this is on purpose
1111

1212
error: reached the recursion limit while instantiating `generic::<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<std::option::Option<i32>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
13+
--> $DIR/issue-8727.rs:7:5
14+
|
15+
LL | generic::<Option<T>>();
16+
| ^^^^^^^^^^^^^^^^^^^^^^
17+
|
18+
note: `generic` defined here
1319
--> $DIR/issue-8727.rs:6:1
1420
|
1521
LL | / fn generic<T>() {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
11
error: reached the recursion limit while instantiating `std::intrinsics::drop_in_place::<S<fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(u32))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>> - shim(Some(S<fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(fn(u32))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>))`
2+
--> $SRC_DIR/libcore/ptr/mod.rs:LL:COL
3+
|
4+
LL | / pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
5+
LL | | // Code here does not matter - this is replaced by the
6+
LL | | // real drop glue by the compiler.
7+
LL | | drop_in_place(to_drop)
8+
LL | | }
9+
| |_^
10+
|
11+
note: `std::intrinsics::drop_in_place` defined here
12+
--> $SRC_DIR/libcore/ptr/mod.rs:LL:COL
13+
|
14+
LL | / pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
15+
LL | | // Code here does not matter - this is replaced by the
16+
LL | | // real drop glue by the compiler.
17+
LL | | drop_in_place(to_drop)
18+
LL | | }
19+
| |_^
220

321
error: aborting due to previous error
422

‎src/test/ui/recursion/recursion.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ impl<T:Dot> Dot for Cons<T> {
1212
self.head * other.head + self.tail.dot(other.tail)
1313
}
1414
}
15-
fn test<T:Dot> (n:isize, i:isize, first:T, second:T) ->isize { //~ ERROR recursion limit
15+
fn test<T:Dot> (n:isize, i:isize, first:T, second:T) ->isize {
1616
match n { 0 => {first.dot(second)}
17-
// FIXME(#4287) Error message should be here. It should be
18-
// a type error to instantiate `test` at a type other than T.
1917
_ => {test (n-1, i+1, Cons {head:2*i+1, tail:first}, Cons{head:i*i, tail:second})}
18+
//~^ ERROR recursion limit
2019
}
2120
}
2221
pub fn main() {

‎src/test/ui/recursion/recursion.stderr

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
error: reached the recursion limit while instantiating `test::<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Cons<Nil>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
2+
--> $DIR/recursion.rs:17:11
3+
|
4+
LL | _ => {test (n-1, i+1, Cons {head:2*i+1, tail:first}, Cons{head:i*i, tail:second})}
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6+
|
7+
note: `test` defined here
28
--> $DIR/recursion.rs:15:1
39
|
410
LL | / fn test<T:Dot> (n:isize, i:isize, first:T, second:T) ->isize {
511
LL | | match n { 0 => {first.dot(second)}
6-
LL | | // FIXME(#4287) Error message should be here. It should be
7-
LL | | // a type error to instantiate `test` at a type other than T.
812
LL | | _ => {test (n-1, i+1, Cons {head:2*i+1, tail:first}, Cons{head:i*i, tail:second})}
13+
LL | |
914
LL | | }
1015
LL | | }
1116
| |_^

0 commit comments

Comments
 (0)