aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-03-09 16:07:55 -0800
committerPatrick Walton <[email protected]>2011-03-09 16:07:55 -0800
commitea2c86874448439a31012ccb141450c67e3d94d8 (patch)
tree68833c7d2988438da9bbfc88de251dc1801ba498
parentrustc Remove dead "llunit_ty" assignment in trans_index (diff)
downloadrust-ea2c86874448439a31012ccb141450c67e3d94d8.tar.xz
rust-ea2c86874448439a31012ccb141450c67e3d94d8.zip
rustc: Perform type substitutions for tag variants in dynamic_size_of()
-rw-r--r--src/comp/middle/trans.rs10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 57dc9121..3c5253ff 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1020,9 +1020,17 @@ fn dynamic_size_of(@block_ctxt cx, @ty.t t) -> result {
let ValueRef max_size = bcx.build.Alloca(T_int());
bcx.build.Store(C_int(0), max_size);
+ auto ty_params = tag_ty_params(bcx.fcx.ccx, tid);
auto variants = tag_variants(bcx.fcx.ccx, tid);
for (ast.variant variant in variants) {
- let vec[@ty.t] tys = variant_types(bcx.fcx.ccx, variant);
+ // Perform type substitution on the raw variant types.
+ let vec[@ty.t] raw_tys = variant_types(bcx.fcx.ccx, variant);
+ let vec[@ty.t] tys = vec();
+ for (@ty.t raw_ty in raw_tys) {
+ auto t = ty.substitute_ty_params(ty_params, tps, raw_ty);
+ tys += vec(t);
+ }
+
auto rslt = align_elements(bcx, tys);
bcx = rslt.bcx;