From c1176c2bcb919118e916a0ef2292ddc0f89f5bf7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 3 Nov 2019 19:49:21 +0000 Subject: [PATCH] Fix typeid comparison bug; Add extra messages for pointer address errors --- examples/demo/demo.odin | 12 +++++++++++- src/check_expr.cpp | 14 +++++++++++++- src/checker.cpp | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 8dc5340c9..168efb434 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1350,7 +1350,17 @@ soa_struct_layout :: proc() { } main :: proc() { - when true { + id: typeid; + id = typeid_of(int); + + if id == bool { + fmt.println("HERE1"); + } + fmt.println("HERE2"); + + + + when false { extra_general_stuff(); union_type(); parametric_polymorphism(); diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 48b430248..1d59f0530 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1645,7 +1645,17 @@ void check_unary_expr(CheckerContext *c, Operand *o, Token op, Ast *node) { if (e != nullptr && (e->flags & EntityFlag_Param) != 0) { error(op, "Cannot take the pointer address of '%s' which is a procedure parameter", str); } else { - error(op, "Cannot take the pointer address of '%s'", str); + switch (o->mode) { + case Addressing_SoaVariable: + error(op, "Cannot take the pointer address of '%s' as it is an indirect index of an SOA struct", str); + break; + case Addressing_Constant: + error(op, "Cannot take the pointer address of '%s' which is a constant", str); + break; + default: + error(op, "Cannot take the pointer address of '%s'", str); + break; + } } } o->mode = Addressing_Invalid; @@ -1731,12 +1741,14 @@ void check_comparison(CheckerContext *c, Operand *x, Operand *y, TokenKind op) { if (x->mode == Addressing_Type && is_type_typeid(y->type)) { add_type_info_type(c, x->type); + add_type_info_type(c, y->type); add_type_and_value(c->info, x->expr, Addressing_Value, y->type, exact_value_typeid(x->type)); x->mode = Addressing_Value; x->type = t_untyped_bool; return; } else if (is_type_typeid(x->type) && y->mode == Addressing_Type) { + add_type_info_type(c, x->type); add_type_info_type(c, y->type); add_type_and_value(c->info, y->expr, Addressing_Value, x->type, exact_value_typeid(y->type)); diff --git a/src/checker.cpp b/src/checker.cpp index 2bd39e800..a260fe48c 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1036,6 +1036,8 @@ void add_type_and_value(CheckerInfo *i, Ast *expr, AddressingMode mode, Type *ty expr->tav.type = type; if (mode == Addressing_Constant || mode == Addressing_Invalid) { expr->tav.value = value; + } else if (mode == Addressing_Value && is_type_typeid(type)) { + expr->tav.value = value; } }