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,...@@ -2841,12 +2841,12 @@ static TypeTableEntry *analyze_bin_op_expr(CodeGen *g, ImportTableEntry *import,
2841 case BinOpTypeDiv:2841 case BinOpTypeDiv:
2842 case BinOpTypeMod:2842 case BinOpTypeMod:
2843 {2843 {
2844 AstNode *op1 = node->data.bin_op_expr.op1;2844 AstNode **op1 = node->data.bin_op_expr.op1->parent_field;
2845 AstNode *op2 = node->data.bin_op_expr.op2;2845 AstNode **op2 = node->data.bin_op_expr.op2->parent_field;
2846 TypeTableEntry *lhs_type = analyze_expression(g, import, context, expected_type, op1);2846 TypeTableEntry *lhs_type = analyze_expression(g, import, context, expected_type, *op1);
2847 TypeTableEntry *rhs_type = analyze_expression(g, import, context, expected_type, op2);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};
2850 TypeTableEntry *op_types[] = {lhs_type, rhs_type};2850 TypeTableEntry *op_types[] = {lhs_type, rhs_type};
28512851
2852 TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node,2852 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,...@@ -2856,32 +2856,32 @@ static TypeTableEntry *analyze_bin_op_expr(CodeGen *g, ImportTableEntry *import,
2856 return resolved_type;2856 return resolved_type;
2857 }2857 }
28582858
2859 ConstExprValue *op1_val = &get_resolved_expr(op1)->const_val;2859 ConstExprValue *op1_val = &get_resolved_expr(*op1)->const_val;
2860 ConstExprValue *op2_val = &get_resolved_expr(op2)->const_val;2860 ConstExprValue *op2_val = &get_resolved_expr(*op2)->const_val;
2861 if (!op1_val->ok || !op2_val->ok) {2861 if (!op1_val->ok || !op2_val->ok) {
2862 return resolved_type;2862 return resolved_type;
2863 }2863 }
28642864
2865 if (bin_op_type == BinOpTypeAdd) {2865 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);
2867 } else if (bin_op_type == BinOpTypeSub) {2867 } 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);
2869 } else if (bin_op_type == BinOpTypeMult) {2869 } 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);
2871 } else if (bin_op_type == BinOpTypeDiv) {2871 } 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);
2873 } else if (bin_op_type == BinOpTypeMod) {2873 } 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);
2875 } else if (bin_op_type == BinOpTypeBinOr) {2875 } 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);
2877 } else if (bin_op_type == BinOpTypeBinAnd) {2877 } 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);
2879 } else if (bin_op_type == BinOpTypeBinXor) {2879 } 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);
2881 } else if (bin_op_type == BinOpTypeBitShiftLeft) {2881 } 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);
2883 } else if (bin_op_type == BinOpTypeBitShiftRight) {2883 } 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);
2885 } else {2885 } else {
2886 zig_unreachable();2886 zig_unreachable();
2887 }2887 }
std/test_runner.zig+1-2
...@@ -10,8 +10,7 @@ extern var zig_test_fn_list: []TestFn;...@@ -10,8 +10,7 @@ extern var zig_test_fn_list: []TestFn;
10pub fn main(args: [][]u8) -> %void {10pub fn main(args: [][]u8) -> %void {
11 for (test_fn, zig_test_fn_list, i) {11 for (test_fn, zig_test_fn_list, i) {
12 %%stderr.print_str("Test ");12 %%stderr.print_str("Test ");
13 // TODO get rid of the isize13 %%stderr.print_i64(i + 1);
14 %%stderr.print_i64(i + isize(1));
15 %%stderr.print_str("/");14 %%stderr.print_str("/");
16 %%stderr.print_i64(zig_test_fn_list.len);15 %%stderr.print_i64(zig_test_fn_list.len);
17 %%stderr.print_str(" ");16 %%stderr.print_str(" ");