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
This commit is contained in:
commit
c2d53dce7e
2 changed files with 61 additions and 2 deletions
50
src/test/run-pass/issue-41697.rs
Normal file
50
src/test/run-pass/issue-41697.rs
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
// Copyright 2016 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.
|
||||
|
||||
// compile-flags:-Zdump-mir=NEVER_MATCHED
|
||||
|
||||
// Regression test for #41697. Using dump-mir was triggering
|
||||
// artificial cycles: during type-checking, we had to get the MIR for
|
||||
// the constant expressions in `[u8; 2]`, which in turn would trigger
|
||||
// an attempt to get the item-path, which in turn would request the
|
||||
// types of the impl, which would trigger a cycle. We supressed this
|
||||
// cycle now by forcing mir-dump to avoid asking for types of an impl.
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
trait Foo {
|
||||
fn get(&self) -> [u8; 2];
|
||||
}
|
||||
|
||||
impl Foo for [u8; 2] {
|
||||
fn get(&self) -> [u8; 2] {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
struct Bar<T: ?Sized>(T);
|
||||
|
||||
fn unsize_fat_ptr<'a>(x: &'a Bar<Foo + Send + 'a>) -> &'a Bar<Foo + 'a> {
|
||||
x
|
||||
}
|
||||
|
||||
fn unsize_nested_fat_ptr(x: Arc<Foo + Send>) -> Arc<Foo> {
|
||||
x
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x: Box<Bar<Foo + Send>> = Box::new(Bar([1,2]));
|
||||
assert_eq!(unsize_fat_ptr(&*x).0.get(), [1, 2]);
|
||||
|
||||
let x: Arc<Foo + Send> = Arc::new([3, 4]);
|
||||
assert_eq!(unsize_nested_fat_ptr(x).get(), [3, 4]);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue