aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-05-12 22:38:37 +0100
committergingerBill <bill@gingerbill.org>2021-05-12 22:38:37 +0100
commitd962cfdc6bd1865c7df302d08af237027533437f (patch)
tree12365aa358b2ebd422f2a0fd9499520174a1cec4 /src
parentdfb81431496f68bce56b9a92681a841b072300be (diff)
Fix #713
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp10
-rw-r--r--src/check_type.cpp17
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 ||