summaryrefslogtreecommitdiffstats
path: root/llgo/third_party/gotools/go/ssa/interp/testdata/methprom.go
blob: e8e384c311721aea60c4ebb488260f6f640410cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main

// Tests of method promotion logic.

type A struct{ magic int }

func (a A) x() {
	if a.magic != 1 {
		panic(a.magic)
	}
}
func (a *A) y() *A {
	return a
}

type B struct{ magic int }

func (b B) p() {
	if b.magic != 2 {
		panic(b.magic)
	}
}
func (b *B) q() {
	if b != theC.B {
		panic("oops")
	}
}

type I interface {
	f()
}

type impl struct{ magic int }

func (i impl) f() {
	if i.magic != 3 {
		panic("oops")
	}
}

type C struct {
	A
	*B
	I
}

func assert(cond bool) {
	if !cond {
		panic("failed")
	}
}

var theC = C{
	A: A{1},
	B: &B{2},
	I: impl{3},
}

func addr() *C {
	return &theC
}

func value() C {
	return theC
}

func main() {
	// address
	addr().x()
	if addr().y() != &theC.A {
		panic("oops")
	}
	addr().p()
	addr().q()
	addr().f()

	// addressable value
	var c C = value()
	c.x()
	if c.y() != &c.A {
		panic("oops")
	}
	c.p()
	c.q()
	c.f()

	// non-addressable value
	value().x()
	// value().y() // not in method set
	value().p()
	value().q()
	value().f()
}
OpenPOWER on IntegriCloud