}
    private Item coerce(Item item, MSILType toType) {	assert item != null && toType != null : "" + item + " => " + toType;	if (item.type.equals(toType))	    return item;	if (toType == MSILType.VOID)	    return drop(item);	switch (item) {	case VoidItem():	case SelfItem():	    return item;	case StackItem():	    emitConvert(item.type, toType);	    item.type = toType;	    return item;	case LiteralItem(MSILType type, AConstant value):	    switch (type) {	    case REF(Type t):		assert type.isSubtypeOf(toType);	    }	    item.type = toType;	    return item;	case ArgItem(_):	case LocalItem(_):	    if (item.type.isSubtypeOf(toType))		return item;	    break;	case CondItem(_, _, _):	    if (item.type == MSILType.BOOL)		return item;	    break;	}	return coerce(load(item), toType);    }