fixes #20699; generate an empty struct for void type (#20790)

* fixes #20699; generate an empty struct for void type

* Add docs and test case.
This commit is contained in:
Aditya Siram 2022-11-09 13:15:06 -06:00 • committed by GitHub
commit 8fcb9380f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 11 deletions

View file

@ -514,7 +514,10 @@ proc genRecordFieldsAux(m: BModule, n: PNode,
let structName = "_" & mangleRecFieldName(m, n[0].sym) & "_" & $i let structName = "_" & mangleRecFieldName(m, n[0].sym) & "_" & $i
var a = newRopeAppender() var a = newRopeAppender()
genRecordFieldsAux(m, k, rectype, check, a, unionPrefix & $structName & ".") genRecordFieldsAux(m, k, rectype, check, a, unionPrefix & $structName & ".")
if a != "": # When 'k' is 'void', 'a' is the empty string and we just generate
# empty struct. This prevents field access errors when generating
# static initializers for the type.
# See issue #20699
if tfPacked notin rectype.flags: if tfPacked notin rectype.flags:
unionBody.add("struct {") unionBody.add("struct {")
else: else:

View file

@ -476,6 +476,20 @@ template main {.dirty.} =
foo2() foo2()
block: # issue #20699
type
Either[A,B] = object
case kind:bool
of false:
b: B
of true:
a: A
O = object of RootRef
proc oToEither(o:O):Either[O,void] =
Either[O,void](kind:true,a: o)
discard oToEither(O())
static: main() static: main()
main() main()