about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-03-09 13:31:25 -0800
committerPatrick Walton <pcwalton@mimiga.net>2011-03-09 13:31:25 -0800
commit2986ed43e9326d87e97072979a44ebe22e829d66 (patch)
tree3ad628908fa33fb6b40855aebdf55c2dd7bb0daa
parent9aa26904b83266576f9a05d5b1b9ca99b8ed0533 (diff)
downloadrust-2986ed43e9326d87e97072979a44ebe22e829d66.tar.gz
rust-2986ed43e9326d87e97072979a44ebe22e829d66.zip
rustc: Substitute type parameters in type_of_variant(). Add a test case.
-rw-r--r--src/comp/middle/trans.rs15
-rw-r--r--src/test/run-pass/generic-tag-local.rs8
2 files changed, 18 insertions, 5 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 063789274b6..d9037c6223a 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1699,11 +1699,15 @@ fn variant_types(@crate_ctxt cx, &ast.variant v) -> vec[@ty.t] {
     ret tys;
 }
 
-fn type_of_variant(@crate_ctxt cx, &ast.variant v) -> TypeRef {
+fn type_of_variant(@crate_ctxt cx,
+                   &ast.variant v,
+                   vec[ast.ty_param] ty_params,
+                   vec[@ty.t] ty_param_substs) -> TypeRef {
     let vec[TypeRef] lltys = vec();
     auto tys = variant_types(cx, v);
     for (@ty.t typ in tys) {
-        lltys += vec(type_of(cx, typ));
+        auto typ2 = ty.substitute_ty_params(ty_params, ty_param_substs, typ);
+        lltys += vec(type_of(cx, typ2));
     }
     ret T_struct(lltys);
 }
@@ -1850,6 +1854,8 @@ fn iter_structural_ty_full(@block_ctxt cx,
 
             auto next_cx = new_sub_block_ctxt(bcx, "tag-iter-next");
 
+            auto ty_params = tag_ty_params(bcx.fcx.ccx, tid);
+
             auto i = 0u;
             for (ast.variant variant in variants) {
                 auto variant_cx = new_sub_block_ctxt(bcx,
@@ -1859,7 +1865,8 @@ fn iter_structural_ty_full(@block_ctxt cx,
 
                 if (_vec.len[ast.variant_arg](variant.args) > 0u) {
                     // N-ary variant.
-                    auto llvarty = type_of_variant(bcx.fcx.ccx, variants.(i));
+                    auto llvarty = type_of_variant(bcx.fcx.ccx, variants.(i),
+                                                   ty_params, tps);
 
                     auto fn_ty = ty.ann_to_type(variants.(i).ann);
                     alt (fn_ty.struct) {
@@ -1870,8 +1877,6 @@ fn iter_structural_ty_full(@block_ctxt cx,
                             auto llvarp_b = variant_cx.build.
                                 TruncOrBitCast(llunion_b_ptr, T_ptr(llvarty));
 
-                            auto ty_params = tag_ty_params(bcx.fcx.ccx, tid);
-
                             auto j = 0u;
                             for (ty.arg a in args) {
                                 auto v = vec(C_int(0), C_int(j as int));
diff --git a/src/test/run-pass/generic-tag-local.rs b/src/test/run-pass/generic-tag-local.rs
new file mode 100644
index 00000000000..63e2e195285
--- /dev/null
+++ b/src/test/run-pass/generic-tag-local.rs
@@ -0,0 +1,8 @@
+tag clam[T] {
+    a(T);
+}
+
+fn main() {
+    auto c = a(3);
+}
+