aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp7
-rw-r--r--src/types.cpp4
2 files changed, 10 insertions, 1 deletions
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;
}