aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorFeoramund <161657516+Feoramund@users.noreply.github.com>2024-07-06 15:32:17 -0400
committerFeoramund <161657516+Feoramund@users.noreply.github.com>2024-07-06 15:32:17 -0400
commit77d64a54618fbdca2fd3f1be1f2719ddde3b463f (patch)
treeee34bf99276fa343db6d76f148ccf1246e7b9a3b /src/check_expr.cpp
parent88c9512d5f8b9ead535e1844b2ff07fe8b7cf052 (diff)
Forbid `$T=` parameter from crashing compiler
Fixes #3883
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 20b83c06d..782f60fda 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -7185,6 +7185,8 @@ gb_internal CallArgumentError check_polymorphic_record_type(CheckerContext *c, O
Array<Operand> operands = {};
defer (array_free(&operands));
+ CallArgumentError err = CallArgumentError_None;
+
bool named_fields = false;
{
// NOTE(bill, 2019-10-26): Allow a cycle in the parameters but not in the fields themselves
@@ -7202,6 +7204,11 @@ gb_internal CallArgumentError check_polymorphic_record_type(CheckerContext *c, O
Ast *arg = ce->args[i];
ast_node(fv, FieldValue, arg);
+ if (fv->value == nullptr) {
+ error(fv->eq, "Expected a value");
+ err = CallArgumentError_InvalidFieldValue;
+ continue;
+ }
if (fv->field->kind == Ast_Ident) {
String name = fv->field->Ident.token.string;
isize index = lookup_polymorphic_record_parameter(original_type, name);
@@ -7240,7 +7247,10 @@ gb_internal CallArgumentError check_polymorphic_record_type(CheckerContext *c, O
}
- CallArgumentError err = CallArgumentError_None;
+ if (err != 0) {
+ operand->mode = Addressing_Invalid;
+ return err;
+ }
TypeTuple *tuple = get_record_polymorphic_params(original_type);
isize param_count = tuple->variables.count;