Source file src/cmd/compile/internal/inline/inlheur/testdata/props/returns.go
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 // DO NOT EDIT (use 'go test -v -update-expected' instead.) 6 // See cmd/compile/internal/inline/inlheur/testdata/props/README.txt 7 // for more information on the format of this file. 8 // <endfilepreamble> 9 10 package returns1 11 12 import "unsafe" 13 14 // returns.go T_simple_allocmem 21 0 1 15 // ResultFlags 16 // 0 ResultIsAllocatedMem 17 // <endpropsdump> 18 // {"Flags":0,"ParamFlags":null,"ResultFlags":[2]} 19 // <endcallsites> 20 // <endfuncpreamble> 21 func T_simple_allocmem() *Bar { 22 return &Bar{} 23 } 24 25 // returns.go T_allocmem_two_returns 34 0 1 26 // ParamFlags 27 // 0 ParamFeedsIfOrSwitch 28 // ResultFlags 29 // 0 ResultIsAllocatedMem 30 // <endpropsdump> 31 // {"Flags":0,"ParamFlags":[32],"ResultFlags":[2]} 32 // <endcallsites> 33 // <endfuncpreamble> 34 func T_allocmem_two_returns(x int) *Bar { 35 // multiple returns 36 if x < 0 { 37 return new(Bar) 38 } else { 39 return &Bar{x: 2} 40 } 41 } 42 43 // returns.go T_allocmem_three_returns 52 0 1 44 // ParamFlags 45 // 0 ParamFeedsIfOrSwitch 46 // ResultFlags 47 // 0 ResultIsAllocatedMem 48 // <endpropsdump> 49 // {"Flags":0,"ParamFlags":[32],"ResultFlags":[2]} 50 // <endcallsites> 51 // <endfuncpreamble> 52 func T_allocmem_three_returns(x int) []*Bar { 53 // more multiple returns 54 switch x { 55 case 10, 11, 12: 56 return make([]*Bar, 10) 57 case 13: 58 fallthrough 59 case 15: 60 return []*Bar{&Bar{x: 15}} 61 } 62 return make([]*Bar, 0, 10) 63 } 64 65 // returns.go T_return_nil 72 0 1 66 // ResultFlags 67 // 0 ResultAlwaysSameConstant 68 // <endpropsdump> 69 // {"Flags":0,"ParamFlags":null,"ResultFlags":[8]} 70 // <endcallsites> 71 // <endfuncpreamble> 72 func T_return_nil() *Bar { 73 // simple case: no alloc 74 return nil 75 } 76 77 // returns.go T_multi_return_nil 84 0 1 78 // ResultFlags 79 // 0 ResultAlwaysSameConstant 80 // <endpropsdump> 81 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[8]} 82 // <endcallsites> 83 // <endfuncpreamble> 84 func T_multi_return_nil(x, y bool) *Bar { 85 if x && y { 86 return nil 87 } 88 return nil 89 } 90 91 // returns.go T_multi_return_nil_anomaly 98 0 1 92 // ResultFlags 93 // 0 ResultIsConcreteTypeConvertedToInterface 94 // <endpropsdump> 95 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[4]} 96 // <endcallsites> 97 // <endfuncpreamble> 98 func T_multi_return_nil_anomaly(x, y bool) Itf { 99 if x && y { 100 var qnil *Q 101 return qnil 102 } 103 var barnil *Bar 104 return barnil 105 } 106 107 // returns.go T_multi_return_some_nil 112 0 1 108 // <endpropsdump> 109 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[0]} 110 // <endcallsites> 111 // <endfuncpreamble> 112 func T_multi_return_some_nil(x, y bool) *Bar { 113 if x && y { 114 return nil 115 } else { 116 return &GB 117 } 118 } 119 120 // returns.go T_mixed_returns 127 0 1 121 // ParamFlags 122 // 0 ParamFeedsIfOrSwitch 123 // <endpropsdump> 124 // {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]} 125 // <endcallsites> 126 // <endfuncpreamble> 127 func T_mixed_returns(x int) *Bar { 128 // mix of alloc and non-alloc 129 if x < 0 { 130 return new(Bar) 131 } else { 132 return &GB 133 } 134 } 135 136 // returns.go T_mixed_returns_slice 143 0 1 137 // ParamFlags 138 // 0 ParamFeedsIfOrSwitch 139 // <endpropsdump> 140 // {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]} 141 // <endcallsites> 142 // <endfuncpreamble> 143 func T_mixed_returns_slice(x int) []*Bar { 144 // mix of alloc and non-alloc 145 switch x { 146 case 10, 11, 12: 147 return make([]*Bar, 10) 148 case 13: 149 fallthrough 150 case 15: 151 return []*Bar{&Bar{x: 15}} 152 } 153 ba := [...]*Bar{&GB, &GB} 154 return ba[:] 155 } 156 157 // returns.go T_maps_and_channels 167 0 1 158 // ResultFlags 159 // 0 ResultNoInfo 160 // 1 ResultNoInfo 161 // 2 ResultNoInfo 162 // 3 ResultAlwaysSameConstant 163 // <endpropsdump> 164 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[0,0,0,8]} 165 // <endcallsites> 166 // <endfuncpreamble> 167 func T_maps_and_channels(x int, b bool) (bool, map[int]int, chan bool, unsafe.Pointer) { 168 // maps and channels 169 return b, make(map[int]int), make(chan bool), nil 170 } 171 172 // returns.go T_assignment_to_named_returns 179 0 1 173 // ParamFlags 174 // 0 ParamFeedsIfOrSwitch 175 // <endpropsdump> 176 // {"Flags":0,"ParamFlags":[32],"ResultFlags":[0,0]} 177 // <endcallsites> 178 // <endfuncpreamble> 179 func T_assignment_to_named_returns(x int) (r1 *uint64, r2 *uint64) { 180 // assignments to named returns and then "return" not supported 181 r1 = new(uint64) 182 if x < 1 { 183 *r1 = 2 184 } 185 r2 = new(uint64) 186 return 187 } 188 189 // returns.go T_named_returns_but_return_explicit_values 199 0 1 190 // ParamFlags 191 // 0 ParamFeedsIfOrSwitch 192 // ResultFlags 193 // 0 ResultIsAllocatedMem 194 // 1 ResultIsAllocatedMem 195 // <endpropsdump> 196 // {"Flags":0,"ParamFlags":[32],"ResultFlags":[2,2]} 197 // <endcallsites> 198 // <endfuncpreamble> 199 func T_named_returns_but_return_explicit_values(x int) (r1 *uint64, r2 *uint64) { 200 // named returns ok if all returns are non-empty 201 rx1 := new(uint64) 202 if x < 1 { 203 *rx1 = 2 204 } 205 rx2 := new(uint64) 206 return rx1, rx2 207 } 208 209 // returns.go T_return_concrete_type_to_itf 216 0 1 210 // ResultFlags 211 // 0 ResultIsConcreteTypeConvertedToInterface 212 // <endpropsdump> 213 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[4]} 214 // <endcallsites> 215 // <endfuncpreamble> 216 func T_return_concrete_type_to_itf(x, y int) Itf { 217 return &Bar{} 218 } 219 220 // returns.go T_return_concrete_type_to_itfwith_copy 227 0 1 221 // ResultFlags 222 // 0 ResultIsConcreteTypeConvertedToInterface 223 // <endpropsdump> 224 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[4]} 225 // <endcallsites> 226 // <endfuncpreamble> 227 func T_return_concrete_type_to_itfwith_copy(x, y int) Itf { 228 b := &Bar{} 229 println("whee") 230 return b 231 } 232 233 // returns.go T_return_concrete_type_to_itf_mixed 238 0 1 234 // <endpropsdump> 235 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[0]} 236 // <endcallsites> 237 // <endfuncpreamble> 238 func T_return_concrete_type_to_itf_mixed(x, y int) Itf { 239 if x < y { 240 b := &Bar{} 241 return b 242 } 243 return nil 244 } 245 246 // returns.go T_return_same_func 253 0 1 247 // ResultFlags 248 // 0 ResultAlwaysSameInlinableFunc 249 // <endpropsdump> 250 // {"Flags":0,"ParamFlags":null,"ResultFlags":[32]} 251 // <endcallsites> 252 // <endfuncpreamble> 253 func T_return_same_func() func(int) int { 254 if G < 10 { 255 return foo 256 } else { 257 return foo 258 } 259 } 260 261 // returns.go T_return_different_funcs 266 0 1 262 // <endpropsdump> 263 // {"Flags":0,"ParamFlags":null,"ResultFlags":[0]} 264 // <endcallsites> 265 // <endfuncpreamble> 266 func T_return_different_funcs() func(int) int { 267 if G != 10 { 268 return foo 269 } else { 270 return bar 271 } 272 } 273 274 // returns.go T_return_same_closure 286 0 1 275 // ResultFlags 276 // 0 ResultAlwaysSameInlinableFunc 277 // <endpropsdump> 278 // {"Flags":0,"ParamFlags":null,"ResultFlags":[32]} 279 // <endcallsites> 280 // <endfuncpreamble> 281 // returns.go T_return_same_closure.func1 287 0 1 282 // <endpropsdump> 283 // {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} 284 // <endcallsites> 285 // <endfuncpreamble> 286 func T_return_same_closure() func(int) int { 287 p := func(q int) int { return q } 288 if G < 10 { 289 return p 290 } else { 291 return p 292 } 293 } 294 295 // returns.go T_return_different_closures 312 0 1 296 // <endpropsdump> 297 // {"Flags":0,"ParamFlags":null,"ResultFlags":[0]} 298 // <endcallsites> 299 // <endfuncpreamble> 300 // returns.go T_return_different_closures.func1 313 0 1 301 // <endpropsdump> 302 // {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} 303 // <endcallsites> 304 // <endfuncpreamble> 305 // returns.go T_return_different_closures.func2 317 0 1 306 // ResultFlags 307 // 0 ResultAlwaysSameConstant 308 // <endpropsdump> 309 // {"Flags":0,"ParamFlags":[0],"ResultFlags":[8]} 310 // <endcallsites> 311 // <endfuncpreamble> 312 func T_return_different_closures() func(int) int { 313 p := func(q int) int { return q } 314 if G < 10 { 315 return p 316 } else { 317 return func(q int) int { return 101 } 318 } 319 } 320 321 // returns.go T_return_noninlinable 339 0 1 322 // ResultFlags 323 // 0 ResultAlwaysSameFunc 324 // <endpropsdump> 325 // {"Flags":0,"ParamFlags":[0],"ResultFlags":[16]} 326 // <endcallsites> 327 // <endfuncpreamble> 328 // returns.go T_return_noninlinable.func1 340 0 1 329 // <endpropsdump> 330 // {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} 331 // callsite: returns.go:343:4|0 flagstr "" flagval 0 score 4 mask 0 maskstr "" 332 // <endcallsites> 333 // <endfuncpreamble> 334 // returns.go T_return_noninlinable.func1.1 341 0 1 335 // <endpropsdump> 336 // {"Flags":0,"ParamFlags":null,"ResultFlags":null} 337 // <endcallsites> 338 // <endfuncpreamble> 339 func T_return_noninlinable(x int) func(int) int { 340 noti := func(q int) int { 341 defer func() { 342 println(q + x) 343 }() 344 return q 345 } 346 return noti 347 } 348 349 type Bar struct { 350 x int 351 y string 352 } 353 354 func (b *Bar) Plark() { 355 } 356 357 type Q int 358 359 func (q *Q) Plark() { 360 } 361 362 func foo(x int) int { return x } 363 func bar(x int) int { return -x } 364 365 var G int 366 var GB Bar 367 368 type Itf interface { 369 Plark() 370 } 371