OXIESEC PANEL
- Current Dir:
/
/
opt
/
golang
/
1.19.4
/
src
/
go
/
types
Server IP: 2a02:4780:11:1084:0:327f:3464:10
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
api.go
17.05 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
api_test.go
81.16 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
array.go
802 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
assignments.go
12.86 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
basic.go
1.48 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
builtins.go
24.28 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
builtins_test.go
9.7 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
call.go
22.29 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
chan.go
909 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
check.go
17.32 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
check_test.go
12.11 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
context.go
4.34 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
context_test.go
2.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
conversions.go
8.28 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
decl.go
28.77 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errorcodes.go
31.51 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errorcodes_test.go
4.95 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errors.go
9.87 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
errors_test.go
1 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
eval.go
3.05 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
eval_test.go
7.4 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
example_test.go
9.03 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
expr.go
51.97 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
exprstring.go
4.81 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
exprstring_test.go
2.36 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
gccgosizes.go
1.02 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
gotype.go
8.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
hilbert_test.go
3.61 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
index.go
11.03 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
infer.go
25.18 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
initorder.go
9.48 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
instantiate.go
9.94 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
instantiate_test.go
6.02 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
interface.go
8.08 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
issues_test.go
17.49 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
labels.go
7.17 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
lookup.go
16.93 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
main_test.go
335 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
map.go
658 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
methodset.go
6.75 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
methodset_test.go
5.75 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
mono.go
9.05 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
mono_test.go
2.63 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
named.go
22.37 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
named_test.go
2.69 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
object.go
17.92 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
object_test.go
5.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
objset.go
927 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
operand.go
10 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
package.go
2.38 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
pointer.go
634 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
predicates.go
14.71 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
resolver.go
24.38 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
resolver_test.go
4.58 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
return.go
4.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
scope.go
9.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
selection.go
3.99 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
self_test.go
2.57 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
signature.go
12.49 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
sizeof_test.go
1.26 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
sizes.go
7.56 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
sizes_test.go
3.33 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
slice.go
576 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
stdlib_test.go
9.45 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
stmt.go
26.17 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
struct.go
6.04 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
subst.go
10.76 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
termlist.go
3.68 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
termlist_test.go
7.18 KB
12/01/2022 06:12:58 PM
rw-r--r--
📁
testdata
-
12/01/2022 06:13:56 PM
rwxr-xr-x
📄
token_test.go
1.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
tuple.go
928 bytes
12/01/2022 06:12:58 PM
rw-r--r--
📄
type.go
2.92 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typelists.go
1.84 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeparam.go
4.74 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeset.go
14.22 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeset_test.go
2.34 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typestring.go
10.64 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typestring_test.go
4.21 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeterm.go
3.52 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typeterm_test.go
5.1 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
typexpr.go
14.64 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
unify.go
18.35 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
union.go
6.22 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
universe.go
7.66 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
validtype.go
7.77 KB
12/01/2022 06:12:58 PM
rw-r--r--
📄
version.go
2.2 KB
12/01/2022 06:12:58 PM
rw-r--r--
Editing: instantiate_test.go
Close
// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package types_test import ( "go/token" . "go/types" "strings" "testing" ) func TestInstantiateEquality(t *testing.T) { emptySignature := NewSignatureType(nil, nil, nil, nil, nil, false) tests := []struct { src string name1 string targs1 []Type name2 string targs2 []Type wantEqual bool }{ { "package basictype; type T[P any] int", "T", []Type{Typ[Int]}, "T", []Type{Typ[Int]}, true, }, { "package differenttypeargs; type T[P any] int", "T", []Type{Typ[Int]}, "T", []Type{Typ[String]}, false, }, { "package typeslice; type T[P any] int", "T", []Type{NewSlice(Typ[Int])}, "T", []Type{NewSlice(Typ[Int])}, true, }, { // interface{interface{...}} is equivalent to interface{...} "package equivalentinterfaces; type T[P any] int", "T", []Type{ NewInterfaceType([]*Func{NewFunc(token.NoPos, nil, "M", emptySignature)}, nil), }, "T", []Type{ NewInterfaceType( nil, []Type{ NewInterfaceType([]*Func{NewFunc(token.NoPos, nil, "M", emptySignature)}, nil), }, ), }, true, }, { // int|string is equivalent to string|int "package equivalenttypesets; type T[P any] int", "T", []Type{ NewInterfaceType(nil, []Type{ NewUnion([]*Term{NewTerm(false, Typ[Int]), NewTerm(false, Typ[String])}), }), }, "T", []Type{ NewInterfaceType(nil, []Type{ NewUnion([]*Term{NewTerm(false, Typ[String]), NewTerm(false, Typ[Int])}), }), }, true, }, { "package basicfunc; func F[P any]() {}", "F", []Type{Typ[Int]}, "F", []Type{Typ[Int]}, true, }, { "package funcslice; func F[P any]() {}", "F", []Type{NewSlice(Typ[Int])}, "F", []Type{NewSlice(Typ[Int])}, true, }, { "package funcwithparams; func F[P any](x string) float64 { return 0 }", "F", []Type{Typ[Int]}, "F", []Type{Typ[Int]}, true, }, { "package differentfuncargs; func F[P any](x string) float64 { return 0 }", "F", []Type{Typ[Int]}, "F", []Type{Typ[String]}, false, }, { "package funcequality; func F1[P any](x int) {}; func F2[Q any](x int) {}", "F1", []Type{Typ[Int]}, "F2", []Type{Typ[Int]}, false, }, { "package funcsymmetry; func F1[P any](x P) {}; func F2[Q any](x Q) {}", "F1", []Type{Typ[Int]}, "F2", []Type{Typ[Int]}, false, }, } for _, test := range tests { pkg, err := pkgForMode(".", test.src, nil, 0) if err != nil { t.Fatal(err) } t.Run(pkg.Name(), func(t *testing.T) { ctxt := NewContext() T1 := pkg.Scope().Lookup(test.name1).Type() res1, err := Instantiate(ctxt, T1, test.targs1, false) if err != nil { t.Fatal(err) } T2 := pkg.Scope().Lookup(test.name2).Type() res2, err := Instantiate(ctxt, T2, test.targs2, false) if err != nil { t.Fatal(err) } if gotEqual := res1 == res2; gotEqual != test.wantEqual { t.Errorf("%s == %s: %t, want %t", res1, res2, gotEqual, test.wantEqual) } }) } } func TestInstantiateNonEquality(t *testing.T) { const src = "package p; type T[P any] int" pkg1, err := pkgForMode(".", src, nil, 0) if err != nil { t.Fatal(err) } pkg2, err := pkgForMode(".", src, nil, 0) if err != nil { t.Fatal(err) } // We consider T1 and T2 to be distinct types, so their instances should not // be deduplicated by the context. T1 := pkg1.Scope().Lookup("T").Type().(*Named) T2 := pkg2.Scope().Lookup("T").Type().(*Named) ctxt := NewContext() res1, err := Instantiate(ctxt, T1, []Type{Typ[Int]}, false) if err != nil { t.Fatal(err) } res2, err := Instantiate(ctxt, T2, []Type{Typ[Int]}, false) if err != nil { t.Fatal(err) } if res1 == res2 { t.Errorf("instance from pkg1 (%s) is pointer-equivalent to instance from pkg2 (%s)", res1, res2) } if Identical(res1, res2) { t.Errorf("instance from pkg1 (%s) is identical to instance from pkg2 (%s)", res1, res2) } } func TestMethodInstantiation(t *testing.T) { const prefix = `package p type T[P any] struct{} var X T[int] ` tests := []struct { decl string want string }{ {"func (r T[P]) m() P", "func (T[int]).m() int"}, {"func (r T[P]) m(P)", "func (T[int]).m(int)"}, {"func (r *T[P]) m(P)", "func (*T[int]).m(int)"}, {"func (r T[P]) m() T[P]", "func (T[int]).m() T[int]"}, {"func (r T[P]) m(T[P])", "func (T[int]).m(T[int])"}, {"func (r T[P]) m(T[P], P, string)", "func (T[int]).m(T[int], int, string)"}, {"func (r T[P]) m(T[P], T[string], T[int])", "func (T[int]).m(T[int], T[string], T[int])"}, } for _, test := range tests { src := prefix + test.decl pkg, err := pkgForMode(".", src, nil, 0) if err != nil { t.Fatal(err) } typ := NewPointer(pkg.Scope().Lookup("X").Type()) obj, _, _ := LookupFieldOrMethod(typ, false, pkg, "m") m, _ := obj.(*Func) if m == nil { t.Fatalf(`LookupFieldOrMethod(%s, "m") = %v, want func m`, typ, obj) } if got := ObjectString(m, RelativeTo(pkg)); got != test.want { t.Errorf("instantiated %q, want %q", got, test.want) } } } func TestImmutableSignatures(t *testing.T) { const src = `package p type T[P any] struct{} func (T[P]) m() {} var _ T[int] ` pkg, err := pkgForMode(".", src, nil, 0) if err != nil { t.Fatal(err) } typ := pkg.Scope().Lookup("T").Type().(*Named) obj, _, _ := LookupFieldOrMethod(typ, false, pkg, "m") if obj == nil { t.Fatalf(`LookupFieldOrMethod(%s, "m") = %v, want func m`, typ, obj) } // Verify that the original method is not mutated by instantiating T (this // bug manifested when subst did not return a new signature). want := "func (T[P]).m()" if got := stripAnnotations(ObjectString(obj, RelativeTo(pkg))); got != want { t.Errorf("instantiated %q, want %q", got, want) } } // Copied from errors.go. func stripAnnotations(s string) string { var b strings.Builder for _, r := range s { // strip #'s and subscript digits if r < '₀' || '₀'+10 <= r { // '₀' == U+2080 b.WriteRune(r) } } if b.Len() < len(s) { return b.String() } return s }