golang.org/x/tools@v0.21.1-0.20240520172518-788d39e776b1/go/ssa/builder_go120_test.go (about) 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 }