From d59fced21b0c94a4a41f0213f62120dbe0f9b710 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 13 May 2020 23:33:03 +0100 Subject: [PATCH] #591 Improve type switch statement error for `fallthrough` --- src/check_stmt.cpp | 8 ++++++-- src/checker.hpp | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 3e84db279..92155cc5e 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1025,7 +1025,7 @@ void check_type_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { ast_node(ss, TypeSwitchStmt, node); Operand x = {}; - mod_flags |= Stmt_BreakAllowed; + mod_flags |= Stmt_BreakAllowed | Stmt_TypeSwitch; check_open_scope(ctx, node); defer (check_close_scope(ctx)); @@ -1791,7 +1791,11 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) { break; case Token_fallthrough: if ((flags & Stmt_FallthroughAllowed) == 0) { - error(token, "'fallthrough' statement in illegal position, expected at the end of a 'case' block"); + if ((flags & Stmt_TypeSwitch) != 0) { + error(token, "'fallthrough' statement not allowed within a type switch statement"); + } else { + error(token, "'fallthrough' statement in illegal position, expected at the end of a 'case' block"); + } } else if (bs->label != nullptr) { error(token, "'fallthrough' cannot have a label"); } diff --git a/src/checker.hpp b/src/checker.hpp index a8ecddbd3..1f03a95d1 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -43,6 +43,8 @@ enum StmtFlag { Stmt_ContinueAllowed = 1<<1, Stmt_FallthroughAllowed = 1<<2, + Stmt_TypeSwitch = 1<<4, + Stmt_CheckScopeDecls = 1<<5, };