• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2020 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
5package issue38068
6
7// A type with a couple of inlinable, non-pointer-receiver methods
8// that have params and local variables.
9type A struct {
10	s    string
11	next *A
12	prev *A
13}
14
15// Inlinable, value-received method with locals and parms.
16func (a A) double(x string, y int) string {
17	if y == 191 {
18		a.s = ""
19	}
20	q := a.s + "a"
21	r := a.s + "b"
22	return q + r
23}
24
25// Inlinable, value-received method with locals and parms.
26func (a A) triple(x string, y int) string {
27	q := a.s
28	if y == 998877 {
29		a.s = x
30	}
31	r := a.s + a.s
32	return q + r
33}
34
35type methods struct {
36	m1 func(a *A, x string, y int) string
37	m2 func(a *A, x string, y int) string
38}
39
40// Now a function that makes references to the methods via pointers,
41// which should trigger the wrapper generation.
42func P(a *A, ms *methods) {
43	if a != nil {
44		defer func() { println("done") }()
45	}
46	println(ms.m1(a, "a", 2))
47	println(ms.m2(a, "b", 3))
48}
49
50func G(x *A, n int) {
51	if n <= 0 {
52		println(n)
53		return
54	}
55	// Address-taken local of type A, which will insure that the
56	// compiler's writeType() routine will create a method wrapper.
57	var a, b A
58	a.next = x
59	a.prev = &b
60	x = &a
61	G(x, n-2)
62}
63
64var M methods
65
66func F() {
67	M.m1 = (*A).double
68	M.m2 = (*A).triple
69	G(nil, 100)
70}
71