consider closures/ty-fn-defs when making trait selection keys
Fixes #42602.
This commit is contained in:
parent
f61bee340c
commit
36973f743f
@ -944,7 +944,9 @@ impl<'tcx> TraitPredicate<'tcx> {
|
|||||||
self.input_types()
|
self.input_types()
|
||||||
.flat_map(|t| t.walk())
|
.flat_map(|t| t.walk())
|
||||||
.filter_map(|t| match t.sty {
|
.filter_map(|t| match t.sty {
|
||||||
ty::TyAdt(adt_def, _) => Some(adt_def.did),
|
ty::TyAdt(adt_def, ..) => Some(adt_def.did),
|
||||||
|
ty::TyClosure(def_id, ..) => Some(def_id),
|
||||||
|
ty::TyFnDef(def_id, ..) => Some(def_id),
|
||||||
_ => None
|
_ => None
|
||||||
})
|
})
|
||||||
.next()
|
.next()
|
||||||
|
45
src/test/incremental/issue-42602.rs
Normal file
45
src/test/incremental/issue-42602.rs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
// Regression test for #42602. It used to be that we had
|
||||||
|
// a dep-graph like
|
||||||
|
//
|
||||||
|
// typeck(foo) -> FnOnce -> typeck(bar)
|
||||||
|
//
|
||||||
|
// This was fixed by improving the resolution of the `FnOnce` trait
|
||||||
|
// selection node.
|
||||||
|
|
||||||
|
// revisions:cfail1
|
||||||
|
// compile-flags:-Zquery-dep-graph
|
||||||
|
|
||||||
|
#![feature(rustc_attrs)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
a::foo();
|
||||||
|
b::bar();
|
||||||
|
}
|
||||||
|
|
||||||
|
mod a {
|
||||||
|
#[rustc_if_this_changed(HirBody)]
|
||||||
|
pub fn foo() {
|
||||||
|
let x = vec![1, 2, 3];
|
||||||
|
let v = || ::std::mem::drop(x);
|
||||||
|
v();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod b {
|
||||||
|
#[rustc_then_this_would_need(TypeckTables)] //[cfail1]~ ERROR no path
|
||||||
|
pub fn bar() {
|
||||||
|
let x = vec![1, 2, 3];
|
||||||
|
let v = || ::std::mem::drop(x);
|
||||||
|
v();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user