From d962cfdc6bd1865c7df302d08af237027533437f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 12 May 2021 22:38:37 +0100 Subject: [PATCH] Fix #713 --- src/check_expr.cpp | 10 ++++++++-- src/check_type.cpp | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index a64acf744..26c7983de 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -5572,9 +5572,15 @@ ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *call, Ast *pr } check_expr(c, operand, arg); if (operand->mode != Addressing_Invalid) { - check_cast(c, operand, t); + if (is_type_polymorphic(t)) { + error(call, "A polymorphic type cannot be used in a type conversion"); + } else { + // NOTE(bill): Otherwise the compiler can override the polymorphic type + // as it assumes it is determining the type + check_cast(c, operand, t); + } } - + operand->type = t; break; } } diff --git a/src/check_type.cpp b/src/check_type.cpp index b90732e00..89f5ca34c 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1271,7 +1271,13 @@ ParameterValue handle_parameter_value(CheckerContext *ctx, Type *in_type, Type * check_assignment(ctx, &o, in_type, str_lit("parameter value")); } - if (out_type_) *out_type_ = default_type(o.type); + if (out_type_) { + if (in_type != nullptr) { + *out_type_ = in_type; + } else { + *out_type_ = default_type(o.type); + } + } return param_value; } @@ -1389,6 +1395,9 @@ Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_params, bool *is } } } + + + if (type == nullptr) { error(param, "Invalid parameter type"); type = t_invalid; @@ -1408,6 +1417,12 @@ Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_params, bool *is type = t_invalid; } + if (param_value.kind != ParameterValue_Invalid && is_type_polymorphic(type)) { + gbString str = type_to_string(type); + error(params[i], "A default value for a parameter must not be a polymorphic constant type, got %s", str); + gb_string_free(str); + } + if (p->flags&FieldFlag_c_vararg) { if (p->type == nullptr ||