fix #10339 by returning type attached to nkEmpty (#10370)

* fix #10339 by checking for nkObjConstr

* revert check for nkObjConstr, return type from nkEmpty node

The correct type needed in `semObjConstr` to fix #10339 is indeed
available, but attached to an `nkEmpty` node. These were previously
discarded in `semTypeNode`, which is used to extract the type for the
object.

* simplify return of PType from  `nkEmpty`

* also fixes #9866, add test case
This commit is contained in:
Vindaar
2019-01-23 11:17:32 +01:00
committed by Andreas Rumpf
parent efa4b9adaa
commit d9ee377517
3 changed files with 33 additions and 1 deletions

View File

@@ -1474,7 +1474,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType =
if c.config.cmd == cmdIdeTools: suggestExpr(c, n)
case n.kind
of nkEmpty: discard
of nkEmpty: result = n.typ
of nkTypeOfExpr:
# for ``type(countup(1,3))``, see ``tests/ttoseq``.
checkSonsLen(n, 1, c.config)

View File

@@ -4,6 +4,7 @@ output: '''
Hallo Welt
Hallo Welt
1
()
'''
"""
@@ -34,3 +35,17 @@ macro t(): untyped =
t()
echo tp()
# https://github.com/nim-lang/Nim/issues/9866
type
# Foo = int # works
Foo = object # fails
macro dispatchGen(): untyped =
var shOpt: Foo
result = quote do:
let baz = `shOpt`
echo `shOpt`
dispatchGen()

View File

@@ -137,3 +137,20 @@ block:
type
Coord[N: static[int]] = tuple[col, row: range[0'i8 .. (N.int8-1)]]
Point[N: static[int]] = range[0'i16 .. N.int16 * N.int16 - 1]
# https://github.com/nim-lang/Nim/issues/10339
block:
type
MicroKernel = object
a: float
b: int
macro extractA(ukernel: static MicroKernel): untyped =
result = newLit ukernel.a
proc tFunc[ukernel: static MicroKernel]() =
const x = ukernel.extractA
doAssert x == 5.5
const uk = MicroKernel(a: 5.5, b: 1)
tFunc[uk]()