| ... | @@ -3014,20 +3014,52 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im | ... | @@ -3014,20 +3014,52 @@ static TypeTableEntry *analyze_bool_bin_op_expr(CodeGen *g, ImportTableEntry *im |
| 3014 | TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node, | 3014 | TypeTableEntry *resolved_type = resolve_peer_type_compatibility(g, import, context, node, |
| 3015 | op_nodes, op_types, 2); | 3015 | op_nodes, op_types, 2); |
| 3016 | | 3016 | |
| 3017 | bool type_can_gt_lt_cmp = (resolved_type->id == TypeTableEntryIdNumLitFloat || | 3017 | bool is_equality_cmp = (bin_op_type == BinOpTypeCmpEq || bin_op_type == BinOpTypeCmpNotEq); |
| 3018 | resolved_type->id == TypeTableEntryIdNumLitInt || | | |
| 3019 | resolved_type->id == TypeTableEntryIdFloat || | | |
| 3020 | resolved_type->id == TypeTableEntryIdInt); | | |
| 3021 | | 3018 | |
| 3022 | if (resolved_type->id == TypeTableEntryIdInvalid) { | 3019 | switch (resolved_type->id) { |
| 3023 | return g->builtin_types.entry_invalid; | 3020 | case TypeTableEntryIdInvalid: |
| 3024 | } else if (bin_op_type != BinOpTypeCmpEq && | 3021 | return g->builtin_types.entry_invalid; |
| 3025 | bin_op_type != BinOpTypeCmpNotEq && | 3022 | |
| 3026 | !type_can_gt_lt_cmp) | 3023 | case TypeTableEntryIdNumLitFloat: |
| 3027 | { | 3024 | case TypeTableEntryIdNumLitInt: |
| 3028 | add_node_error(g, node, | 3025 | case TypeTableEntryIdInt: |
| 3029 | buf_sprintf("operator not allowed for type '%s'", buf_ptr(&resolved_type->name))); | 3026 | case TypeTableEntryIdFloat: |
| 3030 | return g->builtin_types.entry_invalid; | 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 | ConstExprValue *op1_val = &get_resolved_expr(*op1)->const_val; | 3065 | ConstExprValue *op1_val = &get_resolved_expr(*op1)->const_val; |