about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-10-06 09:27:19 +0000
committerbors <bors@rust-lang.org>2014-10-06 09:27:19 +0000
commit7c8fc95acae5bd570d1707787185f42442b66571 (patch)
tree2c6706ea1cf9e5644966240e2ca69ff835ea926d
parent0e2f0acf2213825bfcd88cc7355d3e2f32c1db13 (diff)
parent1694bf64ba1764f8c7a84b83e2bbe34b1e0ab0ab (diff)
downloadrust-7c8fc95acae5bd570d1707787185f42442b66571.tar.gz
rust-7c8fc95acae5bd570d1707787185f42442b66571.zip
auto merge of #17803 : bkoropoff/rust/issue-17021, r=alexcrichton
This closes issue #17021.
-rw-r--r--src/librustc/middle/trans/debuginfo.rs130
-rw-r--r--src/test/run-pass/unboxed-closures-unique-type-id.rs2
2 files changed, 78 insertions, 54 deletions
diff --git a/src/librustc/middle/trans/debuginfo.rs b/src/librustc/middle/trans/debuginfo.rs
index b24b9e0a4e7..e50b61a68e5 100644
--- a/src/librustc/middle/trans/debuginfo.rs
+++ b/src/librustc/middle/trans/debuginfo.rs
@@ -456,60 +456,17 @@ impl TypeMap {
                 let return_type_id = self.get_unique_type_id_as_string(return_type_id);
                 unique_type_id.push_str(return_type_id.as_slice());
             },
