From 786720013595148a1e9a94fc718d8f8dc184f3ef Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 17 Apr 2026 19:09:38 +0800 Subject: [PATCH] normalizeTypedescMacroResult --- compiler/sem.nim | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/compiler/sem.nim b/compiler/sem.nim index 9c1a541f28..553dc2454d 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -454,6 +454,25 @@ proc resetSemFlag(n: PNode) = for i in 0.. 0 and result[^1].kind == nkWhenStmt: + result[^1] = semWhen(c, result[^1], false) + if result[^1].kind == nkStmtList: + result[^1].transitionSonsKind(nkStmtListType) + else: + break + proc semAfterMacroCall(c: PContext, call, macroResult: PNode, s: PSym, flags: TExprFlags; expectedType: PType = nil): PNode = ## Semantically check the output of a macro. @@ -484,19 +503,14 @@ proc semAfterMacroCall(c: PContext, call, macroResult: PNode, # More restrictive version. result = semExprWithType(c, result, flags, expectedType) of tyTypeDesc: - if result.kind == nkStmtList: result.transitionSonsKind(nkStmtListType) + result = normalizeTypedescMacroResult(c, result) var typ = semTypeNode(c, result, nil) if typ == nil: localError(c.config, result.info, "expression has no type: " & renderTree(result, {renderNoComments})) result = newSymNode(errorSym(c, result)) else: - # Replace with a clean nkType node so that complex expressions - # (like `when` statements from template expansion) don't persist - # in the AST with potentially uninitialized children that would - # cause a SIGSEGV during the transform phase's constant folding. - result = newNodeIT(nkType, result.info, makeTypeDesc(c, typ)) - #result = symNodeFromType(c, typ, n.info) + result.typ = makeTypeDesc(c, typ) else: if s.ast[genericParamsPos] != nil and retType.isMetaType: # The return type may depend on the Macro arguments