From 44300ee1ad7b5cb7caee297ccc105267d45d8f5a Mon Sep 17 00:00:00 2001 From: metagn Date: Thu, 26 Sep 2024 22:17:48 +0300 Subject: [PATCH] make default values typed in proc AST same as param sym AST fixes #12942, fixes #19118 --- compiler/semtypes.nim | 2 + tests/errmsgs/tunknown_named_parameter.nim | 4 +- tests/proc/tdefaultvalueprocast.nim | 50 ++++++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 tests/proc/tdefaultvalueprocast.nim diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 450b81dbf1cc2..6fe921e8101e9 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -1404,6 +1404,8 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode, elif typ.kind == tyStatic: def = semConstExpr(c, def) def = fitNode(c, typ, def, def.info) + # keep proc AST updated + a[^1] = def if not hasType and not hasDefault: if isType: localError(c.config, a.info, "':' expected") diff --git a/tests/errmsgs/tunknown_named_parameter.nim b/tests/errmsgs/tunknown_named_parameter.nim index d3dd6cd2d3396..9ec8bc9cd021b 100644 --- a/tests/errmsgs/tunknown_named_parameter.nim +++ b/tests/errmsgs/tunknown_named_parameter.nim @@ -10,8 +10,8 @@ func rsplit(s: string; sep: string; maxsplit: int = -1): seq[string] first type mismatch at position: 2 required type for sep: string but expression '{':'}' is of type: set[char] -func rsplit(s: string; seps: set[char] = Whitespace; maxsplit: int = -1): seq[ - string] +func rsplit(s: string; seps: set[char] = {' ', '\t', '\v', '\r', '\n', '\f'}; + maxsplit: int = -1): seq[string] first type mismatch at position: 3 unknown named parameter: maxsplits diff --git a/tests/proc/tdefaultvalueprocast.nim b/tests/proc/tdefaultvalueprocast.nim new file mode 100644 index 0000000000000..cc5c4df253dd7 --- /dev/null +++ b/tests/proc/tdefaultvalueprocast.nim @@ -0,0 +1,50 @@ +discard """ + nimout: ''' +ProcDef + Sym "foo" + Empty + Empty + FormalParams + Empty + IdentDefs + Sym "x" + Empty + Call + Sym "none" + Sym "Natural" + Empty + Empty + DiscardStmt + Empty +ProcDef + Sym "example" + Empty + Empty + FormalParams + Empty + IdentDefs + Sym "a" + Empty + Sym "thing" + Empty + Empty + DiscardStmt + TupleConstr + Sym "a" + Sym "thing" +''' +""" + +import options, macros + +macro typedTree(n: typed): untyped = + result = n + echo treeRepr n + +# issue #19118 +proc foo(x = none(Natural)) {.typedTree.} = discard + +# issue #12942 +var thing = 2 +proc example(a = thing) {.typedTree.} = + discard (a, thing)