parent
21fc8b4d4d
commit
5f7a6aff06
3 changed files with 23 additions and 3 deletions
|
|
@ -403,7 +403,13 @@ proc semAfterMacroCall(c: PContext, call, macroResult: PNode,
|
||||||
if s.typ.sons[0] == nil:
|
if s.typ.sons[0] == nil:
|
||||||
result = semStmt(c, result, flags)
|
result = semStmt(c, result, flags)
|
||||||
else:
|
else:
|
||||||
case s.typ.sons[0].kind
|
var retType = s.typ.sons[0]
|
||||||
|
if retType.kind == tyTypeDesc and tfUnresolved in retType.flags and
|
||||||
|
retType.len == 1:
|
||||||
|
# bug #11941: template fails(T: type X, v: auto): T
|
||||||
|
# does not mean we expect a tyTypeDesc.
|
||||||
|
retType = retType[0]
|
||||||
|
case retType.kind
|
||||||
of tyUntyped:
|
of tyUntyped:
|
||||||
# Not expecting a type here allows templates like in ``tmodulealias.in``.
|
# Not expecting a type here allows templates like in ``tmodulealias.in``.
|
||||||
result = semExpr(c, result, flags)
|
result = semExpr(c, result, flags)
|
||||||
|
|
@ -421,7 +427,6 @@ proc semAfterMacroCall(c: PContext, call, macroResult: PNode,
|
||||||
result.typ = makeTypeDesc(c, typ)
|
result.typ = makeTypeDesc(c, typ)
|
||||||
#result = symNodeFromType(c, typ, n.info)
|
#result = symNodeFromType(c, typ, n.info)
|
||||||
else:
|
else:
|
||||||
var retType = s.typ.sons[0]
|
|
||||||
if s.ast[genericParamsPos] != nil and retType.isMetaType:
|
if s.ast[genericParamsPos] != nil and retType.isMetaType:
|
||||||
# The return type may depend on the Macro arguments
|
# The return type may depend on the Macro arguments
|
||||||
# e.g. template foo(T: typedesc): seq[T]
|
# e.g. template foo(T: typedesc): seq[T]
|
||||||
|
|
|
||||||
|
|
@ -1799,7 +1799,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType =
|
||||||
of nkStmtListType: result = semStmtListType(c, n, prev)
|
of nkStmtListType: result = semStmtListType(c, n, prev)
|
||||||
of nkBlockType: result = semBlockType(c, n, prev)
|
of nkBlockType: result = semBlockType(c, n, prev)
|
||||||
else:
|
else:
|
||||||
localError(c.config, n.info, errTypeExpected)
|
localError(c.config, n.info, "type expected, but got: " & renderTree(n))
|
||||||
result = newOrPrevType(tyError, prev, c)
|
result = newOrPrevType(tyError, prev, c)
|
||||||
n.typ = result
|
n.typ = result
|
||||||
dec c.inTypeContext
|
dec c.inTypeContext
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ output: '''
|
||||||
a
|
a
|
||||||
hi
|
hi
|
||||||
Hello, World!
|
Hello, World!
|
||||||
|
(e: 42)
|
||||||
'''
|
'''
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -220,3 +221,17 @@ block t5235:
|
||||||
|
|
||||||
outer:
|
outer:
|
||||||
test("Hello, World!")
|
test("Hello, World!")
|
||||||
|
|
||||||
|
|
||||||
|
# bug #11941
|
||||||
|
type X = object
|
||||||
|
e: int
|
||||||
|
|
||||||
|
proc works(T: type X, v: auto): T = T(e: v)
|
||||||
|
template fails(T: type X, v: auto): T = T(e: v)
|
||||||
|
|
||||||
|
var
|
||||||
|
w = X.works(42)
|
||||||
|
x = X.fails(42)
|
||||||
|
|
||||||
|
echo x
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue