From 787ea1feba6cf7ce562cd5698efc4c6906bf1669 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 11 Sep 2018 11:09:42 +0100 Subject: [PATCH] Fix polymorphic constant parameters for procedures --- src/check_type.cpp | 7 ++++++- src/types.cpp | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 0e073f7fb..33b90288f 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1372,7 +1372,6 @@ Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_params, bool *is if (specialization == t_invalid){ specialization = nullptr; } - // warning(type_expr, "'type' parameters are deprecated, please use a polymorphic identifier with a type of 'typeid'. For example, '$T: typeid'"); if (operands != nullptr) { detemine_type_from_operand = true; @@ -1555,6 +1554,12 @@ Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_params, bool *is p->flags &= ~FieldFlag_auto_cast; } + if (!is_type_constant_type(type) && !is_type_polymorphic(type)) { + gbString str = type_to_string(type); + error(params[i], "A parameter must be a valid constant type, got %s", str); + gb_string_free(str); + } + param = alloc_entity_const_param(scope, name->Ident.token, type, poly_const, is_type_polymorphic(type)); } else { param = alloc_entity_param(scope, name->Ident.token, type, is_using, is_in); diff --git a/src/types.cpp b/src/types.cpp index c4a062421..14b2e449e 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -1396,6 +1396,10 @@ bool are_types_identical(Type *x, Type *y) { if (xe->kind != ye->kind || !are_types_identical(xe->type, ye->type)) { return false; } + if (xe->kind == Entity_Constant && !compare_exact_values(Token_CmpEq, xe->Constant.value, ye->Constant.value)) { + // NOTE(bill): This is needed for polymorphic procedures + return false; + } } return true; }