...

Source file src/golang.org/x/tools/go/ssa/builder_go120_test.go

Documentation: golang.org/x/tools/go/ssa

     1  // Copyright 2021 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 go1.20
     6  // +build go1.20
     7  
     8  package ssa_test
     9  
    10  import (
    11  	"go/ast"
    12  	"go/parser"
    13  	"go/token"
    14  	"go/types"
    15  	"testing"
    16  
    17  	"golang.org/x/tools/go/ssa"
    18  	"golang.org/x/tools/go/ssa/ssautil"
    19  )
    20  
    21  func TestBuildPackageGo120(t *testing.T) {
    22  	tests := []struct {
    23  		name     string
    24  		src      string
    25  		importer types.Importer
    26  	}{
    27  		{"slice to array", "package p; var s []byte; var _ = ([4]byte)(s)", nil},
    28  		{"slice to zero length array", "package p; var s []byte; var _ = ([0]byte)(s)", nil},
    29  		{"slice to zero length array type parameter", "package p; var s []byte; func f[T ~[0]byte]() { tmp := (T)(s); var z T; _ = tmp == z}", nil},
    30  		{"slice to non-zero length array type parameter", "package p; var s []byte; func h[T ~[1]byte | [4]byte]() { tmp := T(s); var z T; _ = tmp == z}", nil},
    31  		{"slice to maybe-zero length array type parameter", "package p; var s []byte; func g[T ~[0]byte | [4]byte]() { tmp := T(s); var z T; _ = tmp == z}", nil},
    32  		{
    33  			"rune sequence to sequence cast patterns", `
    34  			package p
    35  			// Each of fXX functions describes a 1.20 legal cast between sequences of runes
    36  			// as []rune, pointers to rune arrays, rune arrays, or strings.
    37  			//
    38  			// Comments listed given the current emitted instructions [approximately].
    39  			// If multiple conversions are needed, these are separated by |.
    40  			// rune was selected as it leads to string casts (byte is similar).
    41  			// The length 2 is not significant.
    42  			// Multiple array lengths may occur in a cast in practice (including 0).
    43  			func f00[S string, D string](s S)                               { _ = D(s) } // ChangeType
    44  			func f01[S string, D []rune](s S)                               { _ = D(s) } // Convert
    45  			func f02[S string, D []rune | string](s S)                      { _ = D(s) } // ChangeType | Convert
    46  			func f03[S [2]rune, D [2]rune](s S)                             { _ = D(s) } // ChangeType
    47  			func f04[S *[2]rune, D *[2]rune](s S)                           { _ = D(s) } // ChangeType
    48  			func f05[S []rune, D string](s S)                               { _ = D(s) } // Convert
    49  			func f06[S []rune, D [2]rune](s S)                              { _ = D(s) } // SliceToArrayPointer; Deref
    50  			func f07[S []rune, D [2]rune | string](s S)                     { _ = D(s) } // SliceToArrayPointer; Deref | Convert
    51  			func f08[S []rune, D *[2]rune](s S)                             { _ = D(s) } // SliceToArrayPointer
    52  			func f09[S []rune, D *[2]rune | string](s S)                    { _ = D(s) } // SliceToArrayPointer; Deref | Convert
    53  			func f10[S []rune, D *[2]rune | [2]rune](s S)                   { _ = D(s) } // SliceToArrayPointer | SliceToArrayPointer; Deref
    54  			func f11[S []rune, D *[2]rune | [2]rune | string](s S)          { _ = D(s) } // SliceToArrayPointer | SliceToArrayPointer; Deref | Convert
    55  			func f12[S []rune, D []rune](s S)                               { _ = D(s) } // ChangeType
    56  			func f13[S []rune, D []rune | string](s S)                      { _ = D(s) } // Convert | ChangeType
    57  			func f14[S []rune, D []rune | [2]rune](s S)                     { _ = D(s) } // ChangeType | SliceToArrayPointer; Deref
    58  			func f15[S []rune, D []rune | [2]rune | string](s S)            { _ = D(s) } // ChangeType | SliceToArrayPointer; Deref | Convert
    59  			func f16[S []rune, D []rune | *[2]rune](s S)                    { _ = D(s) } // ChangeType | SliceToArrayPointer
    60  			func f17[S []rune, D []rune | *[2]rune | string](s S)           { _ = D(s) } // ChangeType | SliceToArrayPointer | Convert
    61  			func f18[S []rune, D []rune | *[2]rune | [2]rune](s S)          { _ = D(s) } // ChangeType | SliceToArrayPointer | SliceToArrayPointer; Deref
    62  			func f19[S []rune, D []rune | *[2]rune | [2]rune | string](s S) { _ = D(s) } // ChangeType | SliceToArrayPointer | SliceToArrayPointer; Deref | Convert
    63  			func f20[S []rune | string, D string](s S)                      { _ = D(s) } // Convert | ChangeType
    64  			func f21[S []rune | string, D []rune](s S)                      { _ = D(s) } // Convert | ChangeType
    65  			func f22[S []rune | string, D []rune | string](s S)             { _ = D(s) } // ChangeType | Convert | Convert | ChangeType
    66  			func f23[S []rune | [2]rune, D [2]rune](s S)                    { _ = D(s) } // SliceToArrayPointer; Deref | ChangeType
    67  			func f24[S []rune | *[2]rune, D *[2]rune](s S)                  { _ = D(s) } // SliceToArrayPointer | ChangeType
    68  			`, nil,
    69  		},
    70  		{
    71  			"matching named and underlying types", `
    72  			package p
    73  			type a string
    74  			type b string
    75  			func g0[S []rune | a | b, D []rune | a | b](s S)      { _ = D(s) }
    76  			func g1[S []rune | ~string, D []rune | a | b](s S)    { _ = D(s) }
    77  			func g2[S []rune | a | b, D []rune | ~string](s S)    { _ = D(s) }
    78  			func g3[S []rune | ~string, D []rune |~string](s S)   { _ = D(s) }
    79  			`, nil,
    80  		},
    81  	}
    82  
    83  	for _, tc := range tests {
    84  		tc := tc
    85  		t.Run(tc.name, func(t *testing.T) {
    86  			t.Parallel()
    87  			fset := token.NewFileSet()
    88  			f, err := parser.ParseFile(fset, "p.go", tc.src, 0)
    89  			if err != nil {
    90  				t.Error(err)
    91  			}
    92  			files := []*ast.File{f}
    93  
    94  			pkg := types.NewPackage("p", "")
    95  			conf := &types.Config{Importer: tc.importer}
    96  			_, _, err = ssautil.BuildPackage(conf, fset, pkg, files, ssa.SanityCheckFunctions)
    97  			if err != nil {
    98  				t.Errorf("unexpected error: %v", err)
    99  			}
   100  		})
   101  	}
   102  }
   103  

View as plain text