aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-04-06 14:15:20 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-04-06 14:15:20 -0700
commit57688dea36e6d1f8d7bad255898d1e222b3a6fbc (patch)
tree6aa180ef0197b047899b1b823106dd4cf838e2d0 /src/analyze.cpp
parent7bb67b1fd0ca56a04778083f1a01583d839be9b1 (diff)
downloadzig-57688dea36e6d1f8d7bad255898d1e222b3a6fbc.tar.gz
zig-57688dea36e6d1f8d7bad255898d1e222b3a6fbc.zip
add error for gt and lt comparison of invalid types
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 91fbddf717..a8986e9992 100644
--- 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;