about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-07-20 19:04:45 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-07-20 19:04:45 -0700
commit3ec3b02ed086b6061dcda7cc93dbfe90a4253d8b (patch)
tree15ee804aab81fda9be74163e1bbc77f298f99057 /src
parent142ff3bb4ee0c58efc9185505695681468df3e05 (diff)
downloadrust-3ec3b02ed086b6061dcda7cc93dbfe90a4253d8b.tar.gz
rust-3ec3b02ed086b6061dcda7cc93dbfe90a4253d8b.zip
rustc: Strip cnames before generating glue to avoid duplicates
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans.rs8
-rw-r--r--src/comp/middle/ty.rs5
2 files changed, 11 insertions, 2 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 691339a652c..fb79b360252 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1370,9 +1370,11 @@ fn get_derived_tydesc(&@block_ctxt cx, &ty::t t, bool escapes,
     ret rslt(cx, v);
 }
 
-fn get_tydesc(&@block_ctxt cx, &ty::t t, bool escapes,
+fn get_tydesc(&@block_ctxt cx, &ty::t orig_t, bool escapes,
               &mutable option::t[@tydesc_info] static_ti) -> result {
 
+    auto t = ty::strip_cname(cx.fcx.lcx.ccx.tcx, orig_t);
+
     // Is the supplied type a type param? If so, return the passed-in tydesc.
     alt (ty::type_param(cx.fcx.lcx.ccx.tcx, t)) {
         case (some(?id)) { ret rslt(cx, cx.fcx.lltydescs.(id)); }
@@ -1390,8 +1392,10 @@ fn get_tydesc(&@block_ctxt cx, &ty::t t, bool escapes,
     ret rslt(cx, info.tydesc);
 }
 
-fn get_static_tydesc(&@block_ctxt cx, &ty::t t, &uint[] ty_params)
+fn get_static_tydesc(&@block_ctxt cx, &ty::t orig_t, &uint[] ty_params)
         -> @tydesc_info {
+    auto t = ty::strip_cname(cx.fcx.lcx.ccx.tcx, orig_t);
+
     alt (cx.fcx.lcx.ccx.tydescs.find(t)) {
         case (some(?info)) { ret info; }
         case (none) {
diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs
index 4717bd56efe..42973866499 100644
--- a/src/comp/middle/ty.rs
+++ b/src/comp/middle/ty.rs
@@ -108,6 +108,7 @@ export sequence_is_interior;
 export struct;
 export sort_methods;
 export stmt_node_id;
+export strip_cname;
 export sty;
 export substitute_type_params;
 export t;
@@ -855,10 +856,14 @@ fn fold_ty(&ctxt cx, fold_mode fld, t ty_0) -> t {
 
 
 // Type utilities
+
 fn rename(&ctxt cx, t typ, str new_cname) -> t {
     ret gen_ty_full(cx, struct(cx, typ), some[str](new_cname));
 }
 
+fn strip_cname(&ctxt cx, t typ) -> t {
+    ret gen_ty_full(cx, struct(cx, typ), none);
+}
 
 // Returns a type with the structural part taken from `struct_ty` and the
 // canonical name from `cname_ty`.