go/test
Austin Clements a2e79571a9 cmd/compile: separate data and function LSyms
Currently, obj.Ctxt's symbol table does not distinguish between ABI0
and ABIInternal symbols. This is *almost* okay, since a given symbol
name in the final object file is only going to belong to one ABI or
the other, but it requires that the compiler mark a Sym as being a
function symbol before it retrieves its LSym. If it retrieves the LSym
first, that LSym will be created as ABI0, and later marking the Sym as
a function symbol won't change the LSym's ABI.

Marking a Sym as a function symbol before looking up its LSym sounds
easy, except Syms have a dual purpose: they are used just as interned
strings (every function, variable, parameter, etc with the same
textual name shares a Sym), and *also* to store state for whatever
package global has that name. As a result, it's easy to slip up and
look up an LSym when a Sym is serving as the name of a local variable,
and then later mark it as a function when it's serving as the global
with the name.

In general, we were careful to avoid this, but #29610 demonstrates one
case where we messed up. Because of on-demand importing from indexed
export data, it's possible to compile a method wrapper for a type
imported from another package before importing an init function from
that package. If the argument of the method is named "init", the
"init" LSym will be created as a data symbol when compiling the
wrapper, before it gets marked as a function symbol.

To fix this, we separate obj.Ctxt's symbol tables for ABI0 and
ABIInternal symbols. This way, the compiler will simply get a
different LSym once the Sym takes on its package-global meaning as a
function.

This fixes the above ordering issue, and means we no longer need to go
out of our way to create the "init" function early and mark it as a
function symbol.

Fixes #29610.
Updates #27539.

