From 98756bb26bcd1057a498da69f428678ff0bd6286 Mon Sep 17 00:00:00 2001 From: Bung Date: Tue, 1 Nov 2022 17:19:37 +0800 Subject: [PATCH] fix semcase on tySequence and tyObject #20283 #19682 (#20339) * fix semcase on tySequence and tyObject #20283 #19682 * use better arg name * avoiding returns nil use errorNode instead, clean code * use efNoDiagnostics flag * remove tests/errmsgs/t19682.nim * combine 2 test cases to one file (cherry picked from commit eec1543baf10715c7107133aaf6aa1e4932f53fe) --- compiler/semcall.nim | 2 +- compiler/semdata.nim | 1 + compiler/semstmts.nim | 15 +++++++-------- tests/errmsgs/tcase_stmt.nim | 29 +++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 tests/errmsgs/tcase_stmt.nim diff --git a/compiler/semcall.nim b/compiler/semcall.nim index 432be3f942..7b1abec6a8 100644 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -739,4 +739,4 @@ proc searchForBorrowProc(c: PContext, startScope: PScope, fn: PSym): PSym = result = nil elif result.magic in {mArrPut, mArrGet}: # cannot borrow these magics for now - result = nil \ No newline at end of file + result = nil diff --git a/compiler/semdata.nim b/compiler/semdata.nim index 2b50fea13d..36a60dd67b 100644 --- a/compiler/semdata.nim +++ b/compiler/semdata.nim @@ -70,6 +70,7 @@ type efNoUndeclared, efIsDotCall # Use this if undeclared identifiers should not raise an error during # overload resolution. + efNoDiagnostics TExprFlags* = set[TExprFlag] diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 620a607bc8..45f43e3cdf 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -956,7 +956,7 @@ proc handleCaseStmtMacro(c: PContext; n: PNode; flags: TExprFlags): PNode = toResolve.add n[0] var errors: CandidateErrors - var r = resolveOverloads(c, toResolve, toResolve, {skTemplate, skMacro}, {}, + var r = resolveOverloads(c, toResolve, toResolve, {skTemplate, skMacro}, {efNoDiagnostics}, errors, false) if r.state == csMatch: var match = r.calleeSym @@ -969,7 +969,11 @@ proc handleCaseStmtMacro(c: PContext; n: PNode; flags: TExprFlags): PNode = case match.kind of skMacro: result = semMacroExpr(c, toExpand, toExpand, match, flags) of skTemplate: result = semTemplateExpr(c, toExpand, match, flags) - else: result = nil + else: result = errorNode(c, n[0]) + elif r.state == csNoMatch: + result = errorNode(c, n[0]) + if result.kind == nkEmpty: + localError(c.config, n[0].info, errSelectorMustBeOfCertainTypes) # this would be the perfectly consistent solution with 'for loop macros', # but it kinda sucks for pattern matching as the matcher is not attached to # a type then: @@ -1041,12 +1045,7 @@ proc semCase(c: PContext, n: PNode; flags: TExprFlags; expectedType: PType = nil else: popCaseContext(c) closeScope(c) - if caseStmtMacros in c.features: - result = handleCaseStmtMacro(c, n, flags) - if result != nil: - return result - localError(c.config, n[0].info, errSelectorMustBeOfCertainTypes) - return + return handleCaseStmtMacro(c, n, flags) for i in 1..