diff options
Diffstat (limited to 'vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go')
-rw-r--r-- | vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go | 160 |
1 files changed, 0 insertions, 160 deletions
diff --git a/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go b/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go deleted file mode 100644 index 1aaa417..0000000 --- a/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go +++ /dev/null @@ -1,160 +0,0 @@ -//+build ignore - -package main - -// This file is the input to TestObjValueLookup in source_test.go, -// which ensures that each occurrence of an ident defining or -// referring to a func, var or const object can be mapped to its -// corresponding SSA Value. -// -// For every reference to a var object, we use annotations in comments -// to denote both the expected SSA Value kind, and whether to expect -// its value (x) or its address (&x). -// -// For const and func objects, the results don't vary by reference and -// are always values not addresses, so no annotations are needed. The -// declaration is enough. - -import "fmt" -import "os" - -type J int - -func (*J) method() {} - -const globalConst = 0 - -var globalVar int // &globalVar::Global - -func globalFunc() {} - -type I interface { - interfaceMethod() -} - -type S struct { - x int // x::nil -} - -func main() { - print(globalVar) // globalVar::UnOp - globalVar = 1 // globalVar::Const - - var v0 int = 1 // v0::Const (simple local value spec) - if v0 > 0 { // v0::Const - v0 = 2 // v0::Const - } - print(v0) // v0::Phi - - // v1 is captured and thus implicitly address-taken. - var v1 int = 1 // v1::Const - v1 = 2 // v1::Const - fmt.Println(v1) // v1::UnOp (load) - f := func(param int) { // f::MakeClosure param::Parameter - if y := 1; y > 0 { // y::Const - print(v1, param) // v1::UnOp (load) param::Parameter - } - param = 2 // param::Const - println(param) // param::Const - } - - f(0) // f::MakeClosure - - var v2 int // v2::Const (implicitly zero-initialized local value spec) - print(v2) // v2::Const - - m := make(map[string]int) // m::MakeMap - - // Local value spec with multi-valued RHS: - var v3, v4 = m[""] // v3::Extract v4::Extract m::MakeMap - print(v3) // v3::Extract - print(v4) // v4::Extract - - v3++ // v3::BinOp (assign with op) - v3 += 2 // v3::BinOp (assign with op) - - v5, v6 := false, "" // v5::Const v6::Const (defining assignment) - print(v5) // v5::Const - print(v6) // v6::Const - - var v7 S // &v7::Alloc - v7.x = 1 // &v7::Alloc &x::FieldAddr - print(v7.x) // &v7::Alloc &x::FieldAddr - - var v8 [1]int // &v8::Alloc - v8[0] = 0 // &v8::Alloc - print(v8[:]) // &v8::Alloc - _ = v8[0] // &v8::Alloc - _ = v8[:][0] // &v8::Alloc - v8ptr := &v8 // v8ptr::Alloc &v8::Alloc - _ = v8ptr[0] // v8ptr::Alloc - _ = *v8ptr // v8ptr::Alloc - - v8a := make([]int, 1) // v8a::Slice - v8a[0] = 0 // v8a::Slice - print(v8a[:]) // v8a::Slice - - v9 := S{} // &v9::Alloc - - v10 := &v9 // v10::Alloc &v9::Alloc - _ = v10 // v10::Alloc - - var v11 *J = nil // v11::Const - v11.method() // v11::Const - - var v12 J // &v12::Alloc - v12.method() // &v12::Alloc (implicitly address-taken) - - // NB, in the following, 'method' resolves to the *types.Func - // of (*J).method, so it doesn't help us locate the specific - // ssa.Values here: a bound-method closure and a promotion - // wrapper. - _ = v11.method // v11::Const - _ = (*struct{ J }).method // J::nil - - // These vars are not optimised away. - if false { - v13 := 0 // v13::Const - println(v13) // v13::Const - } - - switch x := 1; x { // x::Const - case v0: // v0::Phi - } - - for k, v := range m { // k::Extract v::Extract m::MakeMap - _ = k // k::Extract - v++ // v::BinOp - } - - if y := 0; y > 1 { // y::Const y::Const - } - - var i interface{} // i::Const (nil interface) - i = 1 // i::MakeInterface - switch i := i.(type) { // i::MakeInterface i::MakeInterface - case int: - println(i) // i::Extract - } - - ch := make(chan int) // ch::MakeChan - select { - case x := <-ch: // x::UnOp (receive) ch::MakeChan - _ = x // x::UnOp - } - - // .Op is an inter-package FieldVal-selection. - var err os.PathError // &err::Alloc - _ = err.Op // &err::Alloc &Op::FieldAddr - _ = &err.Op // &err::Alloc &Op::FieldAddr - - // Exercise corner-cases of lvalues vs rvalues. - // (Guessing IsAddr from the 'pointerness' won't cut it here.) - type N *N - var n N // n::Const - n1 := n // n1::Const n::Const - n2 := &n1 // n2::Alloc &n1::Alloc - n3 := *n2 // n3::UnOp n2::Alloc - n4 := **n3 // n4::UnOp n3::UnOp - _ = n4 // n4::UnOp -} |