authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-03 19:07:15-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-03 19:07:15-07:00
logc3123158b72d70444fa4cbe134b375c7029a4b46
tree48ba1cce1671453d7fa7b69138849bc52d0205e6
parent39223c1847af19622db237d92e31c7be3cb805a2

fix handling of implicit casts in binary operators


2 files changed, 18 insertions(+), 19 deletions(-)

src/analyze.cpp+17-17
......@@ -2841,12 +2841,12 @@ static TypeTableEntry *analyze_bin_op_expr(CodeGen *g, ImportTableEntry *import,
28412841 case BinOpTypeDiv:
28422842 case BinOpTypeMod:
28432843 {
2844 AstNode *op1 = node->data.bin_op_expr.op1;
2845 AstNode *op2 = node->data.bin_op_expr.op2;
2846 TypeTableEntry *lhs_type = analyze_expression(g, import, context, expected_type, op1);
2847 TypeTableEntry *rhs_type = analyze_expression(g, import, context, expected_type, op2);
2844 AstNode **op1 = node->data.bin_op_expr.op1->parent_field;
2845 AstNode **op2 = node->data.bin_op_expr.op2->parent_field;
2846 TypeTableEntry *lhs_type = analyze_expression(g, import, context, expected_type, *op1);
2847 TypeTableEntry *rhs_type = analyze_expression(g, import, context, expected_type, *op2);
28482848
2849 AstNode *op_nodes[] = {op1, op2};
2849 AstNode *op_nodes[] = {*op1, *op2};
28502850 TypeTableEntry *op_types[] = {lhs_type, rhs_type};
28512851
28522852 TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node,
......@@ -2856,32 +2856,32 @@ static TypeTableEntry *analyze_bin_op_expr(CodeGen *g, ImportTableEntry *import,
28562856 return resolved_type;
28572857 }
28582858
2859 ConstExprValue *op1_val = &get_resolved_expr(op1)->const_val;
2860 ConstExprValue *op2_val = &get_resolved_expr(op2)->const_val;
2859 ConstExprValue *op1_val = &get_resolved_expr(*op1)->const_val;
2860 ConstExprValue *op2_val = &get_resolved_expr(*op2)->const_val;
28612861 if (!op1_val->ok || !op2_val->ok) {
28622862 return resolved_type;
28632863 }
28642864
28652865 if (bin_op_type == BinOpTypeAdd) {
2866 return resolve_expr_const_val_as_bignum_op(g, node, bignum_add, op1, op2, resolved_type);
2866 return resolve_expr_const_val_as_bignum_op(g, node, bignum_add, *op1, *op2, resolved_type);
28672867 } else if (bin_op_type == BinOpTypeSub) {
2868 return resolve_expr_const_val_as_bignum_op(g, node, bignum_sub, op1, op2, resolved_type);
2868 return resolve_expr_const_val_as_bignum_op(g, node, bignum_sub, *op1, *op2, resolved_type);
28692869 } else if (bin_op_type == BinOpTypeMult) {
2870 return resolve_expr_const_val_as_bignum_op(g, node, bignum_mul, op1, op2, resolved_type);
2870 return resolve_expr_const_val_as_bignum_op(g, node, bignum_mul, *op1, *op2, resolved_type);
28712871 } else if (bin_op_type == BinOpTypeDiv) {
2872 return resolve_expr_const_val_as_bignum_op(g, node, bignum_div, op1, op2, resolved_type);
2872 return resolve_expr_const_val_as_bignum_op(g, node, bignum_div, *op1, *op2, resolved_type);
28732873 } else if (bin_op_type == BinOpTypeMod) {
2874 return resolve_expr_const_val_as_bignum_op(g, node, bignum_mod, op1, op2, resolved_type);
2874 return resolve_expr_const_val_as_bignum_op(g, node, bignum_mod, *op1, *op2, resolved_type);
28752875 } else if (bin_op_type == BinOpTypeBinOr) {
2876 return resolve_expr_const_val_as_bignum_op(g, node, bignum_or, op1, op2, resolved_type);
2876 return resolve_expr_const_val_as_bignum_op(g, node, bignum_or, *op1, *op2, resolved_type);
28772877 } else if (bin_op_type == BinOpTypeBinAnd) {
2878 return resolve_expr_const_val_as_bignum_op(g, node, bignum_and, op1, op2, resolved_type);
2878 return resolve_expr_const_val_as_bignum_op(g, node, bignum_and, *op1, *op2, resolved_type);
28792879 } else if (bin_op_type == BinOpTypeBinXor) {
2880 return resolve_expr_const_val_as_bignum_op(g, node, bignum_xor, op1, op2, resolved_type);
2880 return resolve_expr_const_val_as_bignum_op(g, node, bignum_xor, *op1, *op2, resolved_type);
28812881 } else if (bin_op_type == BinOpTypeBitShiftLeft) {
2882 return resolve_expr_const_val_as_bignum_op(g, node, bignum_shl, op1, op2, resolved_type);
2882 return resolve_expr_const_val_as_bignum_op(g, node, bignum_shl, *op1, *op2, resolved_type);
28832883 } else if (bin_op_type == BinOpTypeBitShiftRight) {
2884 return resolve_expr_const_val_as_bignum_op(g, node, bignum_shr, op1, op2, resolved_type);
2884 return resolve_expr_const_val_as_bignum_op(g, node, bignum_shr, *op1, *op2, resolved_type);
28852885 } else {
28862886 zig_unreachable();
28872887 }
std/test_runner.zig+1-2
......@@ -10,8 +10,7 @@ extern var zig_test_fn_list: []TestFn;
1010pub fn main(args: [][]u8) -> %void {
1111 for (test_fn, zig_test_fn_list, i) {
1212 %%stderr.print_str("Test ");
13 // TODO get rid of the isize
14 %%stderr.print_i64(i + isize(1));
13 %%stderr.print_i64(i + 1);
1514 %%stderr.print_str("/");
1615 %%stderr.print_i64(zig_test_fn_list.len);
1716 %%stderr.print_str(" ");