// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // DO NOT EDIT (use 'go test -v -update-expected' instead.) // See cmd/compile/internal/inline/inlheur/testdata/props/README.txt // for more information on the format of this file. // package returns2 // returns2.go T_return_feeds_iface_call 18 0 1 // // {"Flags":0,"ParamFlags":[],"ResultFlags":[]} // callsite: returns2.go:19:13|0 flagstr "" flagval 0 score -4 mask 2080 maskstr "passConcreteToItfCallAdj|callResultRescoreAdj" // // func T_return_feeds_iface_call() { b := newBar(10) b.Plark() } // returns2.go T_multi_return_feeds_iface_call 29 0 1 // // {"Flags":0,"ParamFlags":[],"ResultFlags":[]} // callsite: returns2.go:30:20|0 flagstr "" flagval 0 score -2 mask 2080 maskstr "passConcreteToItfCallAdj|callResultRescoreAdj" // // func T_multi_return_feeds_iface_call() { _, b, _ := newBar2(10) b.Plark() } // returns2.go T_returned_inlinable_func_feeds_indirect_call 41 0 1 // // {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} // callsite: returns2.go:42:18|0 flagstr "" flagval 0 score -43 mask 2560 maskstr "passInlinableFuncToIndCallAdj|callResultRescoreAdj" // callsite: returns2.go:44:20|1 flagstr "" flagval 0 score -28 mask 2560 maskstr "passInlinableFuncToIndCallAdj|callResultRescoreAdj" // // func T_returned_inlinable_func_feeds_indirect_call(q int) { f := returnsFunc() f(q) f2 := returnsFunc2() f2(q) } // returns2.go T_returned_noninlineable_func_feeds_indirect_call 54 0 1 // // {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} // callsite: returns2.go:55:30|0 flagstr "" flagval 0 score -23 mask 2176 maskstr "passFuncToIndCallAdj|callResultRescoreAdj" // // func T_returned_noninlineable_func_feeds_indirect_call(q int) { f := returnsNonInlinableFunc() f(q) } // returns2.go T_multi_return_feeds_indirect_call 65 0 1 // // {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} // callsite: returns2.go:66:29|0 flagstr "" flagval 0 score -26 mask 2560 maskstr "passInlinableFuncToIndCallAdj|callResultRescoreAdj" // // func T_multi_return_feeds_indirect_call(q int) { _, f, _ := multiReturnsFunc() f(q) } // returns2.go T_return_feeds_ifswitch 76 0 1 // // {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} // callsite: returns2.go:77:14|0 flagstr "" flagval 0 score 5 mask 2056 maskstr "passConstToIfAdj|callResultRescoreAdj" // // func T_return_feeds_ifswitch(q int) int { x := meaning(q) if x < 42 { switch x { case 42: return 1 } } return 0 } // returns2.go T_multi_return_feeds_ifswitch 93 0 1 // // {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} // callsite: returns2.go:94:21|0 flagstr "" flagval 0 score 4 mask 2056 maskstr "passConstToIfAdj|callResultRescoreAdj" // // func T_multi_return_feeds_ifswitch(q int) int { x, y, z := meanings(q) if x < y { switch x { case 42: return z } } return 0 } // returns2.go T_two_calls_feed_ifswitch 111 0 1 // // {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} // callsite: returns2.go:115:14|0 flagstr "" flagval 0 score 25 mask 0 maskstr "" // callsite: returns2.go:116:14|1 flagstr "" flagval 0 score 25 mask 0 maskstr "" // // func T_two_calls_feed_ifswitch(q int) int { // This case we don't handle; for the heuristic to kick in, // all names in a given if/switch cond have to come from the // same callsite x := meaning(q) y := meaning(-q) if x < y { switch x + y { case 42: return 1 } } return 0 } // returns2.go T_chained_indirect_call 132 0 1 // // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]} // callsite: returns2.go:135:18|0 flagstr "" flagval 0 score -43 mask 2560 maskstr "passInlinableFuncToIndCallAdj|callResultRescoreAdj" // // func T_chained_indirect_call(x, y int) { // Here 'returnsFunc' returns an inlinable func that feeds // directly into a call (no named intermediate). G += returnsFunc()(x + y) } // returns2.go T_chained_conc_iface_call 144 0 1 // // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]} // callsite: returns2.go:148:8|0 flagstr "" flagval 0 score -4 mask 2080 maskstr "passConcreteToItfCallAdj|callResultRescoreAdj" // // func T_chained_conc_iface_call(x, y int) { // Similar to the case above, return from call returning concrete type // feeds directly into interface call. Note that only the first // iface call is interesting here. newBar(10).Plark().Plark() } func returnsFunc() func(int) int { return adder } func returnsFunc2() func(int) int { return func(x int) int { return adder(x) } } func returnsNonInlinableFunc() func(int) int { return adderNoInline } func multiReturnsFunc() (int, func(int) int, int) { return 42, func(x int) int { G++; return 1 }, -42 } func adder(x int) int { G += 1 return G } func adderNoInline(x int) int { defer func() { G += x }() G += 1 return G } func meaning(q int) int { r := 0 for i := 0; i < 42; i++ { r += q } G += r return 42 } func meanings(q int) (int, int, int) { r := 0 for i := 0; i < 42; i++ { r += q } return 42, 43, r } type Bar struct { x int y string } func (b *Bar) Plark() Itf { return b } type Itf interface { Plark() Itf } func newBar(x int) Itf { s := 0 for i := 0; i < x; i++ { s += i } return &Bar{ x: s, } } func newBar2(x int) (int, Itf, bool) { s := 0 for i := 0; i < x; i++ { s += i } return 0, &Bar{x: s}, false } var G int