1// Copyright 2023 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
5// WARNING: Please avoid updating this file.
6// See the warning in ../devirt.go for more details.
7
8package mult
9
10var sink int
11
12type Multiplier interface {
13	Multiply(a, b int) int
14}
15
16type Mult struct{}
17
18func (Mult) Multiply(a, b int) int {
19	for i := 0; i < 1000; i++ {
20		sink++
21	}
22	return a * b
23}
24
25type NegMult struct{}
26
27func (NegMult) Multiply(a, b int) int {
28	for i := 0; i < 1000; i++ {
29		sink++
30	}
31	return -1 * a * b
32}
33
34// N.B. Different types than AddFunc to test intra-line disambiguation.
35type MultFunc func(int64, int64) int64
36
37func MultFn(a, b int64) int64 {
38	for i := 0; i < 1000; i++ {
39		sink++
40	}
41	return a * b
42}
43
44func NegMultFn(a, b int64) int64 {
45	for i := 0; i < 1000; i++ {
46		sink++
47	}
48	return -1 * a * b
49}
50
51//go:noinline
52func MultClosure() MultFunc {
53	// Explicit closure to differentiate from AddClosure.
54	c := 1
55	return func(a, b int64) int64 {
56		for i := 0; i < 1000; i++ {
57			sink++
58		}
59		return a * b * int64(c)
60	}
61}
62
63//go:noinline
64func NegMultClosure() MultFunc {
65	c := 1
66	return func(a, b int64) int64 {
67		for i := 0; i < 1000; i++ {
68			sink++
69		}
70		return -1 * a * b * int64(c)
71	}
72}
73