go/test
Matthew Dempsky 6a801d3082 cmd/compile/internal/noder: fix inlined function literal positions
When inlining function calls, we rewrite the position information on
all of the nodes to keep track of the inlining context. This is
necessary so that at runtime, we can synthesize additional stack
frames so that the inlining is transparent to the user.

However, for function literals, we *don't* want to apply this
rewriting to the underlying function. Because within the function
literal (when it's not itself inlined), the inlining context (if any)
will have already be available at the caller PC instead.

Unified IR was already getting this right in the case of user-written
statements within the function literal, which is what the unit test
for #46234 tested. However, it was still using inline-adjusted
positions for the function declaration and its parameters, which
occasionally end up getting used for generated code (e.g., loading
captured values from the closure record).

I've manually verified that this fixes the hang in
https://go.dev/play/p/avQ0qgRzOgt, and spot-checked the
-d=pctab=pctoinline output for kube-apiserver and kubelet and they
seem better.

However, I'm still working on a more robust test for this (hence
"Updates" not "Fixes") and internal assertions to verify that we're
emitting correct inline trees. In particular, there are still other
cases (even in the non-unified frontend) where we're producing
corrupt (but at least acyclic) inline trees.

Updates #54625.

Change-Id: Iacfd2e1eb06ae8dc299c0679f377461d3d46c15a
Reviewed-on: https://go-review.googlesource.com/c/go/+/425395
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Auto-Submit: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
2022-08-25 18:46:22 +00:00
..
abi
alias3.dir
asmhdr.dir
bench
chan
closure3.dir
closure5.dir test: use dot-relative imports where appropriate 2022-03-24 02:14:15 +00:00
codegen cmd/compile: deadcode for LoweredMuluhilo on riscv64 2022-08-24 18:08:33 +00:00
ddd2.dir
dwarf
fixedbugs cmd/compile: defer transitive inlining until after AST is edited 2022-08-24 14:31:08 +00:00
import2.dir
import4.dir
interface cmd/compile: require -p flag 2022-03-09 21:31:58 +00:00
intrinsic.dir
ken
linkname.dir test: compile source files as if from "test" module 2022-03-24 17:50:47 +00:00
method4.dir
retjmp.dir
runtime
stress
syntax cmd/compile/internal/syntax: better errors for syntax errors in lists 2022-03-31 00:26:58 +00:00
typeparam Revert "cmd/compile: restore test/nested.go test cases" 2022-08-23 19:37:34 +00:00
uintptrescapes.dir
64bit.go
235.go
README.md
alg.go
alias.go
alias1.go
alias2.go
alias3.go
align.go
append.go
append1.go
args.go
armimm.go
asmhdr.go
assign.go
assign1.go
atomicload.go
bigalg.go
bigmap.go
blank.go
blank1.go
bom.go
bombad.go
bounds.go
cannotassign.go
chancap.go
chanlinear.go
char_lit.go
char_lit1.go
checkbce.go
clearfat.go
closedchan.go
closure.go
closure1.go
closure2.go
closure3.go
closure4.go
closure5.go
closure6.go
closure7.go
cmp.go
cmp6.go
cmplx.go
cmplxdivide.c
cmplxdivide.go
cmplxdivide1.go
complit.go
complit1.go
compos.go
const.go
const1.go
const2.go
const3.go
const4.go
const5.go
const6.go
const7.go go/types, types2: check integer constant literal overflow 2022-08-16 01:11:29 +00:00
const8.go test: add more tests for const decls with ommitted RHS expressions 2022-06-28 18:11:31 +00:00
convT2X.go
convert.go
convert1.go
convert2.go
convert3.go
convert4.go
convlit.go
convlit1.go
copy.go
copy1.go
crlf.go
ddd.go
ddd1.go
ddd2.go
decl.go
declbad.go
defer.go
defererrcheck.go
deferfin.go
defernil.go
deferprint.go
deferprint.out
devirt.go
directive.go
directive2.go
divide.go
divmod.go
embedfunc.go
embedvers.go
empty.go
env.go
eof.go
eof1.go
escape.go
escape2.go
escape2n.go
escape3.go
escape4.go
escape5.go
escape_array.go
escape_calls.go
escape_closure.go
escape_field.go
escape_goto.go
escape_hash_maphash.go
escape_iface.go [dev.unified] test: break escape_iface.go into unified/nounified variants 2022-06-30 18:41:26 +00:00
escape_iface_nounified.go [dev.unified] test: break escape_iface.go into unified/nounified variants 2022-06-30 18:41:26 +00:00
escape_iface_unified.go [dev.unified] cmd/compile/internal/noder: implicit conversions for multi-valued expressions 2022-06-30 18:42:24 +00:00
escape_indir.go
escape_level.go
escape_map.go
escape_param.go
escape_runtime_atomic.go
escape_selfassign.go
escape_slice.go
escape_struct_param1.go
escape_struct_param2.go
escape_struct_return.go
escape_sync_atomic.go
escape_unsafe.go
fibo.go
finprofiled.go
float_lit.go
float_lit2.go
float_lit3.go
floatcmp.go
for.go
func.go
func1.go
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go
func8.go
funcdup.go
funcdup2.go
fuse.go
gc.go
gc1.go
gc2.go
gcgort.go
gcstring.go
goprint.go
goprint.out
goto.go
heapsampling.go test/heapsampling.go: slow down allocation rate and reduce iterations 2022-05-27 21:36:06 +00:00
helloworld.go
helloworld.out
if.go
import.go
import1.go
import2.go
import4.go
import5.go
import6.go
index.go
index0.go
index1.go
index2.go
indirect.go
indirect1.go
init.go
init1.go
initcomma.go
initempty.go
initexp.go
initialize.go
initializerr.go
initloop.go
inline.go [dev.unified] test: extract different inline test between unified and non-unified 2022-06-15 21:22:56 +00:00
inline_big.go
inline_caller.go
inline_callers.go
inline_endian.go
inline_literal.go
inline_math_bits_rotate.go
inline_nounified.go [dev.unified] test: extract different inline test between unified and non-unified 2022-06-15 21:22:56 +00:00
inline_sync.go
inline_unified.go cmd/compile/internal/noder: fix inlined function literal positions 2022-08-25 18:46:22 +00:00
inline_variadic.go
int_lit.go
intcvt.go
intrinsic.go
intrinsic_atomic.go misc, test: fix test error for loong64 2022-05-20 16:16:37 +00:00
iota.go
label.go
label1.go
linkmain.go
linkmain_run.go cmd/compile: require -p flag 2022-03-09 21:31:58 +00:00
linkname.go
linkname3.go
linkobj.go cmd/compile: require -p flag 2022-03-09 21:31:58 +00:00
linkx.go
linkx_run.go
literal.go
literal2.go
live.go cmd/compile: stop using VARKILL 2022-08-18 17:36:38 +00:00
live1.go
live2.go
live_regabi.go cmd/compile: stop using VARKILL 2022-08-18 17:36:38 +00:00
live_uintptrkeepalive.go all: fix spelling 2022-05-17 19:51:29 +00:00
loopbce.go cmd/compile: rework induction variable detector 2022-07-06 17:00:37 +00:00
mainsig.go
makechan.go
makemap.go
makenew.go
makeslice.go
mallocfin.go
map.go
map1.go
mapclear.go
maplinear.go
maymorestack.go
mergemul.go
method.go
method1.go
method2.go
method3.go
method4.go
method5.go
method6.go
method7.go
named.go
named1.go
nil.go
nilcheck.go [dev.unified] test: tweak nilcheck test 2022-06-30 18:41:59 +00:00
nilptr.go
nilptr2.go
nilptr3.go
nilptr4.go
nilptr5.go cmd/compile: handle partially overlapping assignments 2022-08-23 19:56:32 +00:00
nilptr5_aix.go
nilptr5_wasm.go
nilptr_aix.go
nosplit.go misc, test: fix test error for loong64 2022-05-20 16:16:37 +00:00
notinheap.go
notinheap2.go
notinheap3.go
nowritebarrier.go
nul1.go
opt_branchlikely.go
parentype.go
peano.go
phiopt.go
print.go
print.out
printbig.go
printbig.out
prove.go cmd/compile: don't use OFORUNTIL when implementing range loops 2022-08-18 17:32:44 +00:00
prove_constant_folding.go cmd/compile: fold constants found by prove 2022-05-04 20:30:17 +00:00
range.go
recover.go
recover1.go
recover2.go
recover3.go
recover4.go
recover5.go
reflectmethod1.go
reflectmethod2.go
reflectmethod3.go
reflectmethod4.go
reflectmethod5.go
reflectmethod6.go
reflectmethod7.go
reflectmethod8.go
rename.go
rename1.go
reorder.go
reorder2.go
retjmp.go
return.go
rotate.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
run.go cmd/compile: fix reflect naming of local generic types 2022-08-23 18:13:48 +00:00
rune.go
runtime.go
shift1.go
shift2.go
shift3.go cmd/compile: adjust types2 shift check to match go/types (cleanup) 2022-04-07 17:19:55 +00:00
sieve.go
sigchld.go
sigchld.out
simassign.go
sinit.go
sinit_run.go cmd/compile: require -p flag 2022-03-09 21:31:58 +00:00
sizeof.go
slice3.go
slice3err.go
slicecap.go
sliceopt.go
solitaire.go
stack.go
stackobj.go
stackobj2.go
stackobj3.go
strcopy.go
strength.go
string_lit.go
stringrange.go
struct0.go
switch.go [dev.unified] test: add switch test case for tricky nil handling 2022-07-19 23:30:49 +00:00
switch2.go
switch3.go
switch4.go
switch5.go
switch6.go
switch7.go
tinyfin.go
torture.go
turing.go
typecheck.go
typecheckloop.go
typeswitch.go
typeswitch1.go
typeswitch2.go
typeswitch2b.go
typeswitch3.go
uintptrescapes.go
uintptrescapes2.go
uintptrescapes3.go
uintptrkeepalive.go cmd/compile: add //go:uintptrkeepalive 2022-04-21 18:06:38 +00:00
undef.go
unsafebuiltins.go
used.go
utf.go
varerr.go
varinit.go
winbatch.go
writebarrier.go
zerodivide.go

README.md

The test directory contains tests of the Go tool chain and runtime. It includes black box tests, regression tests, and error output tests. They are run as part of all.bash.

To run just these tests, execute:

../bin/go run run.go

To run just tests from specified files in this directory, execute:

../bin/go run run.go -- file1.go file2.go ...

Standard library tests should be written as regular Go tests in the appropriate package.

The tool chain and runtime also have regular Go tests in their packages. The main reasons to add a new test to this directory are:

  • it is most naturally expressed using the test runner; or
  • it is also applicable to gccgo and other Go tool chains.