mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
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()
|
||||
.flat_map(|t| t.walk())
|
||||
.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
|
||||
})
|
||||
.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