From 86a75b35deaa465aa45042dbc6b64a470d404b7a Mon Sep 17 00:00:00 2001 From: Lukas Neubert Date: Wed, 20 Dec 2023 20:59:57 +0100 Subject: [PATCH] checker: prevent invalid SelectorExprs --- CHANGELOG.md | 1 + lib/bait/checker/expr.bt | 3 ++- lib/bait/preference/preference.bt | 2 +- tests/out/error/selector/cannot_select.in.bt | 7 +++++++ tests/out/error/selector/cannot_select.out | 1 + 5 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 tests/out/error/selector/cannot_select.in.bt create mode 100644 tests/out/error/selector/cannot_select.out diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ca38c13..67952a8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ _unreleased_ ### Error and Type Checks - If conditions must be of type bool - Cannot assign from a void function call +- Prevent selecting fields of unsupported types (e.g. enums) - Prevent some cases of identifier redefinition - Any identifier by a function name - Function argument by a variable diff --git a/lib/bait/checker/expr.bt b/lib/bait/checker/expr.bt index 86c67d10..6cfb9dfb 100644 --- a/lib/bait/checker/expr.bt +++ b/lib/bait/checker/expr.bt @@ -347,7 +347,8 @@ fun (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type { return ast.VOID_TYPE } - return ast.ANY_TYPE + c.error('cannot select from ${c.table.type_name(node.expr_type)}', node.pos) + return ast.PLACEHOLDER_TYPE } fun (c Checker) string_literal(node ast.StringLiteral) ast.Type { diff --git a/lib/bait/preference/preference.bt b/lib/bait/preference/preference.bt index fb50bf1c..be28ee1d 100644 --- a/lib/bait/preference/preference.bt +++ b/lib/bait/preference/preference.bt @@ -164,7 +164,7 @@ fun backend_from_string(s string) Backend { 'c' { .c } else { panic('Invalid backend: ${s}') - .js + Backend.js // TODO remove once @noreturn works properly } } } diff --git a/tests/out/error/selector/cannot_select.in.bt b/tests/out/error/selector/cannot_select.in.bt new file mode 100644 index 00000000..75a54067 --- /dev/null +++ b/tests/out/error/selector/cannot_select.in.bt @@ -0,0 +1,7 @@ +enum Color { + red + green +} + +c := Color.red +_ := c.my_field diff --git a/tests/out/error/selector/cannot_select.out b/tests/out/error/selector/cannot_select.out new file mode 100644 index 00000000..0548d522 --- /dev/null +++ b/tests/out/error/selector/cannot_select.out @@ -0,0 +1 @@ +tests/out/error/selector/cannot_select.in.bt:7:7 error: cannot select from Color