mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 18:53:39 +00:00
Create proper debuginfo for closure variables
Variables for closures hold a tuple of captured variables, and not the function itself. Fixes #26484
This commit is contained in:
parent
9175a16bd8
commit
3d65c7ff84
@ -813,8 +813,14 @@ pub fn type_metadata<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
|
||||
}
|
||||
ty::TyClosure(def_id, substs) => {
|
||||
let infcx = infer::normalizing_infer_ctxt(cx.tcx(), &cx.tcx().tables);
|
||||
let sig = infcx.closure_type(def_id, substs).sig;
|
||||
subroutine_type_metadata(cx, unique_type_id, &sig, usage_site_span)
|
||||
let upvars = infcx.closure_upvars(def_id, substs).unwrap();
|
||||
let upvar_types = upvars.iter().map(|u| u.ty).collect::<Vec<_>>();
|
||||
|
||||
prepare_tuple_metadata(cx,
|
||||
t,
|
||||
&upvar_types[..],
|
||||
unique_type_id,
|
||||
usage_site_span).finalize(cx)
|
||||
}
|
||||
ty::TyStruct(def_id, substs) => {
|
||||
prepare_struct_metadata(cx,
|
||||
|
@ -43,7 +43,7 @@
|
||||
// gdb-command:whatis f64
|
||||
// gdb-check:type = f64
|
||||
// gdb-command:whatis fnptr
|
||||
// gdb-check:type = void (*)(void)
|
||||
// gdb-check:type = [...] (*)([...])
|
||||
// gdb-command:info functions _yyy
|
||||
// gdb-check:[...]![...]_yyy([...]);
|
||||
// gdb-command:continue
|
||||
|
20
src/test/run-pass/issue-26484.rs
Normal file
20
src/test/run-pass/issue-26484.rs
Normal file
@ -0,0 +1,20 @@
|
||||
// Copyright 2015 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:-g
|
||||
|
||||
fn helper<F: FnOnce(usize) -> bool>(_f: F) {
|
||||
print!("");
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let cond = 0;
|
||||
helper(|v| v == cond)
|
||||
}
|
Loading…
Reference in New Issue
Block a user