Basic_Flag_Unsigned = BH_BIT(2),
Basic_Flag_Float = BH_BIT(3),
Basic_Flag_Pointer = BH_BIT(4),
+ Basic_Flag_Multi_Pointer = BH_BIT(7),
Basic_Flag_SIMD = BH_BIT(5),
Basic_Flag_Type_Index = BH_BIT(6),
Basic_Flag_Numeric = Basic_Flag_Integer | Basic_Flag_Float,
- Basic_Flag_Ordered = Basic_Flag_Integer | Basic_Flag_Float | Basic_Flag_Pointer,
+ Basic_Flag_Ordered = Basic_Flag_Integer | Basic_Flag_Float | Basic_Flag_Pointer | Basic_Flag_Multi_Pointer,
Basic_Flag_Equality = Basic_Flag_Ordered | Basic_Flag_Type_Index | Basic_Flag_Boolean,
Basic_Flag_Constant_Type = Basic_Flag_Boolean | Basic_Flag_Numeric | Basic_Flag_Pointer,
Basic_Flag_Numeric_Ordered = Basic_Flag_Numeric | Basic_Flag_Ordered,
static b32 binary_op_is_allowed(BinaryOp operation, Type* type) {
static const u8 binop_allowed[Binary_Op_Count] = {
- /* Add */ Basic_Flag_Numeric | Basic_Flag_Pointer,
- /* Minus */ Basic_Flag_Numeric | Basic_Flag_Pointer,
+ /* Add */ Basic_Flag_Numeric | Basic_Flag_Multi_Pointer,
+ /* Minus */ Basic_Flag_Numeric | Basic_Flag_Multi_Pointer,
/* Multiply */ Basic_Flag_Numeric,
/* Divide */ Basic_Flag_Numeric,
/* Modulus */ Basic_Flag_Integer,
enum BasicFlag effective_flags = 0;
switch (type->kind) {
case Type_Kind_Basic: effective_flags = type->Basic.flags; break;
- case Type_Kind_Pointer: // nocheckin REMOVE THIS
- case Type_Kind_MultiPointer: effective_flags = Basic_Flag_Pointer; break;
+ case Type_Kind_Pointer: effective_flags = Basic_Flag_Pointer; break;
+ case Type_Kind_MultiPointer: effective_flags = Basic_Flag_Multi_Pointer; break;
case Type_Kind_Enum: effective_flags = Basic_Flag_Integer; break;
case Type_Kind_Function: effective_flags = Basic_Flag_Equality; break;
}
}
// NOTE: Handle basic pointer math.
- if (type_is_multi_pointer(binop->left->type) || type_is_pointer(binop->left->type)) {
+ if (type_is_multi_pointer(binop->left->type)) {
if (binop->operation != Binary_Op_Add && binop->operation != Binary_Op_Minus) goto bad_binaryop;
- if (type_is_pointer(binop->left->type))
- onyx_report_warning(binop->token->pos, "Doing pointer math on non-multi-pointer!");
-
resolve_expression_type(binop->right);
if (!type_is_integer(binop->right->type)) goto bad_binaryop;
} else {
Type* ptr_type = type_create(Type_Kind_MultiPointer, alloc, 0);
ptr_type->MultiPointer.base.flags |= Basic_Flag_Pointer;
+ ptr_type->MultiPointer.base.flags |= Basic_Flag_Multi_Pointer;
ptr_type->MultiPointer.base.size = POINTER_SIZE;
ptr_type->MultiPointer.elem = to;