From: Robert Griesemer Date: Fri, 12 Sep 2008 00:11:16 +0000 (-0700) Subject: - 2 bugs with composite literals X-Git-Tag: weekly.2009-11-06~3234 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=24b3995cb655f58745545f05979294b6e029d668;p=gostls13.git - 2 bugs with composite literals R=r OCL=15179 CL=15179 --- diff --git a/test/bugs/bug096.go b/test/bugs/bug096.go new file mode 100644 index 0000000000..f66caa5c01 --- /dev/null +++ b/test/bugs/bug096.go @@ -0,0 +1,25 @@ +// $G $D/$F.go || echo BUG should compile + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +type A []int; + +func main() { + a := &A{0}; + b := &A{0, 1}; +} + +/* +uetli:~/Source/go1/test/bugs gri$ 6g bug096.go && 6l bug096.6 && 6.out +Trace/BPT trap +uetli:~/Source/go1/test/bugs gri$ +*/ + +/* +It appears that the first assignment changes the size of A from open +into a fixed array. +*/ diff --git a/test/bugs/bug097.go b/test/bugs/bug097.go new file mode 100644 index 0000000000..21376837e3 --- /dev/null +++ b/test/bugs/bug097.go @@ -0,0 +1,47 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG wrong result + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +type A []int; + +func main() { + var a [3]*A; + for i := 0; i < 3; i++ { + a[i] = &A{i}; + } + if a[0][0] != 0 { panic(); } + if a[1][0] != 1 { panic(); } + if a[2][0] != 2 { panic(); } +} + +/* +uetli:~/Source/go1/test/bugs gri$ 6g bug097.go && 6l bug097.6 && 6.out + +panic on line 342 PC=0x13c2 +0x13c2?zi + main·main(1, 0, 1606416416, ...) + main·main(0x1, 0x7fff5fbff820, 0x0, ...) +SIGTRAP: trace trap +Faulting address: 0x4558 +pc: 0x4558 + +0x4558?zi + sys·breakpoint(40960, 0, 45128, ...) + sys·breakpoint(0xa000, 0xb048, 0xa000, ...) +0x156a?zi + sys·panicl(342, 0, 0, ...) + sys·panicl(0x156, 0x300000000, 0xb024, ...) +0x13c2?zi + main·main(1, 0, 1606416416, ...) + main·main(0x1, 0x7fff5fbff820, 0x0, ...) +*/ + +/* An array composite literal needs to be created freshly every time. + It is a "construction" of an array after all. If I pass the address + of the array to some function, it may store it globally. Same applies + to struct literals. +*/ diff --git a/test/golden.out b/test/golden.out index ab68f8b054..39273b2257 100644 --- a/test/golden.out +++ b/test/golden.out @@ -156,6 +156,15 @@ panic on line 342 PC=0x139e BUG wrong result Trace/BPT trap ./$A.out +=========== bugs/bug097.go + +panic on line 344 PC=0x13c2 +0x13c2?zi + main·main(1, 0, 1606416392, ...) + main·main(0x1, 0x7fff5fbff808, 0x0, ...) +BUG wrong result +Trace/BPT trap ./$A.out + =========== fixedbugs/bug015.go fixedbugs/bug015.go:7: overflow converting constant to INT64