1// errorcheck
2
3// Copyright 2020 The Go Authors. All rights reserved.  Use of this
4// source code is governed by a BSD-style license that can be found in
5// the LICENSE file.
6
7package p
8
9type T int
10
11func (T) Mv()  {}
12func (*T) Mp() {}
13
14type P1 struct{ T }
15type P2 struct{ *T }
16type P3 *struct{ T }
17type P4 *struct{ *T }
18
19func _() {
20	{
21		var p P1
22		p.Mv()
23		(&p).Mv()
24		(*&p).Mv()
25		p.Mp()
26		(&p).Mp()
27		(*&p).Mp()
28	}
29	{
30		var p P2
31		p.Mv()
32		(&p).Mv()
33		(*&p).Mv()
34		p.Mp()
35		(&p).Mp()
36		(*&p).Mp()
37	}
38	{
39		var p P3
40		p.Mv()     // ERROR "undefined"
41		(&p).Mv()  // ERROR "undefined"
42		(*&p).Mv() // ERROR "undefined"
43		(**&p).Mv()
44		(*p).Mv()
45		(&*p).Mv()
46		p.Mp()     // ERROR "undefined"
47		(&p).Mp()  // ERROR "undefined"
48		(*&p).Mp() // ERROR "undefined"
49		(**&p).Mp()
50		(*p).Mp()
51		(&*p).Mp()
52	}
53	{
54		var p P4
55		p.Mv()     // ERROR "undefined"
56		(&p).Mv()  // ERROR "undefined"
57		(*&p).Mv() // ERROR "undefined"
58		(**&p).Mv()
59		(*p).Mv()
60		(&*p).Mv()
61		p.Mp()     // ERROR "undefined"
62		(&p).Mp()  // ERROR "undefined"
63		(*&p).Mp() // ERROR "undefined"
64		(**&p).Mp()
65		(*p).Mp()
66		(&*p).Mp()
67	}
68}
69
70func _() {
71	type P5 struct{ T }
72	type P6 struct{ *T }
73	type P7 *struct{ T }
74	type P8 *struct{ *T }
75
76	{
77		var p P5
78		p.Mv()
79		(&p).Mv()
80		(*&p).Mv()
81		p.Mp()
82		(&p).Mp()
83		(*&p).Mp()
84	}
85	{
86		var p P6
87		p.Mv()
88		(&p).Mv()
89		(*&p).Mv()
90		p.Mp()
91		(&p).Mp()
92		(*&p).Mp()
93	}
94	{
95		var p P7
96		p.Mv()     // ERROR "undefined"
97		(&p).Mv()  // ERROR "undefined"
98		(*&p).Mv() // ERROR "undefined"
99		(**&p).Mv()
100		(*p).Mv()
101		(&*p).Mv()
102		p.Mp()     // ERROR "undefined"
103		(&p).Mp()  // ERROR "undefined"
104		(*&p).Mp() // ERROR "undefined"
105		(**&p).Mp()
106		(*p).Mp()
107		(&*p).Mp()
108	}
109	{
110		var p P8
111		p.Mv()     // ERROR "undefined"
112		(&p).Mv()  // ERROR "undefined"
113		(*&p).Mv() // ERROR "undefined"
114		(**&p).Mv()
115		(*p).Mv()
116		(&*p).Mv()
117		p.Mp()     // ERROR "undefined"
118		(&p).Mp()  // ERROR "undefined"
119		(*&p).Mp() // ERROR "undefined"
120		(**&p).Mp()
121		(*p).Mp()
122		(&*p).Mp()
123	}
124}
125