mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
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:
@@ -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
|
||||
|
||||
8
tests/generics/taliashijack.nim
Normal file
8
tests/generics/taliashijack.nim
Normal file
@@ -0,0 +1,8 @@
|
||||
# issue #23977
|
||||
|
||||
type Foo[T] = int
|
||||
|
||||
proc foo(T: typedesc) =
|
||||
var a: T
|
||||
|
||||
foo(int)
|
||||
@@ -566,7 +566,7 @@ block:
|
||||
block:
|
||||
static:
|
||||
let x = int 1
|
||||
doAssert $(x.type) == "Foo" # Foo
|
||||
doAssert $(x.type) == "int" # Foo
|
||||
|
||||
block:
|
||||
static:
|
||||
|
||||
Reference in New Issue
Block a user