Change-Id: Id9458b40017893d46ef9e4a3f9b47fc49e1ce8df
Reviewed-on: https://go-review.googlesource.com/c/157017
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
2019-01-11 00:45:49 +00:00
..
alias3.dir
bench test/bench/garbage: update Benchmarks Game URL to new page 2018-09-24 17:11:42 +00:00
chan all: fix article typos 2017-09-15 02:39:16 +00:00
closure3.dir cmd/compile: encourage inlining of functions with single-call bodies 2018-11-08 17:29:23 +00:00
codegen cmd/compile: pad zero-sized stack variables 2018-12-22 01:16:00 +00:00
ddd2.dir
dwarf
fixedbugs cmd/compile: separate data and function LSyms 2019-01-11 00:45:49 +00:00
import2.dir
import4.dir
interface
intrinsic.dir
ken test: remove rundircmpout and cmpout actions 2018-05-31 17:36:45 +00:00
linkname.dir
method4.dir
retjmp.dir cmd/asm: fix assembling return jump 2018-03-01 21:11:16 +00:00
stress
syntax cmd/compile: better handling of incorrect type switches 2018-04-03 05:34:20 +00:00
uintptrescapes.dir
64bit.go
235.go
README.md test: use the version of Go used to run run.go 2018-03-03 19:52:00 +00:00
alg.go
alias.go
alias1.go
alias2.go cmd/compile: cleanup method symbol creation 2018-04-05 22:01:17 +00:00
alias3.go
align.go test: check that unaligned load-add opcodes work. 2018-04-09 18:57:37 +00:00
append.go cmd/compile: optimize append(x, make([]T, y)...) slice extension 2018-05-06 04:28:23 +00:00
append1.go cmd/compile: optimize append(x, make([]T, y)...) slice extension 2018-05-06 04:28:23 +00:00
args.go
armimm.go
assign.go
assign1.go
atomicload.go
bigalg.go
bigmap.go
blank.go
blank1.go
bom.go
bombad.go
bounds.go test: gofmt bounds.go 2018-05-29 02:39:16 +00:00
chancap.go runtime: handle 64bits addresses for AIX 2018-11-26 14:06:28 +00:00
chanlinear.go
char_lit.go
char_lit1.go
checkbce.go test: restore binary.BigEndian use in checkbce 2018-09-24 21:20:51 +00:00
clearfat.go
closedchan.go
closure.go
closure1.go
closure2.go
closure3.go all: fix a bunch of misspellings 2018-10-06 15:40:03 +00:00
closure4.go cmd/compile/internal/gc: add nil check for closure call on wasm 2018-08-14 09:19:38 +00:00
cmp.go
cmp6.go
cmplx.go
cmplxdivide.c
cmplxdivide.go
cmplxdivide1.go
complit.go
complit1.go
compos.go
const.go
const1.go cmd/compile: fix constant pointer comparison failure 2018-04-09 23:19:45 +00:00
const2.go
const3.go
const4.go
const5.go
const6.go
convT2X.go
convert.go
convert1.go
convert2.go
convert3.go
convlit.go
convlit1.go
copy.go
copy1.go
crlf.go
ddd.go
ddd1.go
ddd2.go
decl.go
declbad.go
defer.go
deferfin.go
deferprint.go test: remove rundircmpout and cmpout actions 2018-05-31 17:36:45 +00:00
deferprint.out
devirt.go
divide.go
divmod.go
empty.go
env.go
eof.go
eof1.go
escape.go
escape2.go cmd/compile/internal/gc: unify self-assignment checks in esc.go 2018-09-20 09:46:11 +00:00
escape2n.go cmd/compile/internal/gc: unify self-assignment checks in esc.go 2018-09-20 09:46:11 +00:00
escape3.go
escape4.go cmd/compile: fix panic-okay-to-inline change; adjust tests 2018-06-06 20:35:23 +00:00
escape5.go cmd/compile: fix unnamed parameter handling in escape analysis 2018-12-04 23:01:00 +00:00
escape_array.go cmd/compile: print accurate escape reason for non-const-length slices 2018-03-28 16:56:03 +00:00
escape_because.go test: remove go:noinline from escape_because.go 2018-09-05 10:45:58 +00:00
escape_calls.go
escape_closure.go
escape_field.go
escape_iface.go
escape_indir.go
escape_level.go
escape_map.go
escape_param.go cmd/compile/internal/gc: fix mayAffectMemory in esc.go 2018-09-05 14:16:25 +00:00
escape_slice.go
escape_struct_param1.go
escape_struct_param2.go
escape_struct_return.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
gc.go
gc1.go
gc2.go all: skip unsupported tests for js/wasm 2018-04-30 19:39:18 +00:00
gcgort.go test: fast GC+concurrency+types verification 2018-05-08 21:15:48 +00:00
gcstring.go
goprint.go test: remove rundircmpout and cmpout actions 2018-05-31 17:36:45 +00:00
goprint.out
goto.go
heapsampling.go
helloworld.go test: remove rundircmpout and cmpout actions 2018-05-31 17:36:45 +00:00
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
initialize.go
initializerr.go
initloop.go
inline.go cmd/compile: encourage inlining of functions with single-call bodies 2018-11-08 17:29:23 +00:00
inline_big.go cmd/compile: set stricter inlining threshold in large functions 2018-07-24 16:11:08 +00:00
inline_caller.go runtime: make FuncForPC return the innermost inlined frame 2019-01-08 21:54:04 +00:00
inline_callers.go runtime: make FuncForPC return the innermost inlined frame 2019-01-08 21:54:04 +00:00
inline_literal.go
inline_math_bits_rotate.go cmd/compile: make math/bits.RotateLeft* an intrinsic on amd64 2018-08-30 22:48:28 +00:00
inline_variadic.go cmd/compile: enable inlining variadic functions 2018-03-13 20:34:03 +00:00
int_lit.go
intcvt.go
intrinsic.go
intrinsic_atomic.go cmd/compile: intrinsify atomics on MIPS64 2017-10-10 19:43:38 +00:00
iota.go
label.go
label1.go
linkmain.go
linkmain_run.go all: skip unsupported tests for js/wasm 2018-04-30 19:39:18 +00:00
linkname.go
linkobj.go all: skip unsupported tests for js/wasm 2018-04-30 19:39:18 +00:00
linkx.go
linkx_run.go all: skip unsupported tests for js/wasm 2018-04-30 19:39:18 +00:00
literal.go
live.go cmd/compile: provide types for all order-allocated temporaries 2018-10-15 16:07:52 +00:00
live1.go
live2.go cmd/compile,runtime: remove ambiguously live logic 2018-10-03 19:54:16 +00:00
live_syscall.go cmd/compile: encourage inlining of functions with single-call bodies 2018-11-08 17:29:23 +00:00
locklinear.go test: skip locklinear's lockmany test for now 2018-04-05 10:53:40 +00:00
loopbce.go cmd/compile: check for negative upper bound to IsSliceInBounds 2018-12-07 23:04:58 +00:00
makechan.go
makemap.go test: check that size argument errors are emitted at call site 2018-03-14 08:36:15 +00:00
makenew.go
mallocfin.go
map.go
map1.go
mapclear.go cmd/compile: optimize map-clearing range idiom 2018-05-08 21:15:16 +00:00
maplinear.go
mergemul.go
method.go
method1.go
method2.go cmd/compile: add two error position tests for the typechecker 2017-10-12 20:50:20 +00:00
method3.go
method4.go
method5.go
method6.go cmd/compile: add two error position tests for the typechecker 2017-10-12 20:50:20 +00:00
method7.go cmd/compile: fix method expressions with anonymous receivers 2018-04-06 15:39:11 +00:00
named.go
named1.go
nil.go
nilcheck.go
nilptr.go cmd/compile: fix nilcheck for AIX 2018-11-26 14:13:53 +00:00
nilptr2.go
nilptr3.go cmd/compile: fix nilcheck for AIX 2018-11-26 14:13:53 +00:00
nilptr4.go
nilptr5.go cmd/compile: fix nilcheck for AIX 2018-11-26 14:13:53 +00:00
nilptr5_aix.go test: fix nilptr5 for AIX 2018-11-27 15:36:08 +00:00
nilptr5_wasm.go cmd/compile: fix nilcheck for AIX 2018-11-26 14:13:53 +00:00
nilptr_aix.go cmd/compile: fix nilcheck for AIX 2018-11-26 14:13:53 +00:00
nosplit.go all: skip unsupported tests on AIX 2018-11-02 16:12:08 +00:00
notinheap.go cmd/compile: disallow converting string to notinheap slice 2018-11-02 19:53:59 +00:00
notinheap2.go
notinheap3.go cmd/compile: omit write barriers for slice clears of go:notinheap pointers 2018-12-05 21:54:54 +00:00
nowritebarrier.go cmd/compile: improve coverage of nowritebarrierrec check 2017-10-29 19:36:44 +00:00
nul1.go
opt_branchlikely.go
parentype.go
peano.go all: skip unsupported tests for js/wasm 2018-04-30 19:39:18 +00:00
phiopt.go
print.go test: remove rundircmpout and cmpout actions 2018-05-31 17:36:45 +00:00
print.out cmd/compile: fix print/println when input is uint 2017-09-26 04:08:38 +00:00
printbig.go test: remove rundircmpout and cmpout actions 2018-05-31 17:36:45 +00:00
printbig.out
prove.go cmd/compile: fix deriving from x+d >= w on overflow in prove pass 2019-01-02 19:28:06 +00:00
range.go cmd/compile: improve single blank variable handling in walkrange 2017-09-12 05:50:54 +00:00
recover.go
recover1.go
recover2.go
recover3.go
recover4.go all: use Fatalf instead of Fatal if format is given 2018-01-10 01:35:45 +00:00
recover5.go
reflectmethod1.go
reflectmethod2.go
reflectmethod3.go
reflectmethod4.go
rename.go
rename1.go
reorder.go
reorder2.go
retjmp.go cmd/asm: fix assembling return jump 2018-03-01 21:11:16 +00:00
return.go
rotate.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
run.go cmd/compile: use innermost line number for -S 2018-12-11 20:24:45 +00:00
rune.go
runtime.go
shift1.go cmd/compile: permit indices of certain non-constant shifts 2017-12-01 20:39:50 +00:00
shift2.go
sieve.go
sigchld.go test: remove rundircmpout and cmpout actions 2018-05-31 17:36:45 +00:00
sigchld.out
simassign.go
sinit.go cmd/compile: fix static initializer 2018-12-03 16:48:21 +00:00
sinit_run.go all: skip unsupported tests for js/wasm 2018-04-30 19:39:18 +00:00
sizeof.go
slice3.go
slice3err.go
slicecap.go
sliceopt.go cmd/compile: make prove pass use unsatisfiability 2018-03-08 22:25:25 +00:00
solitaire.go
stack.go
stackobj.go cmd/compile,runtime: remove ambiguously live logic 2018-10-03 19:54:16 +00:00
stackobj2.go test: stress test for stack objects 2018-10-03 19:54:29 +00:00
stackobj3.go cmd/compile,runtime: remove ambiguously live logic 2018-10-03 19:54:16 +00:00
strcopy.go test: add test to verify that string copies don't get optimized away 2018-06-12 19:10:34 +00:00
strength.go
string_lit.go
stringrange.go
struct0.go
switch.go
switch2.go
switch3.go
switch4.go
switch5.go Revert "fmt: fix incorrect format of whole-number floats when using %#v" 2018-10-16 21:54:35 +00:00
switch6.go
switch7.go
tinyfin.go
torture.go
turing.go
typecheck.go
typecheckloop.go
typeswitch.go
typeswitch1.go
typeswitch2.go test: fix spelling of `caught be the compiler` to `caught by the compiler` 2018-10-04 00:49:49 +00:00
typeswitch3.go test: fix spelling of `caught be the compiler` to `caught by the compiler` 2018-10-04 00:49:49 +00:00
uintptrescapes.go
uintptrescapes2.go cmd/compile: reuse temporaries in order pass 2018-10-14 05:21:00 +00:00
undef.go
utf.go
varerr.go
varinit.go
writebarrier.go cmd/compile: eliminate write barriers when writing non-heap ptrs 2018-11-29 22:23:02 +00:00
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

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.