zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 57688dea36e6d1f8d7bad255898d1e222b3a6fbc (tree)
parent 7bb67b1fd0ca56a04778083f1a01583d839be9b1
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Wed,  6 Apr 2016 14:15:20 -0700

add error for gt and lt comparison of invalid types

Diffstat:
Msrc/analyze.cpp | 18+++++++++++++-----
Mtest/run_tests.cpp | 5+++++
2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/analyze.cpp b/src/analyze.cpp @@ -2845,8 +2845,20 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node, op_nodes, op_types, 2); + bool type_can_gt_lt_cmp = (resolved_type->id == TypeTableEntryIdNumLitFloat || + resolved_type->id == TypeTableEntryIdNumLitInt || + resolved_type->id == TypeTableEntryIdFloat || + resolved_type->id == TypeTableEntryIdInt); + if (resolved_type->id == TypeTableEntryIdInvalid) { return g->builtin_types.entry_invalid; + } else if (bin_op_type != BinOpTypeCmpEq && + bin_op_type != BinOpTypeCmpNotEq && + !type_can_gt_lt_cmp) + { + add_node_error(g, node, + buf_sprintf("operator not allowed for type '%s'", buf_ptr(&resolved_type->name))); + return g->builtin_types.entry_invalid; } ConstExprValue *op1_val = &get_resolved_expr(op1)->const_val; @@ -2856,11 +2868,7 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im } bool answer; - if (resolved_type->id == TypeTableEntryIdNumLitFloat || - resolved_type->id == TypeTableEntryIdNumLitInt || - resolved_type->id == TypeTableEntryIdFloat || - resolved_type->id == TypeTableEntryIdInt) - { + if (type_can_gt_lt_cmp) { bool (*bignum_cmp)(BigNum *, BigNum *); if (bin_op_type == BinOpTypeCmpEq) { bignum_cmp = bignum_cmp_eq; diff --git a/test/run_tests.cpp b/test/run_tests.cpp @@ -1776,6 +1776,11 @@ fn f() { const foo = "a b"; )SOURCE", 1, ".tmp_source.zig:2:13: error: use raw string for multiline string literal"); + + add_compile_fail_case("invalid comparison for function pointers", R"SOURCE( +fn foo() {} +const invalid = foo > foo; + )SOURCE", 1, ".tmp_source.zig:3:21: error: operator not allowed for type 'fn()'"); } //////////////////////////////////////////////////////////////////////////////