authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-06 14:15:20-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-06 14:15:20-07:00
log57688dea36e6d1f8d7bad255898d1e222b3a6fbc
tree6aa180ef0197b047899b1b823106dd4cf838e2d0
parent7bb67b1fd0ca56a04778083f1a01583d839be9b1

add error for gt and lt comparison of invalid types


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

src/analyze.cpp+13-5
...@@ -2845,8 +2845,20 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im...@@ -2845,8 +2845,20 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im
2845 TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node,2845 TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node,
2846 op_nodes, op_types, 2);2846 op_nodes, op_types, 2);
28472847
2848 bool type_can_gt_lt_cmp = (resolved_type->id == TypeTableEntryIdNumLitFloat ||
2849 resolved_type->id == TypeTableEntryIdNumLitInt ||
2850 resolved_type->id == TypeTableEntryIdFloat ||
2851 resolved_type->id == TypeTableEntryIdInt);
2852
2848 if (resolved_type->id == TypeTableEntryIdInvalid) {2853 if (resolved_type->id == TypeTableEntryIdInvalid) {
2849 return g->builtin_types.entry_invalid;2854 return g->builtin_types.entry_invalid;
2855 } else if (bin_op_type != BinOpTypeCmpEq &&
2856 bin_op_type != BinOpTypeCmpNotEq &&
2857 !type_can_gt_lt_cmp)
2858 {
2859 add_node_error(g, node,
2860 buf_sprintf("operator not allowed for type '%s'", buf_ptr(&resolved_type->name)));
2861 return g->builtin_types.entry_invalid;
2850 }2862 }
28512863
2852 ConstExprValue *op1_val = &get_resolved_expr(op1)->const_val;2864 ConstExprValue *op1_val = &get_resolved_expr(op1)->const_val;
...@@ -2856,11 +2868,7 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im...@@ -2856,11 +2868,7 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im
2856 }2868 }
28572869
2858 bool answer;2870 bool answer;
2859 if (resolved_type->id == TypeTableEntryIdNumLitFloat ||2871 if (type_can_gt_lt_cmp) {
2860 resolved_type->id == TypeTableEntryIdNumLitInt ||
2861 resolved_type->id == TypeTableEntryIdFloat ||
2862 resolved_type->id == TypeTableEntryIdInt)
2863 {
2864 bool (*bignum_cmp)(BigNum *, BigNum *);2872 bool (*bignum_cmp)(BigNum *, BigNum *);
2865 if (bin_op_type == BinOpTypeCmpEq) {2873 if (bin_op_type == BinOpTypeCmpEq) {
2866 bignum_cmp = bignum_cmp_eq;2874 bignum_cmp = bignum_cmp_eq;
test/run_tests.cpp+5
...@@ -1776,6 +1776,11 @@ fn f() {...@@ -1776,6 +1776,11 @@ fn f() {
1776const foo = "a1776const foo = "a
1777b";1777b";
1778 )SOURCE", 1, ".tmp_source.zig:2:13: error: use raw string for multiline string literal");1778 )SOURCE", 1, ".tmp_source.zig:2:13: error: use raw string for multiline string literal");
1779
1780 add_compile_fail_case("invalid comparison for function pointers", R"SOURCE(
1781fn foo() {}
1782const invalid = foo > foo;
1783 )SOURCE", 1, ".tmp_source.zig:3:21: error: operator not allowed for type 'fn()'");
1779}1784}
17801785
1781//////////////////////////////////////////////////////////////////////////////1786//////////////////////////////////////////////////////////////////////////////