diff options
author | Zahary Karadjov <zahary@gmail.com> | 2018-04-22 18:11:22 +0300 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2018-06-16 16:46:32 +0300 |
commit | ab9969ed3be2d57fdeda170cc9960be7ba628149 (patch) | |
tree | 9b36a31c68842e4c2ca835aec1085aa3adfafebc | |
parent | 509d6e923284f1f02c5dbc64e43aee9df1a012d3 (diff) | |
download | Nim-ab9969ed3be2d57fdeda170cc9960be7ba628149.tar.gz |
Bugfix: the size of an array may be a static tuple element
-rw-r--r-- | compiler/semtypes.nim | 3 | ||||
-rw-r--r-- | tests/statictypes/tstatictypes.nim | 40 |
2 files changed, 35 insertions, 8 deletions
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 19bb53209..6b27c8032 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -301,7 +301,8 @@ proc semArrayIndex(c: PContext, n: PNode): PType = localError(c.config, info, errOrdinalTypeExpected) result = makeRangeWithStaticExpr(c, e) if c.inGenericContext > 0: result.flags.incl tfUnresolved - elif e.kind in nkCallKinds and hasGenericArguments(e): + elif e.kind in (nkCallKinds + {nkBracketExpr}) and + hasGenericArguments(e): if not isOrdinalType(e.typ): localError(c.config, n[1].info, errOrdinalTypeExpected) # This is an int returning call, depending on an diff --git a/tests/statictypes/tstatictypes.nim b/tests/statictypes/tstatictypes.nim index a646b61f7..5234866fa 100644 --- a/tests/statictypes/tstatictypes.nim +++ b/tests/statictypes/tstatictypes.nim @@ -5,13 +5,39 @@ staticAlialProc instantiated with 6 ''' """ -type - StaticTypeAlias = static[int] +import macros -proc staticAliasProc(s: StaticTypeAlias) = - static: echo "staticAlialProc instantiated with ", s + 1 +proc plus(a, b: int): int = a + b -staticAliasProc 1+2 -staticAliasProc 3 -staticAliasProc 5 +when true: + type + StaticTypeAlias = static[int] + + proc staticAliasProc(s: StaticTypeAlias) = + static: echo "staticAlialProc instantiated with ", s + 1 + echo s + + staticAliasProc 1+2 + staticAliasProc 3 + staticAliasProc 5 + +when true: + type + ArrayWrapper1[S: static int] = object + data: array[S + 1, int] + + ArrayWrapper2[S: static[int]] = object + data: array[S.plus(2), int] + + ArrayWrapper3[S: static[(int, string)]] = object + data: array[S[0], int] + + var aw1: ArrayWrapper1[5] + var aw2: ArrayWrapper2[5] + var aw3: ArrayWrapper3[(10, "str")] + + static: + assert aw1.data.high == 5 + assert aw2.data.high == 6 + assert aw3.data.high == 9 |