| ... | ... | @@ -3014,20 +3014,52 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im |
| 3014 | 3014 | TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node, |
| 3015 | 3015 | op_nodes, op_types, 2); |
| 3016 | 3016 | |
| 3017 | | bool type_can_gt_lt_cmp = (resolved_type->id == TypeTableEntryIdNumLitFloat || |
| 3018 | | resolved_type->id == TypeTableEntryIdNumLitInt || |
| 3019 | | resolved_type->id == TypeTableEntryIdFloat || |
| 3020 | | resolved_type->id == TypeTableEntryIdInt); |
| 3017 | bool is_equality_cmp = (bin_op_type == BinOpTypeCmpEq || bin_op_type == BinOpTypeCmpNotEq); |
| 3021 | 3018 | |
| 3022 | | if (resolved_type->id == TypeTableEntryIdInvalid) { |
| 3023 | | return g->builtin_types.entry_invalid; |
| 3024 | | } else if (bin_op_type != BinOpTypeCmpEq && |
| 3025 | | bin_op_type != BinOpTypeCmpNotEq && |
| 3026 | | !type_can_gt_lt_cmp) |
| 3027 | | { |
| 3028 | | add_node_error(g, node, |
| 3029 | | buf_sprintf("operator not allowed for type '%s'", buf_ptr(&resolved_type->name))); |
| 3030 | | return g->builtin_types.entry_invalid; |
| 3019 | switch (resolved_type->id) { |
| 3020 | case TypeTableEntryIdInvalid: |
| 3021 | return g->builtin_types.entry_invalid; |
| 3022 | |
| 3023 | case TypeTableEntryIdNumLitFloat: |
| 3024 | case TypeTableEntryIdNumLitInt: |
| 3025 | case TypeTableEntryIdInt: |
| 3026 | case TypeTableEntryIdFloat: |
| 3027 | break; |
| 3028 | |
| 3029 | case TypeTableEntryIdBool: |
| 3030 | case TypeTableEntryIdMetaType: |
| 3031 | case TypeTableEntryIdVoid: |
| 3032 | case TypeTableEntryIdPointer: |
| 3033 | case TypeTableEntryIdPureError: |
| 3034 | case TypeTableEntryIdFn: |
| 3035 | case TypeTableEntryIdTypeDecl: |
| 3036 | case TypeTableEntryIdNamespace: |
| 3037 | case TypeTableEntryIdGenericFn: |
| 3038 | if (!is_equality_cmp) { |
| 3039 | add_node_error(g, node, |
| 3040 | buf_sprintf("operator not allowed for type '%s'", buf_ptr(&resolved_type->name))); |
| 3041 | return g->builtin_types.entry_invalid; |
| 3042 | } |
| 3043 | break; |
| 3044 | |
| 3045 | case TypeTableEntryIdEnum: |
| 3046 | if (!is_equality_cmp || resolved_type->data.enumeration.gen_field_count != 0) { |
| 3047 | add_node_error(g, node, |
| 3048 | buf_sprintf("operator not allowed for type '%s'", buf_ptr(&resolved_type->name))); |
| 3049 | return g->builtin_types.entry_invalid; |
| 3050 | } |
| 3051 | break; |
| 3052 | |
| 3053 | case TypeTableEntryIdUnreachable: |
| 3054 | case TypeTableEntryIdArray: |
| 3055 | case TypeTableEntryIdStruct: |
| 3056 | case TypeTableEntryIdUndefLit: |
| 3057 | case TypeTableEntryIdMaybe: |
| 3058 | case TypeTableEntryIdErrorUnion: |
| 3059 | case TypeTableEntryIdUnion: |
| 3060 | add_node_error(g, node, |
| 3061 | buf_sprintf("operator not allowed for type '%s'", buf_ptr(&resolved_type->name))); |
| 3062 | return g->builtin_types.entry_invalid; |
| 3031 | 3063 | } |
| 3032 | 3064 | |
| 3033 | 3065 | ConstExprValue *op1_val = &get_resolved_expr(*op1)->const_val; |