This commit is contained in:
Andreas Rumpf 2019-08-29 00:35:05 +02:00 • committed by GitHub
commit 5f7a6aff06
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 3 deletions

View file

@ -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]

View file

@ -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

View file

@ -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