github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/types/testdata/fixedbugs/issue50426.go (about)

     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  package p
     6  
     7  type A1 [2]uint64
     8  type A2 [2]uint64
     9  
    10  func (a A1) m() A1 { return a }
    11  func (a A2) m() A2 { return a }
    12  
    13  func f[B any, T interface {
    14  	A1 | A2
    15  	m() T
    16  }](v T) {
    17  }
    18  
    19  func _() {
    20  	var v A2
    21  	// Use function type inference to infer type A2 for T.
    22  	// Don't use constraint type inference before function
    23  	// type inference for typed arguments, otherwise it would
    24  	// infer type [2]uint64 for T which doesn't have method m
    25  	// (was the bug).
    26  	f[int](v)
    27  }
    28  
    29  // Keep using constraint type inference before function type
    30  // inference for untyped arguments so we infer type float64
    31  // for E below, and not int (which would not work).
    32  func g[S ~[]E, E any](S, E) {}
    33  
    34  func _() {
    35  	var s []float64
    36  	g[[]float64](s, 0)
    37  }
    38  
    39  // Keep using constraint type inference after function
    40  // type inference for untyped arguments so we infer
    41  // missing type arguments for which we only have the
    42  // untyped arguments as starting point.
    43  func h[E any, R []E](v E) R { return R{v} }
    44  func _() []int              { return h(0) }