github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/ssa/builder_go117_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.17 6 // +build go1.17 7 8 package ssa_test 9 10 import ( 11 "go/ast" 12 "go/importer" 13 "go/parser" 14 "go/token" 15 "go/types" 16 "testing" 17 18 "github.com/powerman/golang-tools/go/ssa" 19 "github.com/powerman/golang-tools/go/ssa/ssautil" 20 ) 21 22 func TestBuildPackageGo117(t *testing.T) { 23 tests := []struct { 24 name string 25 src string 26 importer types.Importer 27 }{ 28 {"slice to array pointer", "package p; var s []byte; var _ = (*[4]byte)(s)", nil}, 29 {"unsafe slice", `package p; import "unsafe"; var _ = unsafe.Add(nil, 0)`, importer.Default()}, 30 {"unsafe add", `package p; import "unsafe"; var _ = unsafe.Slice((*int)(nil), 0)`, importer.Default()}, 31 } 32 33 for _, tc := range tests { 34 tc := tc 35 t.Run(tc.name, func(t *testing.T) { 36 t.Parallel() 37 fset := token.NewFileSet() 38 f, err := parser.ParseFile(fset, "p.go", tc.src, parser.ParseComments) 39 if err != nil { 40 t.Error(err) 41 } 42 files := []*ast.File{f} 43 44 pkg := types.NewPackage("p", "") 45 conf := &types.Config{Importer: tc.importer} 46 if _, _, err := ssautil.BuildPackage(conf, fset, pkg, files, ssa.SanityCheckFunctions); err != nil { 47 t.Errorf("unexpected error: %v", err) 48 } 49 }) 50 } 51 } 52 53 func TestBuildPackageFailuresGo117(t *testing.T) { 54 tests := []struct { 55 name string 56 src string 57 importer types.Importer 58 }{ 59 {"slice to array pointer - source is not a slice", "package p; var s [4]byte; var _ = (*[4]byte)(s)", nil}, 60 {"slice to array pointer - dest is not a pointer", "package p; var s []byte; var _ = ([4]byte)(s)", nil}, 61 {"slice to array pointer - dest pointer elem is not an array", "package p; var s []byte; var _ = (*byte)(s)", nil}, 62 } 63 64 for _, tc := range tests { 65 tc := tc 66 t.Run(tc.name, func(t *testing.T) { 67 t.Parallel() 68 fset := token.NewFileSet() 69 f, err := parser.ParseFile(fset, "p.go", tc.src, parser.ParseComments) 70 if err != nil { 71 t.Error(err) 72 } 73 files := []*ast.File{f} 74 75 pkg := types.NewPackage("p", "") 76 conf := &types.Config{Importer: tc.importer} 77 if _, _, err := ssautil.BuildPackage(conf, fset, pkg, files, ssa.SanityCheckFunctions); err == nil { 78 t.Error("want error, but got nil") 79 } 80 }) 81 } 82 }