diff --git a/compiler/parampatterns.nim b/compiler/parampatterns.nim
index bbaf7a069..db79e3eb9 100644
--- a/compiler/parampatterns.nim
+++ b/compiler/parampatterns.nim
@@ -115,20 +115,19 @@ proc compileConstraints(p: PNode, result: var TPatternCode; conf: ConfigRef) =
else:
patternError(p, conf)
-proc semNodeKindConstraints*(p: PNode; conf: ConfigRef): PNode =
+proc semNodeKindConstraints*(n: PNode; conf: ConfigRef; start: Natural): PNode =
## does semantic checking for a node kind pattern and compiles it into an
## efficient internal format.
- assert p.kind == nkCurlyExpr
- result = newNodeI(nkStrLit, p.info)
+ result = newNodeI(nkStrLit, n.info)
result.strVal = newStringOfCap(10)
result.strVal.add(chr(aqNone.ord))
- if p.len >= 2:
- for i in 1..
= 2:
+ for i in start.. MaxStackSize-1:
- internalError(conf, p.info, "parameter pattern too complex")
+ internalError(conf, n.info, "parameter pattern too complex")
else:
- patternError(p, conf)
+ patternError(n, conf)
result.strVal.add(ppEof)
type
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index f4936a71a..7056eab5f 100644
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -1028,7 +1028,12 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode,
proc semParamType(c: PContext, n: PNode, constraint: var PNode): PType =
if n.kind == nkCurlyExpr:
result = semTypeNode(c, n.sons[0], nil)
- constraint = semNodeKindConstraints(n, c.config)
+ constraint = semNodeKindConstraints(n, c.config, 1)
+ elif n.kind == nkCall and
+ n[0].kind in {nkIdent, nkSym, nkOpenSymChoice, nkClosedSymChoice} and
+ considerQuotedIdent(c, n[0]).s == "{}":
+ result = semTypeNode(c, n[1], nil)
+ constraint = semNodeKindConstraints(n, c.config, 2)
else:
result = semTypeNode(c, n, nil)
diff --git a/tests/trmacros/trmacros_various2.nim b/tests/trmacros/trmacros_various2.nim
index d500c49de..c1367cb1b 100644
--- a/tests/trmacros/trmacros_various2.nim
+++ b/tests/trmacros/trmacros_various2.nim
@@ -77,3 +77,13 @@ block tstar:
# check that it's been optimized properly:
doAssert calls == 1
+
+# bug #7524
+template in_to_out(typIn, typOut: typedesc) =
+ proc to_out(x: typIn{lit}): typOut = result = ord(x)
+
+# Generating the proc via template doesn't work
+in_to_out(char, int)
+
+# This works
+proc to_out2(x: char{lit}): int = result = ord(x)