make all generic aliases tyAlias (#23978)

fixes #23977

The problem is that for *any* body of a generic declaration,
[semstmts](2e4d344b43/compiler/semstmts.nim (L1610-L1611))
sets the sym of its value to the generic type name, and
[semtypes](2e4d344b43/compiler/semtypes.nim (L2143))
just directly gives the referenced type *specifically* when the
expression is a generic body. I'm blaming `semtypes` here because it's
responsible for the type given but the exact opposite behavior
specifically written in makes me think generating an alias type here
maybe breaks something.
This commit is contained in:
metagn
2024-08-20 12:41:50 +03:00
committed by GitHub
parent a4dff1a03e
commit 58813a3b2e
3 changed files with 11 additions and 2 deletions

View File

@@ -1646,7 +1646,8 @@ proc semGeneric(c: PContext, n: PNode, s: PSym, prev: PType): PType =
recomputeFieldPositions(tx, tx.n, position)
proc maybeAliasType(c: PContext; typeExpr, prev: PType): PType =
if typeExpr.kind in {tyObject, tyEnum, tyDistinct, tyForward, tyGenericBody} and prev != nil:
if prev != nil and (prev.kind == tyGenericBody or
typeExpr.kind in {tyObject, tyEnum, tyDistinct, tyForward, tyGenericBody}):
result = newTypeS(tyAlias, c)
result.rawAddSon typeExpr
result.sym = prev.sym

View File

@@ -0,0 +1,8 @@
# issue #23977
type Foo[T] = int
proc foo(T: typedesc) =
var a: T
foo(int)

View File

@@ -566,7 +566,7 @@ block:
block:
static:
let x = int 1
doAssert $(x.type) == "Foo" # Foo
doAssert $(x.type) == "int" # Foo
block:
static: