Fix template codegen with static parameters (#8110)

* Fix template codegen with static parameters

Fixes #7477

* Move the test case to tstaticimportcpp
This commit is contained in:
LemonBoy
2018-06-27 22:46:46 +02:00
committed by Andreas Rumpf
parent e66b7f3909
commit cecce80d42
2 changed files with 17 additions and 9 deletions

View File

@@ -734,6 +734,16 @@ proc getTypeDescAux(m: BModule, origTyp: PType, check: var IntSet): Rope =
let cppName = getTypeName(m, t, sig)
var i = 0
var chunkStart = 0
template addResultType(ty: untyped) =
if ty == nil or ty.kind == tyVoid:
result.add(~"void")
elif ty.kind == tyStatic:
internalAssert m.config, ty.n != nil
result.add ty.n.renderTree
else:
result.add getTypeDescAux(m, ty, check)
while i < cppName.data.len:
if cppName.data[i] == '\'':
var chunkEnd = i-1
@@ -743,13 +753,7 @@ proc getTypeDescAux(m: BModule, origTyp: PType, check: var IntSet): Rope =
chunkStart = i
let typeInSlot = resolveStarsInCppType(origTyp, idx + 1, stars)
if typeInSlot == nil or typeInSlot.kind == tyVoid:
result.add(~"void")
elif typeInSlot.kind == tyStatic:
internalAssert m.config, typeInSlot.n != nil
result.add typeInSlot.n.renderTree
else:
result.add getTypeDescAux(m, typeInSlot, check)
addResultType(typeInSlot)
else:
inc i
@@ -759,7 +763,7 @@ proc getTypeDescAux(m: BModule, origTyp: PType, check: var IntSet): Rope =
result = cppName & "<"
for i in 1 .. origTyp.len-2:
if i > 1: result.add(" COMMA ")
result.add(getTypeDescAux(m, origTyp.sons[i], check))
addResultType(origTyp.sons[i])
result.add("> ")
# always call for sideeffects:
assert t.kind != tyTuple

View File

@@ -1,6 +1,6 @@
discard """
targets: "cpp"
output: "[0, 0, 10, 0]\n5\n1.2\n15\ntest\n[0, 0, 20, 0]"
output: "[0, 0, 10, 0]\n5\n1.2\n15\ntest\n[0, 0, 20, 0]\n4"
"""
{.emit: """/*TYPESECTION*/
@@ -26,6 +26,8 @@ type
GenericIntType {.importcpp: "GenericIntType<'0, '1>".} [N: static[int]; T] = object
data: array[N, T]
GenericIntTypeAlt {.importcpp: "GenericIntType".} [N: static[int]; T] = object
GenericTType {.importcpp: "GenericTType<'0>".} [T] = object
field: T
@@ -40,6 +42,7 @@ var
c = GenericTType[float]()
d = SimpleStruct(field: 15)
e = GenericTType[string](field: "test")
f = GenericIntTypeAlt[4, int8]()
a.data[2] = 10
b.field = 5
@@ -57,3 +60,4 @@ proc plus(a, b: GenInt4): GenInt4 =
echo plus(a, a).data
echo sizeof(f)