]> Cypherpunks repositories - gostls13.git/commitdiff
test: add bug that failed when run with gccgo
authorIan Lance Taylor <iant@golang.org>
Wed, 17 Mar 2021 04:24:09 +0000 (21:24 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 17 Mar 2021 19:15:18 +0000 (19:15 +0000)
Change-Id: Ie52d70d2ae8a21acacf0745a4093650b03ac43f9
Reviewed-on: https://go-review.googlesource.com/c/go/+/302371
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
test/fixedbugs/bug512.go [new file with mode: 0644]

diff --git a/test/fixedbugs/bug512.go b/test/fixedbugs/bug512.go
new file mode 100644 (file)
index 0000000..6be6eb9
--- /dev/null
@@ -0,0 +1,52 @@
+// run
+
+// Copyright 2021 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.
+
+// Gccgo did not make a copy of a value receiver when using a
+// goroutine to call a method.
+
+package main
+
+import (
+       "sync"
+       "sync/atomic"
+)
+
+var wg sync.WaitGroup
+
+type S struct {
+       i1, i2 int32
+}
+
+var done int32
+
+func (s S) Check(v1, v2 int32) {
+       for {
+               if g1 := atomic.LoadInt32(&s.i1); v1 != g1 {
+                       panic(g1)
+               }
+               if g2 := atomic.LoadInt32(&s.i2); v2 != g2 {
+                       panic(g2)
+               }
+               if atomic.LoadInt32(&done) != 0 {
+                       break
+               }
+       }
+       wg.Done()
+}
+
+func F() {
+       s := S{1, 2}
+       go s.Check(1, 2)
+       atomic.StoreInt32(&s.i1, 3)
+       atomic.StoreInt32(&s.i2, 4)
+       atomic.StoreInt32(&done, 1)
+}
+
+func main() {
+       wg.Add(1)
+       F()
+       wg.Wait()
+}