From 498dfcceeb72147d23539da3a6fdea240eebd509 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 23 Mar 2023 11:28:49 -0500 Subject: [PATCH] removed: non-multi-pointer math --- compiler/include/types.h | 3 ++- compiler/src/checker.c | 13 +++++-------- compiler/src/types.c | 1 + 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/compiler/include/types.h b/compiler/include/types.h index dfde3023..7581780c 100644 --- a/compiler/include/types.h +++ b/compiler/include/types.h @@ -45,13 +45,14 @@ enum BasicFlag { 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, diff --git a/compiler/src/checker.c b/compiler/src/checker.c index fea13d0b..01b56267 100644 --- a/compiler/src/checker.c +++ b/compiler/src/checker.c @@ -1027,8 +1027,8 @@ CheckStatus check_binaryop_assignment(AstBinaryOp** pbinop) { 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, @@ -1072,8 +1072,8 @@ static b32 binary_op_is_allowed(BinaryOp operation, Type* type) { 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; } @@ -1291,12 +1291,9 @@ CheckStatus check_binaryop(AstBinaryOp** pbinop) { } // 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; diff --git a/compiler/src/types.c b/compiler/src/types.c index 7dd126a6..ba0c25ef 100644 --- a/compiler/src/types.c +++ b/compiler/src/types.c @@ -871,6 +871,7 @@ Type* type_make_multi_pointer(bh_allocator alloc, Type* to) { } 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; -- 2.25.1