|  | // 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() | 
|  | } |