diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2024-07-06 22:08:05 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-06 22:08:05 +0200 |
| commit | 861ad2037ffffb22f20a6de328139b7c4817c639 (patch) | |
| tree | ee34bf99276fa343db6d76f148ccf1246e7b9a3b /src/check_expr.cpp | |
| parent | 88c9512d5f8b9ead535e1844b2ff07fe8b7cf052 (diff) | |
| parent | 77d64a54618fbdca2fd3f1be1f2719ddde3b463f (diff) | |
Merge pull request #3884 from Feoramund/fix-3883
Forbid `$T=` parameter from crashing compiler
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 12 |
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; |