Skip to content

This compiles and shouldn't. #700

Closed
Closed
@eholk

Description

@eholk
fn trans_send(&@block_ctxt cx, &@ast::expr lhs, &@ast::expr rhs,
              ast::node_id id) -> result {
    auto bcx = cx;
    auto chn = trans_expr(bcx, lhs);
    bcx = chn.bcx;
    auto data = trans_lval(bcx, rhs);
    bcx = data.res.bcx;
    auto chan_ty = node_id_type(cx.fcx.lcx.ccx, id);
    auto unit_ty;
    alt (ty::struct(cx.fcx.lcx.ccx.tcx, chan_ty)) {
        case (ty::ty_chan(?t)) { unit_ty = t; }
        case (_) { bcx.fcx.lcx.ccx.sess.bug("non-chan type in trans_send"); }
    }

    auto target = bcx.build.Call(bcx.fcx.lcx.ccx.upcalls.chan_target_task,
                                 ~[bcx.fcx.lltaskptr, llchanval]);

    auto data_tmp = deep_copy(bcx, data.res.val, unit_ty, target);

    bcx = data_tmp.bcx;
    auto llchanval = bcx.build.PointerCast(chn.val, T_opaque_chan_ptr());
    auto lldataptr = bcx.build.PointerCast(data_tmp.val, T_ptr(T_i8()));
    bcx.build.Call(bcx.fcx.lcx.ccx.upcalls.send,
                   ~[bcx.fcx.lltaskptr, llchanval, lldataptr]);
    ret rslt(bcx, chn.val);
}

Sorry it's so long, it wasn't obvious how to reduce it. This is code copied out of trans_comm.rs, but with some as-yet uncommitted changes. It's causing an LLVM assert because I'm passing llchanval to Build in the auto target = ... line. I'm using llchanval before it's even declared, let along initialized.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions