diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-02-24 13:51:53 -0800 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2011-02-24 14:24:32 -0800 |
| commit | dcd65fac199d3caac4b1019304ef5e1b480f31ff (patch) | |
| tree | 00f11f18239cafd5a2f5f2efa05febc8389201b6 /src/comp | |
| parent | 5332250d3bddf509994832965f3c5d7b68662ce4 (diff) | |
| download | rust-dcd65fac199d3caac4b1019304ef5e1b480f31ff.tar.gz rust-dcd65fac199d3caac4b1019304ef5e1b480f31ff.zip | |
Cast more aggressively to the callee type when calling generic functions. Add a test-case for this, and XFAIL it in rustboot.
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/trans.rs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 30f3cdc4495..a3a1d83fc3e 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3091,6 +3091,12 @@ fn trans_args(@block_ctxt cx, } // ... then explicit args. + + // First we figure out the caller's view of the types of the arguments. + // This will be needed if this is a generic call, because the callee has + // to cast her view of the arguments to the caller's view. + auto arg_tys = type_of_explicit_args(cx.fcx.ccx, args); + auto i = 0u; for (@ast.expr e in es) { auto mode = args.(i).mode; @@ -3132,9 +3138,9 @@ fn trans_args(@block_ctxt cx, bcx = re.bcx; } - if (ty.type_has_dynamic_size(args.(i).ty)) { - val = bcx.build.PointerCast(val, - T_typaram_ptr(cx.fcx.ccx.tn)); + if (ty.count_ty_params(args.(i).ty) > 0u) { + auto lldestty = arg_tys.(i); + val = bcx.build.PointerCast(val, lldestty); } llargs += val; |
