fix subscript in generics, typeof, lent with bracket (#24067)

fixes #15959

Another followup of #22029 and #24005, subscript expressions now
recognize when their parameters are generic types, then generating
tyFromExpr. `typeof` also now properly sets `tfNonConstExpr` to make it
usable in proc signatures. `lent` with brackets like `lent[T]` is also
now allowed.
This commit is contained in:
metagn
2024-09-08 23:49:27 +03:00
committed by GitHub
parent ebcfd96ae1
commit ca28c256f3
3 changed files with 41 additions and 0 deletions

View File

@@ -333,6 +333,26 @@ block: # issue #24044
type MyBuf[I] = ArrayBuf[maxLen(I)]
var v: MyBuf[int]
block: # issue #15959
proc my[T](a: T): typeof(a[0]) = discard
proc my2[T](a: T): array[sizeof(a[0]), T] = discard
proc byLent2[T](a: T): lent type(a[0]) = a[0] # Error: type mismatch: got <T, int literal(0)>
proc byLent3[T](a: T): lent typeof(a[0]) = a[0] # ditto
proc byLent4[T](a: T): lent[type(a[0])] = a[0] # Error: no generic parameters allowed for lent
var x = @[1, 2, 3]
doAssert my(x) is int
doAssert my2(x) is array[sizeof(int), seq[int]]
doAssert byLent2(x) == 1
doAssert byLent2(x) is lent int
doAssert byLent3(x) == 1
doAssert byLent3(x) is lent int
doAssert byLent4(x) == 1
doAssert byLent4(x) is lent int
proc fn[U](a: U): auto = a
proc my3[T](a: T, b: typeof(fn(a))) = discard
my3(x, x)
doAssert not compiles(my3(x, x[0]))
block: # issue #22342, type section version of #22607
type GenAlias[isInt: static bool] = (
when isInt: