Skip to content

Commit

Permalink
fix semcase on tySequence and tyObject #20283 #19682 (#20339)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
bung87 authored Nov 1, 2022
1 parent 6166b79 commit eec1543
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 8 deletions.
3 changes: 3 additions & 0 deletions compiler/semcall.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions compiler/semdata.nim
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ type
efSkipFieldVisibilityCheck
# Use this if undeclared identifiers should not raise an error during
# overload resolution.
efNoDiagnostics

TExprFlags* = set[TExprFlag]

Expand Down
16 changes: 8 additions & 8 deletions compiler/semstmts.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down Expand Up @@ -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]
Expand Down
29 changes: 29 additions & 0 deletions tests/errmsgs/tcase_stmt.nim
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit eec1543

Please sign in to comment.