aboutsummaryrefslogtreecommitdiff
path: root/src/check_stmt.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-12-15 22:28:40 +0000
committergingerBill <bill@gingerbill.org>2020-12-15 22:28:40 +0000
commit6c2b93d5193f827c86c0cdd5938ceb91a6804397 (patch)
tree47501bc3b145878d52cabc32653e56656fa6d4c4 /src/check_stmt.cpp
parent2957da538d959fe5adf3c69a2cb7a28906a577b4 (diff)
Improve text/scanner whitespace parameter to use a bit_set instead; Improve error message for `for x in y` where y is not iterable but allows `in` as an operator
Diffstat (limited to 'src/check_stmt.cpp')
-rw-r--r--src/check_stmt.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp
index 8a41dd12b..117872848 100644
--- a/src/check_stmt.cpp
+++ b/src/check_stmt.cpp
@@ -1803,9 +1803,19 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) {
if (val0 == nullptr) {
gbString s = expr_to_string(operand.expr);
gbString t = type_to_string(operand.type);
+ defer (gb_string_free(s));
+ defer (gb_string_free(t));
+
error(operand.expr, "Cannot iterate over '%s' of type '%s'", s, t);
- gb_string_free(t);
- gb_string_free(s);
+
+ if (rs->val0 != nullptr && rs->val1 == nullptr) {
+ if (is_type_map(operand.type) || is_type_bit_set(operand.type)) {
+ gbString v = expr_to_string(rs->val0);
+ defer (gb_string_free(v));
+ error_line("\tSuggestion: place parentheses around the expression\n");
+ error_line("\t for (%s in %s) {\n", v, s);
+ }
+ }
}
}