From 5ca4fdfc981a9c0c7ecf3e23c4b26c05a6a7d2fe Mon Sep 17 00:00:00 2001 From: Jed Davis Date: Sun, 24 Feb 2013 21:26:34 -0800 Subject: [PATCH] Convert trans_tuple_struct to trans::adt. Surely this cannot be the best way to get the type. --- src/librustc/middle/trans/base.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 342da3fadf70..9120ac3083a0 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -1938,8 +1938,23 @@ pub fn trans_tuple_struct(ccx: @CrateContext, let arg_tys = ty::ty_fn_args(node_id_type(bcx, ctor_id)); let bcx = copy_args_to_allocas(fcx, bcx, fn_args, raw_llargs, arg_tys); + // XXX is there a better way to reconstruct the ty::t? + let ty_param_substs = match param_substs { + Some(ref substs) => /*bad*/copy substs.tys, + None => ~[] + }; + let ctor_ty = ty::subst_tps(ccx.tcx, ty_param_substs, None, + ty::node_id_to_type(ccx.tcx, ctor_id)); + let tup_ty = match ty::get(ctor_ty).sty { + ty::ty_bare_fn(ref bft) => bft.sig.output, + _ => ccx.sess.bug(fmt!("trans_tuple_struct: unexpected ctor \ + return type %s", + ty_to_str(ccx.tcx, ctor_ty))) + }; + let repr = adt::represent_type(ccx, tup_ty); + for fields.eachi |i, field| { - let lldestptr = GEPi(bcx, fcx.llretptr, [0, 0, i]); + let lldestptr = adt::trans_GEP(bcx, &repr, fcx.llretptr, 0, i); let llarg = match fcx.llargs.get(&field.node.id) { local_mem(x) => x, _ => {