-            ty::ty_closure(box ty::ClosureTy { fn_style,
-                                               onceness,
-                                               store,
-                                               ref bounds,
-                                               ref sig,
-                                               abi: _ }) => {
-                if fn_style == ast::UnsafeFn {
-                    unique_type_id.push_str("unsafe ");
-                }
-
-                if onceness == ast::Once {
-                    unique_type_id.push_str("once ");
-                }
-
-                match store {
-                    ty::UniqTraitStore => unique_type_id.push_str("~|"),
-                    ty::RegionTraitStore(_, ast::MutMutable) => {
-                        unique_type_id.push_str("&mut|")
-                    }
-                    ty::RegionTraitStore(_, ast::MutImmutable) => {
-                        unique_type_id.push_str("&|")
-                    }
-                };
-
-                for &parameter_type in sig.inputs.iter() {
-                    let parameter_type_id =
-                        self.get_unique_type_id_of_type(cx, parameter_type);
-                    let parameter_type_id =
-                        self.get_unique_type_id_as_string(parameter_type_id);
-                    unique_type_id.push_str(parameter_type_id.as_slice());
-                    unique_type_id.push_char(',');
-                }
-
-                if sig.variadic {
-                    unique_type_id.push_str("...");
-                }
-
-                unique_type_id.push_str("|->");
-
-                let return_type_id = self.get_unique_type_id_of_type(cx, sig.output);
-                let return_type_id = self.get_unique_type_id_as_string(return_type_id);
-                unique_type_id.push_str(return_type_id.as_slice());
-
-                unique_type_id.push_char(':');
-
-                for bound in bounds.builtin_bounds.iter() {
-                    match bound {
-                        ty::BoundSend => unique_type_id.push_str("Send"),
-                        ty::BoundSized => unique_type_id.push_str("Sized"),
-                        ty::BoundCopy => unique_type_id.push_str("Copy"),
-                        ty::BoundSync => unique_type_id.push_str("Sync"),
-                    };
-                    unique_type_id.push_char('+');
-                }
+            ty::ty_closure(box ref closure_ty) => {
+                self.get_unique_type_id_of_closure_type(cx,
+                                                        closure_ty.clone(),
+                                                        &mut unique_type_id);
+            },
+            ty::ty_unboxed_closure(ref def_id, _) => {
+                let closure_ty = cx.tcx().unboxed_closures.borrow()
+                                   .find(def_id).unwrap().closure_type.clone();
+                self.get_unique_type_id_of_closure_type(cx,
+                                                        closure_ty,
+                                                        &mut unique_type_id);
             },
             _ => {
                 cx.sess().bug(format!("get_unique_type_id_of_type() - unexpected type: {}, {:?}",
@@ -581,6 +538,66 @@ impl TypeMap {
         }
     }
 
+    fn get_unique_type_id_of_closure_type(&mut self,
+                                          cx: &CrateContext,
+                                          closure_ty: ty::ClosureTy,
+                                          unique_type_id: &mut String) {
+        let ty::ClosureTy { fn_style,
+                            onceness,
+                            store,
+                            ref bounds,
+                            ref sig,
+                            abi: _ } = closure_ty;
+        if fn_style == ast::UnsafeFn {
+            unique_type_id.push_str("unsafe ");
+        }
+
+        if onceness == ast::Once {
+            unique_type_id.push_str("once ");
+        }
+
+        match store {
+            ty::UniqTraitStore => unique_type_id.push_str("~|"),
+            ty::RegionTraitStore(_, ast::MutMutable) => {
+                unique_type_id.push_str("&mut|")
+            }
+            ty::RegionTraitStore(_, ast::MutImmutable) => {
+                unique_type_id.push_str("&|")
+            }
+        };
+
+        for &parameter_type in sig.inputs.iter() {
+            let parameter_type_id =
+                self.get_unique_type_id_of_type(cx, parameter_type);
+            let parameter_type_id =
+                self.get_unique_type_id_as_string(parameter_type_id);
+            unique_type_id.push_str(parameter_type_id.as_slice());
+            unique_type_id.push_char(',');
+        }
+
+        if sig.variadic {
+            unique_type_id.push_str("...");
+        }
+
+        unique_type_id.push_str("|->");
+
+        let return_type_id = self.get_unique_type_id_of_type(cx, sig.output);
+        let return_type_id = self.get_unique_type_id_as_string(return_type_id);
+        unique_type_id.push_str(return_type_id.as_slice());
+
+        unique_type_id.push_char(':');
+
+        for bound in bounds.builtin_bounds.iter() {
+            match bound {
+                ty::BoundSend => unique_type_id.push_str("Send"),
+                ty::BoundSized => unique_type_id.push_str("Sized"),
+                ty::BoundCopy => unique_type_id.push_str("Copy"),
+                ty::BoundSync => unique_type_id.push_str("Sync"),
+            };
+            unique_type_id.push_char('+');
+        }
+    }
+
     // Get the UniqueTypeId for an enum variant. Enum variants are not really
     // types of their own, so they need special handling. We still need a
     // UniqueTypeId for them, since to debuginfo they *are* real types.
@@ -2903,6 +2920,11 @@ fn type_metadata(cx: &CrateContext,
         ty::ty_closure(ref closurety) => {
             subroutine_type_metadata(cx, unique_type_id, &closurety.sig, usage_site_span)
         }
+        ty::ty_unboxed_closure(ref def_id, _) => {
+            let sig = cx.tcx().unboxed_closures.borrow()
+                        .find(def_id).unwrap().closure_type.sig.clone();
+            subroutine_type_metadata(cx, unique_type_id, &sig, usage_site_span)
+        }
         ty::ty_struct(def_id, ref substs) => {
             prepare_struct_metadata(cx,
                                     t,
diff --git a/src/test/run-pass/unboxed-closures-unique-type-id.rs b/src/test/run-pass/unboxed-closures-unique-type-id.rs
index f35daa65a43..43ab16c106f 100644
--- a/src/test/run-pass/unboxed-closures-unique-type-id.rs
+++ b/src/test/run-pass/unboxed-closures-unique-type-id.rs
@@ -16,6 +16,8 @@
 //    ReScope(63u32))
 //
 // This is a regression test for issue #17021.
+//
+// compile-flags: -g
 
 #![feature(unboxed_closures, overloaded_calls)]