Skip to content

Commit c2d53dc

Browse files
committed
Auto merge of #41777 - nikomatsakis:issue-41697-mir-dump-cycle, r=arielb1
dump-mir was causing cycles by invoking item-path-str at bad times Workaround for now, but probably a better fix is to opt **in** to using the types for impls (if we do that at all; maybe filename/line is better). Fixes #41697
2 parents bedd7da + cadf187 commit c2d53dc

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

src/librustc_mir/util/pretty.rs

+11-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use rustc::hir::def_id::{DefId, LOCAL_CRATE};
1313
use rustc::mir::*;
1414
use rustc::mir::transform::{MirSuite, MirPassIndex, MirSource};
1515
use rustc::ty::TyCtxt;
16+
use rustc::ty::item_path;
1617
use rustc_data_structures::fx::FxHashMap;
1718
use rustc_data_structures::indexed_vec::{Idx};
1819
use std::fmt::Display;
@@ -48,7 +49,9 @@ pub fn dump_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
4849
return;
4950
}
5051

51-
let node_path = tcx.item_path_str(tcx.hir.local_def_id(source.item_id()));
52+
let node_path = item_path::with_forced_impl_filename_line(|| { // see notes on #41697 below
53+
tcx.item_path_str(tcx.hir.local_def_id(source.item_id()))
54+
});
5255
dump_matched_mir_node(tcx, pass_num, pass_name, &node_path,
5356
disambiguator, source, mir);
5457
for (index, promoted_mir) in mir.promoted.iter_enumerated() {
@@ -67,7 +70,9 @@ pub fn dump_enabled<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
6770
Some(ref filters) => filters,
6871
};
6972
let node_id = source.item_id();
70-
let node_path = tcx.item_path_str(tcx.hir.local_def_id(node_id));
73+
let node_path = item_path::with_forced_impl_filename_line(|| { // see notes on #41697 below
74+
tcx.item_path_str(tcx.hir.local_def_id(node_id))
75+
});
7176
filters.split("&")
7277
.any(|filter| {
7378
filter == "all" ||
@@ -76,6 +81,10 @@ pub fn dump_enabled<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
7681
})
7782
}
7883

84+
// #41697 -- we use `with_forced_impl_filename_line()` because
85+
// `item_path_str()` would otherwise trigger `type_of`, and this can
86+
// run while we are already attempting to evaluate `type_of`.
87+
7988
fn dump_matched_mir_node<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
8089
pass_num: Option<(MirSuite, MirPassIndex)>,
8190
pass_name: &str,

src/test/run-pass/issue-41697.rs

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// compile-flags:-Zdump-mir=NEVER_MATCHED
12+
13+
// Regression test for #41697. Using dump-mir was triggering
14+
// artificial cycles: during type-checking, we had to get the MIR for
15+
// the constant expressions in `[u8; 2]`, which in turn would trigger
16+
// an attempt to get the item-path, which in turn would request the
17+
// types of the impl, which would trigger a cycle. We supressed this
18+
// cycle now by forcing mir-dump to avoid asking for types of an impl.
19+
20+
#![feature(rustc_attrs)]
21+
22+
use std::sync::Arc;
23+
24+
trait Foo {
25+
fn get(&self) -> [u8; 2];
26+
}
27+
28+
impl Foo for [u8; 2] {
29+
fn get(&self) -> [u8; 2] {
30+
*self
31+
}
32+
}
33+
34+
struct Bar<T: ?Sized>(T);
35+
36+
fn unsize_fat_ptr<'a>(x: &'a Bar<Foo + Send + 'a>) -> &'a Bar<Foo + 'a> {
37+
x
38+
}
39+
40+
fn unsize_nested_fat_ptr(x: Arc<Foo + Send>) -> Arc<Foo> {
41+
x
42+
}
43+
44+
fn main() {
45+
let x: Box<Bar<Foo + Send>> = Box::new(Bar([1,2]));
46+
assert_eq!(unsize_fat_ptr(&*x).0.get(), [1, 2]);
47+
48+
let x: Arc<Foo + Send> = Arc::new([3, 4]);
49+
assert_eq!(unsize_nested_fat_ptr(x).get(), [3, 4]);
50+
}

0 commit comments

Comments
 (0)