Source file src/cmd/compile/internal/test/race.go

     1  // Copyright 2022 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build !compiler_bootstrap
     6  
     7  package test
     8  
     9  // The racecompile builder only builds packages, but does not build
    10  // or run tests. This is a non-test file to hold cases that (used
    11  // to) trigger compiler data races, so they will be exercised on
    12  // the racecompile builder.
    13  //
    14  // This package is not imported so functions here are not included
    15  // in the actual compiler.
    16  
    17  // Issue 55357: data race when building multiple instantiations of
    18  // generic closures with _ parameters.
    19  func Issue55357() {
    20  	type U struct {
    21  		A int
    22  		B string
    23  		C string
    24  	}
    25  	var q T55357[U]
    26  	q.Count()
    27  	q.List()
    28  
    29  	type M struct {
    30  		A int64
    31  		B uint32
    32  		C uint32
    33  	}
    34  	var q2 T55357[M]
    35  	q2.Count()
    36  	q2.List()
    37  }
    38  
    39  type T55357[T any] struct{}
    40  
    41  //go:noinline
    42  func (q *T55357[T]) do(w, v bool, fn func(bk []byte, v T) error) error {
    43  	return nil
    44  }
    45  
    46  func (q *T55357[T]) Count() (n int, rerr error) {
    47  	err := q.do(false, false, func(kb []byte, _ T) error {
    48  		n++
    49  		return nil
    50  	})
    51  	return n, err
    52  }
    53  
    54  func (q *T55357[T]) List() (list []T, rerr error) {
    55  	var l []T
    56  	err := q.do(false, true, func(_ []byte, v T) error {
    57  		l = append(l, v)
    58  		return nil
    59  	})
    60  	if err != nil {
    61  		return nil, err
    62  	}
    63  	return l, nil
    64  }
    65  

View as plain text