diff options
-rw-r--r-- | compiler/semcall.nim | 3 | ||||
-rw-r--r-- | compiler/semdata.nim | 1 | ||||
-rw-r--r-- | compiler/semstmts.nim | 16 | ||||
-rw-r--r-- | tests/errmsgs/tcase_stmt.nim | 29 |
4 files changed, 41 insertions, 8 deletions
diff --git a/compiler/semcall.nim b/compiler/semcall.nim index ed8699a26..fa5cee69a 100644 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -402,6 +402,9 @@ proc resolveOverloads(c: PContext, n, orig: PNode, if overloadsState == csEmpty and result.state == csEmpty: if efNoUndeclared notin flags: # for tests/pragmas/tcustom_pragma.nim template impl() = + result.state = csNoMatch + if efNoDiagnostics in flags: + return # xxx adapt/use errorUndeclaredIdentifierHint(c, n, f.ident) localError(c.config, n.info, getMsgDiagnostic(c, flags, n, f)) if n[0].kind == nkIdent and n[0].ident.s == ".=" and n[2].kind == nkIdent: diff --git a/compiler/semdata.nim b/compiler/semdata.nim index d1ffab5eb..2442030f5 100644 --- a/compiler/semdata.nim +++ b/compiler/semdata.nim @@ -73,6 +73,7 @@ type efSkipFieldVisibilityCheck # 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 596995adb..bf1fe4050 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1004,7 +1004,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 @@ -1017,7 +1017,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: @@ -1088,12 +1092,8 @@ 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..<n.len: setCaseContextIdx(c, i) var x = n[i] diff --git a/tests/errmsgs/tcase_stmt.nim b/tests/errmsgs/tcase_stmt.nim new file mode 100644 index 000000000..cf63b9c17 --- /dev/null +++ b/tests/errmsgs/tcase_stmt.nim @@ -0,0 +1,29 @@ +discard """ + cmd: "nim check --hints:off $file" + errormsg: "" + nimout: ''' +tcase_stmt.nim(22, 7) Error: selector must be of an ordinal type, float or string +tcase_stmt.nim(28, 6) Error: selector must be of an ordinal type, float or string + + + + + + + +''' +""" + + + +# bug #19682 +type A = object + +case A() +else: + discard + +# bug #20283 + +case @[] +else: discard |