]> git.lizzy.rs Git - rust.git/commitdiff
Create proper debuginfo for closure variables
authorBjörn Steinbrink <bsteinbr@gmail.com>
Tue, 14 Jul 2015 17:08:08 +0000 (19:08 +0200)
committerBjörn Steinbrink <bsteinbr@gmail.com>
Mon, 20 Jul 2015 13:45:11 +0000 (15:45 +0200)
Variables for closures hold a tuple of captured variables, and not the
function itself.

Fixes #26484

src/librustc_trans/trans/debuginfo/metadata.rs
src/test/debuginfo/basic-types-metadata.rs
src/test/run-pass/issue-26484.rs [new file with mode: 0644]

index 33f60d7e78d968502ebc69f348165a246667b820..5f17197a4b9a746fed0458a0ee19c180067966c3 100644 (file)
@@ -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,
index 1bc2ddef51e05031f88bb6d2078d11785ecbfad4..2468150a6a5b16f599cca70e4f497df4efe63d69 100644 (file)
@@ -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
diff --git a/src/test/run-pass/issue-26484.rs b/src/test/run-pass/issue-26484.rs
new file mode 100644 (file)
index 0000000..d3e6fc8
--- /dev/null
@@ -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)
+}