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