aboutsummaryrefslogtreecommitdiff
path: root/libgo/misc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-09-06 18:12:46 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-09-06 18:12:46 +0000
commitaa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13 (patch)
tree7e63b06d1eec92beec6997c9d3ab47a5d6a835be /libgo/misc
parent920ea3b8ba3164b61ac9490dfdfceb6936eda6dd (diff)
downloadgcc-aa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13.zip
gcc-aa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13.tar.gz
gcc-aa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13.tar.bz2
libgo: update to Go 1.13beta1 release
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/193497 From-SVN: r275473
Diffstat (limited to 'libgo/misc')
-rw-r--r--libgo/misc/cgo/errors/errors_test.go15
-rw-r--r--libgo/misc/cgo/errors/ptr_test.go493
-rw-r--r--libgo/misc/cgo/errors/src/err2.go13
-rw-r--r--libgo/misc/cgo/errors/src/err3.go18
-rw-r--r--libgo/misc/cgo/errors/src/issue13129.go14
-rw-r--r--libgo/misc/cgo/errors/src/issue13423.go12
-rw-r--r--libgo/misc/cgo/errors/src/issue13467.go15
-rw-r--r--libgo/misc/cgo/errors/src/issue13635.go24
-rw-r--r--libgo/misc/cgo/errors/src/issue13830.go26
-rw-r--r--libgo/misc/cgo/errors/src/issue16116.go12
-rw-r--r--libgo/misc/cgo/errors/src/issue16591.go17
-rw-r--r--libgo/misc/cgo/errors/src/issue26745.go17
-rw-r--r--libgo/misc/cgo/errors/src/issue7757.go14
-rw-r--r--libgo/misc/cgo/errors/src/issue8442.go17
-rw-r--r--libgo/misc/cgo/errors/testdata/err1.go (renamed from libgo/misc/cgo/errors/src/err1.go)4
-rw-r--r--libgo/misc/cgo/errors/testdata/err2.go102
-rw-r--r--libgo/misc/cgo/errors/testdata/err4.go (renamed from libgo/misc/cgo/errors/src/err4.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/issue11097a.go (renamed from libgo/misc/cgo/errors/src/issue11097a.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/issue11097b.go (renamed from libgo/misc/cgo/errors/src/issue11097b.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/issue14669.go (renamed from libgo/misc/cgo/errors/src/issue14669.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/issue18452.go (renamed from libgo/misc/cgo/errors/src/issue18452.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/issue18889.go (renamed from libgo/misc/cgo/errors/src/issue18889.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/issue28069.go (renamed from libgo/misc/cgo/errors/src/issue28069.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/issue28721.go (renamed from libgo/misc/cgo/errors/src/issue28721.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/long_double_size.go (renamed from libgo/misc/cgo/errors/src/long_double_size.go)0
-rw-r--r--libgo/misc/cgo/errors/testdata/malloc.go (renamed from libgo/misc/cgo/errors/src/malloc.go)0
-rw-r--r--libgo/misc/cgo/fortran/test.bash7
-rw-r--r--libgo/misc/cgo/life/life_test.go64
-rw-r--r--libgo/misc/cgo/life/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/life/testdata/c-life.c (renamed from libgo/misc/cgo/life/c-life.c)0
-rw-r--r--libgo/misc/cgo/life/testdata/life.go (renamed from libgo/misc/cgo/life/life.go)2
-rw-r--r--libgo/misc/cgo/life/testdata/life.h (renamed from libgo/misc/cgo/life/life.h)0
-rw-r--r--libgo/misc/cgo/life/testdata/main.go (renamed from libgo/misc/cgo/life/main.go)4
-rw-r--r--libgo/misc/cgo/life/testdata/main.out (renamed from libgo/misc/cgo/life/main.out)0
-rw-r--r--libgo/misc/cgo/stdio/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/stdio/stdio_test.go64
-rw-r--r--libgo/misc/cgo/stdio/testdata/chain.go (renamed from libgo/misc/cgo/stdio/chain.go)2
-rw-r--r--libgo/misc/cgo/stdio/testdata/chain.out (renamed from libgo/misc/cgo/stdio/chain.out)0
-rw-r--r--libgo/misc/cgo/stdio/testdata/fib.go (renamed from libgo/misc/cgo/stdio/fib.go)2
-rw-r--r--libgo/misc/cgo/stdio/testdata/fib.out (renamed from libgo/misc/cgo/stdio/fib.out)0
-rw-r--r--libgo/misc/cgo/stdio/testdata/hello.go (renamed from libgo/misc/cgo/stdio/hello.go)2
-rw-r--r--libgo/misc/cgo/stdio/testdata/hello.out (renamed from libgo/misc/cgo/stdio/hello.out)0
-rw-r--r--libgo/misc/cgo/stdio/testdata/run.out (renamed from libgo/misc/cgo/stdio/run.out)0
-rw-r--r--libgo/misc/cgo/stdio/testdata/stdio/file.go (renamed from libgo/misc/cgo/stdio/file.go)0
-rw-r--r--libgo/misc/cgo/stdio/testdata/stdio/stdio.go (renamed from libgo/misc/cgo/stdio/stdio.go)0
-rw-r--r--libgo/misc/cgo/test/align.go76
-rw-r--r--libgo/misc/cgo/test/api.go30
-rw-r--r--libgo/misc/cgo/test/basic.go181
-rw-r--r--libgo/misc/cgo/test/callback.go6
-rw-r--r--libgo/misc/cgo/test/cflags.go32
-rw-r--r--libgo/misc/cgo/test/cgo_linux_test.go13
-rw-r--r--libgo/misc/cgo/test/cgo_stubs_android_test.go1
-rw-r--r--libgo/misc/cgo/test/cgo_test.go97
-rw-r--r--libgo/misc/cgo/test/checkconst.go33
-rw-r--r--libgo/misc/cgo/test/complex.go24
-rw-r--r--libgo/misc/cgo/test/cthread.go44
-rw-r--r--libgo/misc/cgo/test/duplicate_symbol.go21
-rw-r--r--libgo/misc/cgo/test/env.go41
-rw-r--r--libgo/misc/cgo/test/exports.go18
-rw-r--r--libgo/misc/cgo/test/fpvar.go50
-rw-r--r--libgo/misc/cgo/test/helpers.go35
-rw-r--r--libgo/misc/cgo/test/issue10303.go76
-rw-r--r--libgo/misc/cgo/test/issue11925.go37
-rw-r--r--libgo/misc/cgo/test/issue12030.go35
-rw-r--r--libgo/misc/cgo/test/issue1222.go29
-rw-r--r--libgo/misc/cgo/test/issue1328.go30
-rw-r--r--libgo/misc/cgo/test/issue13930.go13
-rw-r--r--libgo/misc/cgo/test/issue14838.go37
-rw-r--r--libgo/misc/cgo/test/issue1560.go50
-rw-r--r--libgo/misc/cgo/test/issue1635.go38
-rw-r--r--libgo/misc/cgo/test/issue17065.go29
-rw-r--r--libgo/misc/cgo/test/issue17537.go58
-rw-r--r--libgo/misc/cgo/test/issue18126.go26
-rw-r--r--libgo/misc/cgo/test/issue18146.go6
-rw-r--r--libgo/misc/cgo/test/issue18720.go54
-rw-r--r--libgo/misc/cgo/test/issue20129.go33
-rw-r--r--libgo/misc/cgo/test/issue20369.go20
-rw-r--r--libgo/misc/cgo/test/issue20910.go19
-rw-r--r--libgo/misc/cgo/test/issue21708.go16
-rw-r--r--libgo/misc/cgo/test/issue21809.go45
-rw-r--r--libgo/misc/cgo/test/issue22958.go24
-rw-r--r--libgo/misc/cgo/test/issue23356.go19
-rw-r--r--libgo/misc/cgo/test/issue23720.go22
-rw-r--r--libgo/misc/cgo/test/issue24206.go54
-rw-r--r--libgo/misc/cgo/test/issue24206_generic.go13
-rw-r--r--libgo/misc/cgo/test/issue2462.go102
-rw-r--r--libgo/misc/cgo/test/issue25143.go22
-rw-r--r--libgo/misc/cgo/test/issue26066.go19
-rw-r--r--libgo/misc/cgo/test/issue26517.go23
-rw-r--r--libgo/misc/cgo/test/issue28545.go26
-rw-r--r--libgo/misc/cgo/test/issue28772.go12
-rw-r--r--libgo/misc/cgo/test/issue28896.go83
-rw-r--r--libgo/misc/cgo/test/issue29383.go19
-rw-r--r--libgo/misc/cgo/test/issue29748.go22
-rw-r--r--libgo/misc/cgo/test/issue29781.go17
-rw-r--r--libgo/misc/cgo/test/issue30065.go38
-rw-r--r--libgo/misc/cgo/test/issue3250.go95
-rw-r--r--libgo/misc/cgo/test/issue3261.go49
-rw-r--r--libgo/misc/cgo/test/issue3729.go47
-rw-r--r--libgo/misc/cgo/test/issue3729w.go16
-rw-r--r--libgo/misc/cgo/test/issue3741.go22
-rw-r--r--libgo/misc/cgo/test/issue3775.go39
-rw-r--r--libgo/misc/cgo/test/issue3945.go22
-rw-r--r--libgo/misc/cgo/test/issue4054a.go23
-rw-r--r--libgo/misc/cgo/test/issue4054b.go23
-rw-r--r--libgo/misc/cgo/test/issue4339.go17
-rw-r--r--libgo/misc/cgo/test/issue4417.go42
-rw-r--r--libgo/misc/cgo/test/issue4857.go15
-rw-r--r--libgo/misc/cgo/test/issue5227.go38
-rw-r--r--libgo/misc/cgo/test/issue5242.go31
-rw-r--r--libgo/misc/cgo/test/issue5337.go31
-rw-r--r--libgo/misc/cgo/test/issue5337w.go11
-rw-r--r--libgo/misc/cgo/test/issue5548.go27
-rw-r--r--libgo/misc/cgo/test/issue5603.go32
-rw-r--r--libgo/misc/cgo/test/issue5740.go15
-rw-r--r--libgo/misc/cgo/test/issue5986.go33
-rw-r--r--libgo/misc/cgo/test/issue6128.go20
-rw-r--r--libgo/misc/cgo/test/issue6390.go23
-rw-r--r--libgo/misc/cgo/test/issue6472.go22
-rw-r--r--libgo/misc/cgo/test/issue6506.go36
-rw-r--r--libgo/misc/cgo/test/issue6612.go90
-rw-r--r--libgo/misc/cgo/test/issue6833.go27
-rw-r--r--libgo/misc/cgo/test/issue6907.go33
-rw-r--r--libgo/misc/cgo/test/issue6907export.go30
-rw-r--r--libgo/misc/cgo/test/issue7560.go44
-rw-r--r--libgo/misc/cgo/test/issue7665.go25
-rw-r--r--libgo/misc/cgo/test/issue7786.go51
-rw-r--r--libgo/misc/cgo/test/issue7978.go115
-rw-r--r--libgo/misc/cgo/test/issue8092.go36
-rw-r--r--libgo/misc/cgo/test/issue8331a.go15
-rw-r--r--libgo/misc/cgo/test/issue8331b.go13
-rw-r--r--libgo/misc/cgo/test/issue8428.go55
-rw-r--r--libgo/misc/cgo/test/issue8441.go27
-rw-r--r--libgo/misc/cgo/test/issue8811.go22
-rw-r--r--libgo/misc/cgo/test/issue9557.go36
-rw-r--r--libgo/misc/cgo/test/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/test/pkg_test.go69
-rw-r--r--libgo/misc/cgo/test/sigaltstack.go2
-rw-r--r--libgo/misc/cgo/test/test.go2104
-rw-r--r--libgo/misc/cgo/test/test22906.go74
-rw-r--r--libgo/misc/cgo/test/test27660.go61
-rw-r--r--libgo/misc/cgo/test/test_unix.go11
-rw-r--r--libgo/misc/cgo/test/test_windows.go (renamed from libgo/misc/cgo/test/issue13402.go)7
-rw-r--r--libgo/misc/cgo/test/testdata/cgo_linux_test.go (renamed from libgo/misc/cgo/test/issue3250w.go)6
-rw-r--r--libgo/misc/cgo/test/testdata/cgo_test.go18
-rw-r--r--libgo/misc/cgo/test/testdata/gcc68255.go (renamed from libgo/misc/cgo/test/gcc68255.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/gcc68255/a.go (renamed from libgo/misc/cgo/test/gcc68255/a.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/gcc68255/c.c (renamed from libgo/misc/cgo/test/gcc68255/c.c)0
-rw-r--r--libgo/misc/cgo/test/testdata/gcc68255/c.h (renamed from libgo/misc/cgo/test/gcc68255/c.h)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue20266.go (renamed from libgo/misc/cgo/test/issue20266.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue20266/issue20266.h (renamed from libgo/misc/cgo/test/issue20266/issue20266.h)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue23555.go (renamed from libgo/misc/cgo/test/issue23555.go)4
-rw-r--r--libgo/misc/cgo/test/testdata/issue23555a/a.go (renamed from libgo/misc/cgo/test/issue23555a/a.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue23555b/a.go (renamed from libgo/misc/cgo/test/issue23555b/a.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue24161_darwin_test.go (renamed from libgo/misc/cgo/test/issue24161_darwin_test.go)10
-rw-r--r--libgo/misc/cgo/test/testdata/issue24161arg/def.go (renamed from libgo/misc/cgo/test/issue24161arg/def.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue24161arg/use.go (renamed from libgo/misc/cgo/test/issue24161arg/use.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue24161e0/main.go (renamed from libgo/misc/cgo/test/issue24161e0/main.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue24161e1/main.go (renamed from libgo/misc/cgo/test/issue24161e1/main.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue24161e2/main.go (renamed from libgo/misc/cgo/test/issue24161e2/main.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue24161res/restype.go (renamed from libgo/misc/cgo/test/issue24161res/restype.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue26213/jni.h (renamed from libgo/misc/cgo/test/issue26213/jni.h)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue26213/test26213.go (renamed from libgo/misc/cgo/test/issue26213/test26213.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue26430.go (renamed from libgo/misc/cgo/test/issue26430.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/issue26430/a.go (renamed from libgo/misc/cgo/test/issue26430/a.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue26430/b.go (renamed from libgo/misc/cgo/test/issue26430/b.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue26743.go (renamed from libgo/misc/cgo/test/issue26743.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/issue26743/a.go (renamed from libgo/misc/cgo/test/issue26743/a.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue26743/b.go (renamed from libgo/misc/cgo/test/issue26743/b.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue27054/egl.h (renamed from libgo/misc/cgo/test/issue27054/egl.h)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue27054/test27054.go (renamed from libgo/misc/cgo/test/issue27054/test27054.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue27340.go (renamed from libgo/misc/cgo/test/issue27340.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/issue27340/a.go (renamed from libgo/misc/cgo/test/issue27340/a.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue29563.go (renamed from libgo/misc/cgo/test/issue21668.go)11
-rw-r--r--libgo/misc/cgo/test/testdata/issue29563/weak.go13
-rw-r--r--libgo/misc/cgo/test/testdata/issue29563/weak1.c11
-rw-r--r--libgo/misc/cgo/test/testdata/issue29563/weak2.c11
-rw-r--r--libgo/misc/cgo/test/testdata/issue8756.go (renamed from libgo/misc/cgo/test/issue8756.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/issue8756/issue8756.go (renamed from libgo/misc/cgo/test/issue8756/issue8756.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue8828.go (renamed from libgo/misc/cgo/test/issue8828.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/issue8828/issue8828.c (renamed from libgo/misc/cgo/test/issue8828/issue8828.c)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue8828/trivial.go (renamed from libgo/misc/cgo/test/issue8828/trivial.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9026.go (renamed from libgo/misc/cgo/test/issue9026.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/issue9026/issue9026.go (renamed from libgo/misc/cgo/test/issue9026/issue9026.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_386.s (renamed from libgo/misc/cgo/test/issue9400/asm_386.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_amd64x.s (renamed from libgo/misc/cgo/test/issue9400/asm_amd64x.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_arm.s (renamed from libgo/misc/cgo/test/issue9400/asm_arm.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_arm64.s (renamed from libgo/misc/cgo/test/issue9400/asm_arm64.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_mips64x.s (renamed from libgo/misc/cgo/test/issue9400/asm_mips64x.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_mipsx.s (renamed from libgo/misc/cgo/test/issue9400/asm_mipsx.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_ppc64x.s (renamed from libgo/misc/cgo/test/issue9400/asm_ppc64x.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/asm_s390x.s (renamed from libgo/misc/cgo/test/issue9400/asm_s390x.s)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/gccgo.go (renamed from libgo/misc/cgo/test/issue9400/gccgo.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400/stubs.go (renamed from libgo/misc/cgo/test/issue9400/stubs.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9400_linux.go (renamed from libgo/misc/cgo/test/issue9400_linux.go)2
-rw-r--r--libgo/misc/cgo/test/testdata/issue9510.go (renamed from libgo/misc/cgo/test/issue9510.go)4
-rw-r--r--libgo/misc/cgo/test/testdata/issue9510a/a.go (renamed from libgo/misc/cgo/test/issue9510a/a.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/issue9510b/b.go (renamed from libgo/misc/cgo/test/issue9510b/b.go)0
-rw-r--r--libgo/misc/cgo/test/testdata/test26213.go (renamed from libgo/misc/cgo/test/test26213.go)2
-rw-r--r--libgo/misc/cgo/test/testx.go519
-rw-r--r--libgo/misc/cgo/test/twoargs.go22
-rw-r--r--libgo/misc/cgo/testcarchive/carchive_test.go171
-rw-r--r--libgo/misc/cgo/testcarchive/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/libgo/libgo.go (renamed from libgo/misc/cgo/testcarchive/src/libgo/libgo.go)2
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/libgo2/libgo2.go (renamed from libgo/misc/cgo/testcarchive/src/libgo2/libgo2.go)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/libgo3/libgo3.go (renamed from libgo/misc/cgo/testcarchive/src/libgo3/libgo3.go)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/libgo4/libgo4.go (renamed from libgo/misc/cgo/testcarchive/src/libgo4/libgo4.go)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/libgo6/sigprof.go (renamed from libgo/misc/cgo/testcarchive/src/libgo6/sigprof.go)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main.c (renamed from libgo/misc/cgo/testcarchive/main.c)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main2.c (renamed from libgo/misc/cgo/testcarchive/main2.c)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main3.c (renamed from libgo/misc/cgo/testcarchive/main3.c)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main4.c (renamed from libgo/misc/cgo/testcarchive/main4.c)19
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main5.c (renamed from libgo/misc/cgo/testcarchive/main5.c)6
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main6.c (renamed from libgo/misc/cgo/testcarchive/main6.c)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main_unix.c (renamed from libgo/misc/cgo/testcarchive/main_unix.c)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/main_windows.c (renamed from libgo/misc/cgo/testcarchive/main_windows.c)0
-rw-r--r--libgo/misc/cgo/testcarchive/testdata/p/p.go (renamed from libgo/misc/cgo/testcarchive/src/p/p.go)0
-rw-r--r--libgo/misc/cgo/testcshared/cshared_test.go170
-rw-r--r--libgo/misc/cgo/testcshared/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go (renamed from libgo/misc/cgo/testcshared/src/go2c2go/go/shlib.go)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/go2c2go/m1/c.c (renamed from libgo/misc/cgo/testcshared/src/go2c2go/m1/c.c)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/go2c2go/m1/main.go (renamed from libgo/misc/cgo/testcshared/src/go2c2go/m1/main.go)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/go2c2go/m2/main.go (renamed from libgo/misc/cgo/testcshared/src/go2c2go/m2/main.go)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/libgo/libgo.go (renamed from libgo/misc/cgo/testcshared/src/libgo/libgo.go)2
-rw-r--r--libgo/misc/cgo/testcshared/testdata/libgo2/dup2.go (renamed from libgo/misc/cgo/testcshared/src/libgo2/dup2.go)2
-rw-r--r--libgo/misc/cgo/testcshared/testdata/libgo2/dup3.go (renamed from libgo/misc/cgo/testcshared/src/libgo2/dup3.go)2
-rw-r--r--libgo/misc/cgo/testcshared/testdata/libgo2/libgo2.go (renamed from libgo/misc/cgo/testcshared/src/libgo2/libgo2.go)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/libgo4/libgo4.go (renamed from libgo/misc/cgo/testcshared/src/libgo4/libgo4.go)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/libgo5/libgo5.go (renamed from libgo/misc/cgo/testcshared/src/libgo5/libgo5.go)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/main0.c (renamed from libgo/misc/cgo/testcshared/main0.c)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/main1.c (renamed from libgo/misc/cgo/testcshared/main1.c)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/main2.c (renamed from libgo/misc/cgo/testcshared/main2.c)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/main3.c (renamed from libgo/misc/cgo/testcshared/main3.c)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/main4.c (renamed from libgo/misc/cgo/testcshared/main4.c)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/main5.c (renamed from libgo/misc/cgo/testcshared/main5.c)0
-rw-r--r--libgo/misc/cgo/testcshared/testdata/p/p.go (renamed from libgo/misc/cgo/testcshared/src/p/p.go)0
-rw-r--r--libgo/misc/cgo/testgodefs/test.bash4
-rw-r--r--libgo/misc/cgo/testgodefs/testdata/anonunion.go (renamed from libgo/misc/cgo/testgodefs/anonunion.go)0
-rw-r--r--libgo/misc/cgo/testgodefs/testdata/fieldtypedef.go (renamed from libgo/misc/cgo/testgodefs/fieldtypedef.go)0
-rw-r--r--libgo/misc/cgo/testgodefs/testdata/issue8478.go (renamed from libgo/misc/cgo/testgodefs/issue8478.go)0
-rw-r--r--libgo/misc/cgo/testgodefs/testdata/main.go (renamed from libgo/misc/cgo/testgodefs/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/altpath/testdata/common/common.go (renamed from libgo/misc/cgo/testplugin/altpath/src/common/common.go)0
-rw-r--r--libgo/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go (renamed from libgo/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go)2
-rw-r--r--libgo/misc/cgo/testplugin/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/testplugin/plugin_test.go203
-rw-r--r--libgo/misc/cgo/testplugin/test.bash109
-rw-r--r--libgo/misc/cgo/testplugin/testdata/checkdwarf/main.go (renamed from libgo/misc/cgo/testplugin/src/checkdwarf/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/common/common.go (renamed from libgo/misc/cgo/testplugin/src/common/common.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/host/host.go (renamed from libgo/misc/cgo/testplugin/src/host/host.go)2
-rw-r--r--libgo/misc/cgo/testplugin/testdata/iface/main.go (renamed from libgo/misc/cgo/testplugin/src/iface/main.go)3
-rw-r--r--libgo/misc/cgo/testplugin/testdata/iface_a/a.go (renamed from libgo/misc/cgo/testplugin/src/iface_a/a.go)2
-rw-r--r--libgo/misc/cgo/testplugin/testdata/iface_b/b.go (renamed from libgo/misc/cgo/testplugin/src/iface_b/b.go)2
-rw-r--r--libgo/misc/cgo/testplugin/testdata/iface_i/i.go (renamed from libgo/misc/cgo/testplugin/src/iface_i/i.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue18584/main.go (renamed from libgo/misc/cgo/testplugin/src/issue18584/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue18584/plugin.go (renamed from libgo/misc/cgo/testplugin/src/issue18584/plugin.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go (renamed from libgo/misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue18676/main.go (renamed from libgo/misc/cgo/testplugin/src/issue18676/main.go)2
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue18676/plugin.go (renamed from libgo/misc/cgo/testplugin/src/issue18676/plugin.go)2
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue19418/main.go (renamed from libgo/misc/cgo/testplugin/src/issue19418/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue19418/plugin.go (renamed from libgo/misc/cgo/testplugin/src/issue19418/plugin.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue19529/plugin.go (renamed from libgo/misc/cgo/testplugin/src/issue19529/plugin.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue19534/main.go (renamed from libgo/misc/cgo/testplugin/src/issue19534/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue19534/plugin.go (renamed from libgo/misc/cgo/testplugin/src/issue19534/plugin.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue22175/main.go (renamed from libgo/misc/cgo/testplugin/src/issue22175/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue22175/plugin1.go (renamed from libgo/misc/cgo/testplugin/src/issue22175/plugin1.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue22175/plugin2.go (renamed from libgo/misc/cgo/testplugin/src/issue22175/plugin2.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue22295.pkg/main.go (renamed from libgo/misc/cgo/testplugin/src/issue22295.pkg/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go (renamed from libgo/misc/cgo/testplugin/src/issue22295.pkg/plugin.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue24351/main.go (renamed from libgo/misc/cgo/testplugin/src/issue24351/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue24351/plugin.go (renamed from libgo/misc/cgo/testplugin/src/issue24351/plugin.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue25756/main.go (renamed from libgo/misc/cgo/testplugin/src/issue25756/main.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c (renamed from libgo/misc/cgo/testplugin/src/issue25756/plugin/c-life.c)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.go (renamed from libgo/misc/cgo/testplugin/src/issue25756/plugin/life.go)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.h (renamed from libgo/misc/cgo/testplugin/src/issue25756/plugin/life.h)0
-rw-r--r--libgo/misc/cgo/testplugin/testdata/plugin1/plugin1.go (renamed from libgo/misc/cgo/testplugin/src/plugin1/plugin1.go)3
-rw-r--r--libgo/misc/cgo/testplugin/testdata/plugin2/plugin2.go (renamed from libgo/misc/cgo/testplugin/src/plugin2/plugin2.go)3
-rw-r--r--libgo/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go (renamed from libgo/misc/cgo/testplugin/src/sub/plugin1/plugin1.go)2
-rw-r--r--libgo/misc/cgo/testplugin/testdata/unnamed1/main.go (renamed from libgo/misc/cgo/testplugin/unnamed1/main.go)2
-rw-r--r--libgo/misc/cgo/testplugin/testdata/unnamed2/main.go (renamed from libgo/misc/cgo/testplugin/unnamed2/main.go)2
-rw-r--r--libgo/misc/cgo/testsanitizers/cc_test.go2
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan.go (renamed from libgo/misc/cgo/testsanitizers/src/msan.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan2.go (renamed from libgo/misc/cgo/testsanitizers/src/msan2.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan2_cmsan.go (renamed from libgo/misc/cgo/testsanitizers/src/msan2_cmsan.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan3.go (renamed from libgo/misc/cgo/testsanitizers/src/msan3.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan4.go (renamed from libgo/misc/cgo/testsanitizers/src/msan4.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan5.go (renamed from libgo/misc/cgo/testsanitizers/src/msan5.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan6.go (renamed from libgo/misc/cgo/testsanitizers/src/msan6.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan_fail.go (renamed from libgo/misc/cgo/testsanitizers/src/msan_fail.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/msan_shared.go (renamed from libgo/misc/cgo/testsanitizers/src/msan_shared.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan10.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan10.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan11.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan11.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan12.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan12.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan2.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan2.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan3.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan3.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan4.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan4.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan5.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan5.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan6.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan6.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan7.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan7.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan8.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan8.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan9.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan9.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/testdata/tsan_shared.go (renamed from libgo/misc/cgo/testsanitizers/src/tsan_shared.go)0
-rw-r--r--libgo/misc/cgo/testsanitizers/tsan_test.go4
-rw-r--r--libgo/misc/cgo/testshared/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/testshared/shared_test.go340
-rw-r--r--libgo/misc/cgo/testshared/testdata/dep2/dep2.go (renamed from libgo/misc/cgo/testshared/src/dep2/dep2.go)2
-rw-r--r--libgo/misc/cgo/testshared/testdata/dep3/dep3.go (renamed from libgo/misc/cgo/testshared/src/dep3/dep3.go)4
-rw-r--r--libgo/misc/cgo/testshared/testdata/depBase/asm.s (renamed from libgo/misc/cgo/testshared/src/depBase/asm.s)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/depBase/dep.go (renamed from libgo/misc/cgo/testshared/src/depBase/dep.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/depBase/gccgo.go (renamed from libgo/misc/cgo/testshared/src/depBase/gccgo.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/depBase/stubs.go (renamed from libgo/misc/cgo/testshared/src/depBase/stubs.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/division/division.go (renamed from libgo/misc/cgo/testshared/src/division/division.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/exe/exe.go (renamed from libgo/misc/cgo/testshared/src/exe/exe.go)3
-rw-r--r--libgo/misc/cgo/testshared/testdata/exe2/exe2.go (renamed from libgo/misc/cgo/testshared/src/exe2/exe2.go)2
-rw-r--r--libgo/misc/cgo/testshared/testdata/exe3/exe3.go (renamed from libgo/misc/cgo/testshared/src/exe3/exe3.go)2
-rw-r--r--libgo/misc/cgo/testshared/testdata/execgo/exe.go (renamed from libgo/misc/cgo/testshared/src/execgo/exe.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/explicit/explicit.go (renamed from libgo/misc/cgo/testshared/src/explicit/explicit.go)2
-rw-r--r--libgo/misc/cgo/testshared/testdata/global/main.go (renamed from libgo/misc/cgo/testshared/src/global/main.go)2
-rw-r--r--libgo/misc/cgo/testshared/testdata/globallib/global.go (renamed from libgo/misc/cgo/testshared/src/globallib/global.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/iface/main.go (renamed from libgo/misc/cgo/testshared/src/iface/main.go)4
-rw-r--r--libgo/misc/cgo/testshared/testdata/iface_a/a.go (renamed from libgo/misc/cgo/testshared/src/iface_a/a.go)2
-rw-r--r--libgo/misc/cgo/testshared/testdata/iface_b/b.go (renamed from libgo/misc/cgo/testshared/src/iface_b/b.go)2
-rw-r--r--libgo/misc/cgo/testshared/testdata/iface_i/i.go (renamed from libgo/misc/cgo/testshared/src/iface_i/i.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/implicit/implicit.go (renamed from libgo/misc/cgo/testshared/src/implicit/implicit.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go (renamed from libgo/misc/cgo/testshared/src/implicitcmd/implicitcmd.go)4
-rw-r--r--libgo/misc/cgo/testshared/testdata/issue25065/a.go (renamed from libgo/misc/cgo/testshared/src/issue25065/a.go)0
-rw-r--r--libgo/misc/cgo/testshared/testdata/trivial/trivial.go (renamed from libgo/misc/cgo/testshared/src/trivial/trivial.go)0
-rw-r--r--libgo/misc/cgo/testso/noso_test.go9
-rw-r--r--libgo/misc/cgo/testso/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/testso/so_test.go140
-rw-r--r--libgo/misc/cgo/testso/testdata/cgoso.c (renamed from libgo/misc/cgo/testso/cgoso.c)2
-rw-r--r--libgo/misc/cgo/testso/testdata/cgoso.go (renamed from libgo/misc/cgo/testso/cgoso.go)1
-rw-r--r--libgo/misc/cgo/testso/testdata/cgoso_c.c (renamed from libgo/misc/cgo/testso/cgoso_c.c)9
-rw-r--r--libgo/misc/cgo/testso/testdata/cgoso_unix.go (renamed from libgo/misc/cgo/testso/cgoso_unix.go)2
-rw-r--r--libgo/misc/cgo/testso/testdata/main.go (renamed from libgo/misc/cgo/testso/main.go)2
-rw-r--r--libgo/misc/cgo/testsovar/noso_test.go9
-rw-r--r--libgo/misc/cgo/testsovar/overlaydir_test.go81
-rw-r--r--libgo/misc/cgo/testsovar/so_test.go140
-rw-r--r--libgo/misc/cgo/testsovar/testdata/cgoso.go (renamed from libgo/misc/cgo/testsovar/cgoso.go)1
-rw-r--r--libgo/misc/cgo/testsovar/testdata/cgoso_c.c (renamed from libgo/misc/cgo/testsovar/cgoso_c.c)0
-rw-r--r--libgo/misc/cgo/testsovar/testdata/cgoso_c.h (renamed from libgo/misc/cgo/testsovar/cgoso_c.h)0
-rw-r--r--libgo/misc/cgo/testsovar/testdata/main.go (renamed from libgo/misc/cgo/testsovar/main.go)2
342 files changed, 5040 insertions, 4249 deletions
diff --git a/libgo/misc/cgo/errors/errors_test.go b/libgo/misc/cgo/errors/errors_test.go
index 59054f4..e6bac0f 100644
--- a/libgo/misc/cgo/errors/errors_test.go
+++ b/libgo/misc/cgo/errors/errors_test.go
@@ -18,7 +18,7 @@ import (
)
func path(file string) string {
- return filepath.Join("src", file)
+ return filepath.Join("testdata", file)
}
func check(t *testing.T, file string) {
@@ -63,7 +63,7 @@ func expect(t *testing.T, file string, errors []*regexp.Regexp) {
defer os.RemoveAll(dir)
dst := filepath.Join(dir, strings.TrimSuffix(file, ".go"))
- cmd := exec.Command("go", "build", "-gcflags=-L", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
+ cmd := exec.Command("go", "build", "-gcflags=-L -e", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
out, err := cmd.CombinedOutput()
if err == nil {
t.Errorf("expected cgo to fail but it succeeded")
@@ -107,21 +107,10 @@ func TestReportsTypeErrors(t *testing.T) {
for _, file := range []string{
"err1.go",
"err2.go",
- "err3.go",
- "issue7757.go",
- "issue8442.go",
"issue11097a.go",
"issue11097b.go",
- "issue13129.go",
- "issue13423.go",
- "issue13467.go",
- "issue13635.go",
- "issue13830.go",
- "issue16116.go",
- "issue16591.go",
"issue18452.go",
"issue18889.go",
- "issue26745.go",
"issue28721.go",
} {
check(t, file)
diff --git a/libgo/misc/cgo/errors/ptr_test.go b/libgo/misc/cgo/errors/ptr_test.go
index 254671f..d1ef191 100644
--- a/libgo/misc/cgo/errors/ptr_test.go
+++ b/libgo/misc/cgo/errors/ptr_test.go
@@ -7,21 +7,25 @@
package errorstest
import (
- "bufio"
"bytes"
+ "flag"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strings"
+ "sync/atomic"
"testing"
)
+var tmp = flag.String("tmp", "", "use `dir` for temporary files and do not clean up")
+
// ptrTest is the tests without the boilerplate.
type ptrTest struct {
name string // for reporting
c string // the cgo comment
+ c1 string // cgo comment forced into non-export cgo file
imports []string // a list of imports
support string // supporting functions
body string // the body of the main function
@@ -39,253 +43,248 @@ var ptrTests = []ptrTest{
{
// Passing a pointer to a struct that contains a Go pointer.
name: "ptr1",
- c: `typedef struct s { int *p; } s; void f(s *ps) {}`,
- body: `C.f(&C.s{new(C.int)})`,
+ c: `typedef struct s1 { int *p; } s1; void f1(s1 *ps) {}`,
+ body: `C.f1(&C.s1{new(C.int)})`,
fail: true,
},
{
// Passing a pointer to a struct that contains a Go pointer.
name: "ptr2",
- c: `typedef struct s { int *p; } s; void f(s *ps) {}`,
- body: `p := &C.s{new(C.int)}; C.f(p)`,
+ c: `typedef struct s2 { int *p; } s2; void f2(s2 *ps) {}`,
+ body: `p := &C.s2{new(C.int)}; C.f2(p)`,
fail: true,
},
{
// Passing a pointer to an int field of a Go struct
// that (irrelevantly) contains a Go pointer.
name: "ok1",
- c: `struct s { int i; int *p; }; void f(int *p) {}`,
- body: `p := &C.struct_s{i: 0, p: new(C.int)}; C.f(&p.i)`,
+ c: `struct s3 { int i; int *p; }; void f3(int *p) {}`,
+ body: `p := &C.struct_s3{i: 0, p: new(C.int)}; C.f3(&p.i)`,
fail: false,
},
{
// Passing a pointer to a pointer field of a Go struct.
- name: "ptr-field",
- c: `struct s { int i; int *p; }; void f(int **p) {}`,
- body: `p := &C.struct_s{i: 0, p: new(C.int)}; C.f(&p.p)`,
+ name: "ptrfield",
+ c: `struct s4 { int i; int *p; }; void f4(int **p) {}`,
+ body: `p := &C.struct_s4{i: 0, p: new(C.int)}; C.f4(&p.p)`,
fail: true,
},
{
// Passing a pointer to a pointer field of a Go
// struct, where the field does not contain a Go
// pointer, but another field (irrelevantly) does.
- name: "ptr-field-ok",
- c: `struct s { int *p1; int *p2; }; void f(int **p) {}`,
- body: `p := &C.struct_s{p1: nil, p2: new(C.int)}; C.f(&p.p1)`,
+ name: "ptrfieldok",
+ c: `struct s5 { int *p1; int *p2; }; void f5(int **p) {}`,
+ body: `p := &C.struct_s5{p1: nil, p2: new(C.int)}; C.f5(&p.p1)`,
fail: false,
},
{
// Passing the address of a slice with no Go pointers.
- name: "slice-ok-1",
- c: `void f(void **p) {}`,
+ name: "sliceok1",
+ c: `void f6(void **p) {}`,
imports: []string{"unsafe"},
- body: `s := []unsafe.Pointer{nil}; C.f(&s[0])`,
+ body: `s := []unsafe.Pointer{nil}; C.f6(&s[0])`,
fail: false,
},
{
// Passing the address of a slice with a Go pointer.
- name: "slice-ptr-1",
- c: `void f(void **p) {}`,
+ name: "sliceptr1",
+ c: `void f7(void **p) {}`,
imports: []string{"unsafe"},
- body: `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f(&s[0])`,
+ body: `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f7(&s[0])`,
fail: true,
},
{
// Passing the address of a slice with a Go pointer,
// where we are passing the address of an element that
// is not a Go pointer.
- name: "slice-ptr-2",
- c: `void f(void **p) {}`,
+ name: "sliceptr2",
+ c: `void f8(void **p) {}`,
imports: []string{"unsafe"},
- body: `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f(&s[0])`,
+ body: `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f8(&s[0])`,
fail: true,
},
{
// Passing the address of a slice that is an element
// in a struct only looks at the slice.
- name: "slice-ok-2",
- c: `void f(void **p) {}`,
+ name: "sliceok2",
+ c: `void f9(void **p) {}`,
imports: []string{"unsafe"},
- support: `type S struct { p *int; s []unsafe.Pointer }`,
- body: `i := 0; p := &S{p:&i, s:[]unsafe.Pointer{nil}}; C.f(&p.s[0])`,
+ support: `type S9 struct { p *int; s []unsafe.Pointer }`,
+ body: `i := 0; p := &S9{p:&i, s:[]unsafe.Pointer{nil}}; C.f9(&p.s[0])`,
fail: false,
},
{
// Passing the address of a slice of an array that is
// an element in a struct, with a type conversion.
- name: "slice-ok-3",
- c: `void f(void* p) {}`,
+ name: "sliceok3",
+ c: `void f10(void* p) {}`,
imports: []string{"unsafe"},
- support: `type S struct { p *int; a [4]byte }`,
- body: `i := 0; p := &S{p:&i}; s := p.a[:]; C.f(unsafe.Pointer(&s[0]))`,
+ support: `type S10 struct { p *int; a [4]byte }`,
+ body: `i := 0; p := &S10{p:&i}; s := p.a[:]; C.f10(unsafe.Pointer(&s[0]))`,
fail: false,
},
{
// Passing the address of a slice of an array that is
// an element in a struct, with a type conversion.
- name: "slice-ok-4",
- c: `typedef void* PV; void f(PV p) {}`,
+ name: "sliceok4",
+ c: `typedef void* PV11; void f11(PV11 p) {}`,
imports: []string{"unsafe"},
- support: `type S struct { p *int; a [4]byte }`,
- body: `i := 0; p := &S{p:&i}; C.f(C.PV(unsafe.Pointer(&p.a[0])))`,
+ support: `type S11 struct { p *int; a [4]byte }`,
+ body: `i := 0; p := &S11{p:&i}; C.f11(C.PV11(unsafe.Pointer(&p.a[0])))`,
fail: false,
},
{
// Passing the address of a static variable with no
// pointers doesn't matter.
name: "varok",
- c: `void f(char** parg) {}`,
- support: `var hello = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
- body: `parg := [1]*C.char{&hello[0]}; C.f(&parg[0])`,
+ c: `void f12(char** parg) {}`,
+ support: `var hello12 = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
+ body: `parg := [1]*C.char{&hello12[0]}; C.f12(&parg[0])`,
fail: false,
},
{
// Passing the address of a static variable with
// pointers does matter.
- name: "var",
- c: `void f(char*** parg) {}`,
- support: `var hello = [...]*C.char{new(C.char)}`,
- body: `parg := [1]**C.char{&hello[0]}; C.f(&parg[0])`,
+ name: "var1",
+ c: `void f13(char*** parg) {}`,
+ support: `var hello13 = [...]*C.char{new(C.char)}`,
+ body: `parg := [1]**C.char{&hello13[0]}; C.f13(&parg[0])`,
fail: true,
},
{
// Storing a Go pointer into C memory should fail.
name: "barrier",
c: `#include <stdlib.h>
- char **f1() { return malloc(sizeof(char*)); }
- void f2(char **p) {}`,
- body: `p := C.f1(); *p = new(C.char); C.f2(p)`,
+ char **f14a() { return malloc(sizeof(char*)); }
+ void f14b(char **p) {}`,
+ body: `p := C.f14a(); *p = new(C.char); C.f14b(p)`,
fail: true,
expensive: true,
},
{
// Storing a Go pointer into C memory by assigning a
// large value should fail.
- name: "barrier-struct",
+ name: "barrierstruct",
c: `#include <stdlib.h>
- struct s { char *a[10]; };
- struct s *f1() { return malloc(sizeof(struct s)); }
- void f2(struct s *p) {}`,
- body: `p := C.f1(); p.a = [10]*C.char{new(C.char)}; C.f2(p)`,
+ struct s15 { char *a[10]; };
+ struct s15 *f15() { return malloc(sizeof(struct s15)); }
+ void f15b(struct s15 *p) {}`,
+ body: `p := C.f15(); p.a = [10]*C.char{new(C.char)}; C.f15b(p)`,
fail: true,
expensive: true,
},
{
// Storing a Go pointer into C memory using a slice
// copy should fail.
- name: "barrier-slice",
+ name: "barrierslice",
c: `#include <stdlib.h>
- struct s { char *a[10]; };
- struct s *f1() { return malloc(sizeof(struct s)); }
- void f2(struct s *p) {}`,
- body: `p := C.f1(); copy(p.a[:], []*C.char{new(C.char)}); C.f2(p)`,
+ struct s16 { char *a[10]; };
+ struct s16 *f16() { return malloc(sizeof(struct s16)); }
+ void f16b(struct s16 *p) {}`,
+ body: `p := C.f16(); copy(p.a[:], []*C.char{new(C.char)}); C.f16b(p)`,
fail: true,
expensive: true,
},
{
// A very large value uses a GC program, which is a
// different code path.
- name: "barrier-gcprog-array",
+ name: "barriergcprogarray",
c: `#include <stdlib.h>
- struct s { char *a[32769]; };
- struct s *f1() { return malloc(sizeof(struct s)); }
- void f2(struct s *p) {}`,
- body: `p := C.f1(); p.a = [32769]*C.char{new(C.char)}; C.f2(p)`,
+ struct s17 { char *a[32769]; };
+ struct s17 *f17() { return malloc(sizeof(struct s17)); }
+ void f17b(struct s17 *p) {}`,
+ body: `p := C.f17(); p.a = [32769]*C.char{new(C.char)}; C.f17b(p)`,
fail: true,
expensive: true,
},
{
// Similar case, with a source on the heap.
- name: "barrier-gcprog-array-heap",
+ name: "barriergcprogarrayheap",
c: `#include <stdlib.h>
- struct s { char *a[32769]; };
- struct s *f1() { return malloc(sizeof(struct s)); }
- void f2(struct s *p) {}
- void f3(void *p) {}`,
+ struct s18 { char *a[32769]; };
+ struct s18 *f18() { return malloc(sizeof(struct s18)); }
+ void f18b(struct s18 *p) {}
+ void f18c(void *p) {}`,
imports: []string{"unsafe"},
- body: `p := C.f1(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f2(p); n[0] = nil; C.f3(unsafe.Pointer(n))`,
+ body: `p := C.f18(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f18b(p); n[0] = nil; C.f18c(unsafe.Pointer(n))`,
fail: true,
expensive: true,
},
{
// A GC program with a struct.
- name: "barrier-gcprog-struct",
+ name: "barriergcprogstruct",
c: `#include <stdlib.h>
- struct s { char *a[32769]; };
- struct s2 { struct s f; };
- struct s2 *f1() { return malloc(sizeof(struct s2)); }
- void f2(struct s2 *p) {}`,
- body: `p := C.f1(); p.f = C.struct_s{[32769]*C.char{new(C.char)}}; C.f2(p)`,
+ struct s19a { char *a[32769]; };
+ struct s19b { struct s19a f; };
+ struct s19b *f19() { return malloc(sizeof(struct s19b)); }
+ void f19b(struct s19b *p) {}`,
+ body: `p := C.f19(); p.f = C.struct_s19a{[32769]*C.char{new(C.char)}}; C.f19b(p)`,
fail: true,
expensive: true,
},
{
// Similar case, with a source on the heap.
- name: "barrier-gcprog-struct-heap",
+ name: "barriergcprogstructheap",
c: `#include <stdlib.h>
- struct s { char *a[32769]; };
- struct s2 { struct s f; };
- struct s2 *f1() { return malloc(sizeof(struct s2)); }
- void f2(struct s2 *p) {}
- void f3(void *p) {}`,
+ struct s20a { char *a[32769]; };
+ struct s20b { struct s20a f; };
+ struct s20b *f20() { return malloc(sizeof(struct s20b)); }
+ void f20b(struct s20b *p) {}
+ void f20c(void *p) {}`,
imports: []string{"unsafe"},
- body: `p := C.f1(); n := &C.struct_s{[32769]*C.char{new(C.char)}}; p.f = *n; C.f2(p); n.a[0] = nil; C.f3(unsafe.Pointer(n))`,
+ body: `p := C.f20(); n := &C.struct_s20a{[32769]*C.char{new(C.char)}}; p.f = *n; C.f20b(p); n.a[0] = nil; C.f20c(unsafe.Pointer(n))`,
fail: true,
expensive: true,
},
{
// Exported functions may not return Go pointers.
name: "export1",
- c: `extern unsigned char *GoFn();`,
- support: `//export GoFn
- func GoFn() *byte { return new(byte) }`,
- body: `C.GoFn()`,
+ c: `extern unsigned char *GoFn21();`,
+ support: `//export GoFn21
+ func GoFn21() *byte { return new(byte) }`,
+ body: `C.GoFn21()`,
fail: true,
},
{
// Returning a C pointer is fine.
name: "exportok",
c: `#include <stdlib.h>
- extern unsigned char *GoFn();`,
- support: `//export GoFn
- func GoFn() *byte { return (*byte)(C.malloc(1)) }`,
- body: `C.GoFn()`,
+ extern unsigned char *GoFn22();`,
+ support: `//export GoFn22
+ func GoFn22() *byte { return (*byte)(C.malloc(1)) }`,
+ body: `C.GoFn22()`,
},
{
// Passing a Go string is fine.
- name: "pass-string",
+ name: "passstring",
c: `#include <stddef.h>
- typedef struct { const char *p; ptrdiff_t n; } gostring;
- gostring f(gostring s) { return s; }`,
+ typedef struct { const char *p; ptrdiff_t n; } gostring23;
+ gostring23 f23(gostring23 s) { return s; }`,
imports: []string{"unsafe"},
- body: `s := "a"; r := C.f(*(*C.gostring)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
+ body: `s := "a"; r := C.f23(*(*C.gostring23)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
},
{
// Passing a slice of Go strings fails.
- name: "pass-string-slice",
- c: `void f(void *p) {}`,
+ name: "passstringslice",
+ c: `void f24(void *p) {}`,
imports: []string{"strings", "unsafe"},
- support: `type S struct { a [1]string }`,
- body: `s := S{a:[1]string{strings.Repeat("a", 2)}}; C.f(unsafe.Pointer(&s.a[0]))`,
+ support: `type S24 struct { a [1]string }`,
+ body: `s := S24{a:[1]string{strings.Repeat("a", 2)}}; C.f24(unsafe.Pointer(&s.a[0]))`,
fail: true,
},
{
// Exported functions may not return strings.
- name: "ret-string",
- c: `extern void f();`,
+ name: "retstring",
+ c: `extern void f25();`,
imports: []string{"strings"},
- support: `//export GoStr
- func GoStr() string { return strings.Repeat("a", 2) }`,
- body: `C.f()`,
- extra: []extra{
- {
- "call.c",
- `#include <stddef.h>
- typedef struct { const char *p; ptrdiff_t n; } gostring;
- extern gostring GoStr();
- void f() { GoStr(); }`,
- },
- },
+ support: `//export GoStr25
+ func GoStr25() string { return strings.Repeat("a", 2) }`,
+ body: `C.f25()`,
+ c1: `#include <stddef.h>
+ typedef struct { const char *p; ptrdiff_t n; } gostring25;
+ extern gostring25 GoStr25();
+ void f25() { GoStr25(); }`,
fail: true,
},
{
@@ -296,37 +295,37 @@ var ptrTests = []ptrTest{
// that is, we are testing something that is not unsafe.
name: "ptrdata1",
c: `#include <stdlib.h>
- void f(void* p) {}`,
+ void f26(void* p) {}`,
imports: []string{"unsafe"},
- support: `type S struct { p *int; a [8*8]byte; u uintptr }`,
- body: `i := 0; p := &S{u:uintptr(unsafe.Pointer(&i))}; q := (*S)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f(unsafe.Pointer(q))`,
+ support: `type S26 struct { p *int; a [8*8]byte; u uintptr }`,
+ body: `i := 0; p := &S26{u:uintptr(unsafe.Pointer(&i))}; q := (*S26)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f26(unsafe.Pointer(q))`,
fail: false,
},
{
// Like ptrdata1, but with a type that uses a GC program.
name: "ptrdata2",
c: `#include <stdlib.h>
- void f(void* p) {}`,
+ void f27(void* p) {}`,
imports: []string{"unsafe"},
- support: `type S struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
- body: `i := 0; p := S{u:uintptr(unsafe.Pointer(&i))}; q := (*S)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f(unsafe.Pointer(q))`,
+ support: `type S27 struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
+ body: `i := 0; p := S27{u:uintptr(unsafe.Pointer(&i))}; q := (*S27)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f27(unsafe.Pointer(q))`,
fail: false,
},
{
// Check deferred pointers when they are used, not
// when the defer statement is run.
- name: "defer",
- c: `typedef struct s { int *p; } s; void f(s *ps) {}`,
- body: `p := &C.s{}; defer C.f(p); p.p = new(C.int)`,
+ name: "defer1",
+ c: `typedef struct s28 { int *p; } s28; void f28(s28 *ps) {}`,
+ body: `p := &C.s28{}; defer C.f28(p); p.p = new(C.int)`,
fail: true,
},
{
// Check a pointer to a union if the union has any
// pointer fields.
name: "union1",
- c: `typedef union { char **p; unsigned long i; } u; void f(u *pu) {}`,
+ c: `typedef union { char **p; unsigned long i; } u29; void f29(u29 *pu) {}`,
imports: []string{"unsafe"},
- body: `var b C.char; p := &b; C.f((*C.u)(unsafe.Pointer(&p)))`,
+ body: `var b C.char; p := &b; C.f29((*C.u29)(unsafe.Pointer(&p)))`,
fail: true,
},
{
@@ -336,55 +335,55 @@ var ptrTests = []ptrTest{
// integer that happens to have the same
// representation as a pointer.
name: "union2",
- c: `typedef union { unsigned long i; } u; void f(u *pu) {}`,
+ c: `typedef union { unsigned long i; } u39; void f39(u39 *pu) {}`,
imports: []string{"unsafe"},
- body: `var b C.char; p := &b; C.f((*C.u)(unsafe.Pointer(&p)))`,
+ body: `var b C.char; p := &b; C.f39((*C.u39)(unsafe.Pointer(&p)))`,
fail: false,
},
{
// Test preemption while entering a cgo call. Issue #21306.
- name: "preempt-during-call",
- c: `void f() {}`,
+ name: "preemptduringcall",
+ c: `void f30() {}`,
imports: []string{"runtime", "sync"},
- body: `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
+ body: `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f30(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
fail: false,
},
{
// Test poller deadline with cgocheck=2. Issue #23435.
name: "deadline",
- c: `#define US 10`,
+ c: `#define US31 10`,
imports: []string{"os", "time"},
- body: `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US * time.Microsecond))`,
+ body: `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US31 * time.Microsecond))`,
fail: false,
},
{
// Test for double evaluation of channel receive.
- name: "chan-recv",
- c: `void f(char** p) {}`,
+ name: "chanrecv",
+ c: `void f32(char** p) {}`,
imports: []string{"time"},
- body: `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f(&(<-c)[0]);`,
+ body: `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f32(&(<-c)[0]);`,
fail: false,
},
{
// Test that converting the address of a struct field
// to unsafe.Pointer still just checks that field.
// Issue #25941.
- name: "struct-field",
- c: `void f(void* p) {}`,
+ name: "structfield",
+ c: `void f33(void* p) {}`,
imports: []string{"unsafe"},
- support: `type S struct { p *int; a [8]byte; u uintptr }`,
- body: `s := &S{p: new(int)}; C.f(unsafe.Pointer(&s.a))`,
+ support: `type S33 struct { p *int; a [8]byte; u uintptr }`,
+ body: `s := &S33{p: new(int)}; C.f33(unsafe.Pointer(&s.a))`,
fail: false,
},
{
// Test that converting multiple struct field
// addresses to unsafe.Pointer still just checks those
// fields. Issue #25941.
- name: "struct-field-2",
- c: `void f(void* p, int r, void* s) {}`,
+ name: "structfield2",
+ c: `void f34(void* p, int r, void* s) {}`,
imports: []string{"unsafe"},
- support: `type S struct { a [8]byte; p *int; b int64; }`,
- body: `s := &S{p: new(int)}; C.f(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
+ support: `type S34 struct { a [8]byte; p *int; b int64; }`,
+ body: `s := &S34{p: new(int)}; C.f34(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
fail: false,
},
{
@@ -392,18 +391,18 @@ var ptrTests = []ptrTest{
// evaluated when a deferred function is deferred, not
// when it is run.
name: "defer2",
- c: `void f(char **pc) {}`,
- support: `type S1 struct { s []*C.char }; type S2 struct { ps *S1 }`,
- body: `p := &S2{&S1{[]*C.char{nil}}}; defer C.f(&p.ps.s[0]); p.ps = nil`,
+ c: `void f35(char **pc) {}`,
+ support: `type S35a struct { s []*C.char }; type S35b struct { ps *S35a }`,
+ body: `p := &S35b{&S35a{[]*C.char{nil}}}; defer C.f35(&p.ps.s[0]); p.ps = nil`,
fail: false,
},
{
// Test that indexing into a function call still
// examines only the slice being indexed.
name: "buffer",
- c: `void f(void *p) {}`,
+ c: `void f36(void *p) {}`,
imports: []string{"bytes", "unsafe"},
- body: `var b bytes.Buffer; b.WriteString("a"); C.f(unsafe.Pointer(&b.Bytes()[0]))`,
+ body: `var b bytes.Buffer; b.WriteString("a"); C.f36(unsafe.Pointer(&b.Bytes()[0]))`,
fail: false,
},
{
@@ -411,8 +410,8 @@ var ptrTests = []ptrTest{
name: "finalizer",
c: `// Nothing to declare.`,
imports: []string{"os"},
- support: `func open() { os.Open(os.Args[0]) }; var G [][]byte`,
- body: `for i := 0; i < 10000; i++ { G = append(G, make([]byte, 4096)); if i % 100 == 0 { G = nil; open() } }`,
+ support: `func open37() { os.Open(os.Args[0]) }; var G37 [][]byte`,
+ body: `for i := 0; i < 10000; i++ { G37 = append(G37, make([]byte, 4096)); if i % 100 == 0 { G37 = nil; open37() } }`,
fail: false,
},
{
@@ -420,98 +419,159 @@ var ptrTests = []ptrTest{
name: "structof",
c: `// Nothing to declare.`,
imports: []string{"reflect"},
- support: `type MyInt int; func (i MyInt) Get() int { return int(i) }; type Getter interface { Get() int }`,
- body: `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt", Type: reflect.TypeOf(MyInt(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter).Get()`,
+ support: `type MyInt38 int; func (i MyInt38) Get() int { return int(i) }; type Getter38 interface { Get() int }`,
+ body: `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt38", Type: reflect.TypeOf(MyInt38(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter38).Get()`,
fail: false,
},
}
func TestPointerChecks(t *testing.T) {
+ dir, exe := buildPtrTests(t)
+
+ // We (TestPointerChecks) return before the parallel subtest functions do,
+ // so we can't just defer os.RemoveAll(dir). Instead we have to wait for
+ // the parallel subtests to finish. This code looks racy but is not:
+ // the add +1 run in serial before testOne blocks. The -1 run in parallel
+ // after testOne finishes.
+ var pending int32
for _, pt := range ptrTests {
pt := pt
t.Run(pt.name, func(t *testing.T) {
- testOne(t, pt)
+ atomic.AddInt32(&pending, +1)
+ defer func() {
+ if atomic.AddInt32(&pending, -1) == 0 {
+ os.RemoveAll(dir)
+ }
+ }()
+ testOne(t, pt, exe)
})
}
}
-func testOne(t *testing.T, pt ptrTest) {
- t.Parallel()
-
- gopath, err := ioutil.TempDir("", filepath.Base(t.Name()))
- if err != nil {
- t.Fatal(err)
+func buildPtrTests(t *testing.T) (dir, exe string) {
+ var gopath string
+ if *tmp != "" {
+ gopath = *tmp
+ dir = ""
+ } else {
+ d, err := ioutil.TempDir("", filepath.Base(t.Name()))
+ if err != nil {
+ t.Fatal(err)
+ }
+ dir = d
+ gopath = d
}
- defer os.RemoveAll(gopath)
- src := filepath.Join(gopath, "src")
- if err := os.Mkdir(src, 0777); err != nil {
+ src := filepath.Join(gopath, "src", "ptrtest")
+ if err := os.MkdirAll(src, 0777); err != nil {
t.Fatal(err)
}
- name := filepath.Join(src, fmt.Sprintf("%s.go", filepath.Base(t.Name())))
- f, err := os.Create(name)
- if err != nil {
- t.Fatal(err)
- }
+ // Prepare two cgo inputs: one for standard cgo and one for //export cgo.
+ // (The latter cannot have C definitions, only declarations.)
+ var cgo1, cgo2 bytes.Buffer
+ fmt.Fprintf(&cgo1, "package main\n\n/*\n")
+ fmt.Fprintf(&cgo2, "package main\n\n/*\n")
- b := bufio.NewWriter(f)
- fmt.Fprintln(b, `package main`)
- fmt.Fprintln(b)
- fmt.Fprintln(b, `/*`)
- fmt.Fprintln(b, pt.c)
- fmt.Fprintln(b, `*/`)
- fmt.Fprintln(b, `import "C"`)
- fmt.Fprintln(b)
- for _, imp := range pt.imports {
- fmt.Fprintln(b, `import "`+imp+`"`)
- }
- if len(pt.imports) > 0 {
- fmt.Fprintln(b)
- }
- if len(pt.support) > 0 {
- fmt.Fprintln(b, pt.support)
- fmt.Fprintln(b)
+ // C code
+ for _, pt := range ptrTests {
+ cgo := &cgo1
+ if strings.Contains(pt.support, "//export") {
+ cgo = &cgo2
+ }
+ fmt.Fprintf(cgo, "%s\n", pt.c)
+ fmt.Fprintf(&cgo1, "%s\n", pt.c1)
}
- fmt.Fprintln(b, `func main() {`)
- fmt.Fprintln(b, pt.body)
- fmt.Fprintln(b, `}`)
+ fmt.Fprintf(&cgo1, "*/\nimport \"C\"\n\n")
+ fmt.Fprintf(&cgo2, "*/\nimport \"C\"\n\n")
- if err := b.Flush(); err != nil {
- t.Fatalf("flushing %s: %v", name, err)
- }
- if err := f.Close(); err != nil {
- t.Fatalf("closing %s: %v", name, err)
+ // Imports
+ did1 := make(map[string]bool)
+ did2 := make(map[string]bool)
+ did1["os"] = true // for ptrTestMain
+ fmt.Fprintf(&cgo1, "import \"os\"\n")
+
+ for _, pt := range ptrTests {
+ did := did1
+ cgo := &cgo1
+ if strings.Contains(pt.support, "//export") {
+ did = did2
+ cgo = &cgo2
+ }
+ for _, imp := range pt.imports {
+ if !did[imp] {
+ did[imp] = true
+ fmt.Fprintf(cgo, "import %q\n", imp)
+ }
+ }
}
- for _, e := range pt.extra {
- if err := ioutil.WriteFile(filepath.Join(src, e.name), []byte(e.contents), 0644); err != nil {
- t.Fatalf("writing %s: %v", e.name, err)
+ // Func support and bodies.
+ for _, pt := range ptrTests {
+ cgo := &cgo1
+ if strings.Contains(pt.support, "//export") {
+ cgo = &cgo2
}
+ fmt.Fprintf(cgo, "%s\nfunc %s() {\n%s\n}\n", pt.support, pt.name, pt.body)
}
- args := func(cmd *exec.Cmd) string {
- return strings.Join(cmd.Args, " ")
+ // Func list and main dispatch.
+ fmt.Fprintf(&cgo1, "var funcs = map[string]func() {\n")
+ for _, pt := range ptrTests {
+ fmt.Fprintf(&cgo1, "\t%q: %s,\n", pt.name, pt.name)
}
+ fmt.Fprintf(&cgo1, "}\n\n")
+ fmt.Fprintf(&cgo1, "%s\n", ptrTestMain)
- cmd := exec.Command("go", "build")
+ if err := ioutil.WriteFile(filepath.Join(src, "cgo1.go"), cgo1.Bytes(), 0666); err != nil {
+ t.Fatal(err)
+ }
+ if err := ioutil.WriteFile(filepath.Join(src, "cgo2.go"), cgo2.Bytes(), 0666); err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := exec.Command("go", "build", "-o", "ptrtest.exe")
cmd.Dir = src
cmd.Env = append(os.Environ(), "GOPATH="+gopath)
- buf, err := cmd.CombinedOutput()
+ out, err := cmd.CombinedOutput()
if err != nil {
- t.Logf("%#q:\n%s", args(cmd), buf)
- t.Fatalf("failed to build: %v", err)
+ t.Fatalf("go build: %v\n%s", err, out)
}
- exe := filepath.Join(src, filepath.Base(src))
- cmd = exec.Command(exe)
- cmd.Dir = src
+ return dir, filepath.Join(src, "ptrtest.exe")
+}
+
+const ptrTestMain = `
+func main() {
+ for _, arg := range os.Args[1:] {
+ f := funcs[arg]
+ if f == nil {
+ panic("missing func "+arg)
+ }
+ f()
+ }
+}
+`
+
+var csem = make(chan bool, 16)
+
+func testOne(t *testing.T, pt ptrTest, exe string) {
+ t.Parallel()
+
+ // Run the tests in parallel, but don't run too many
+ // executions in parallel, to avoid overloading the system.
+ runcmd := func(cgocheck string) ([]byte, error) {
+ csem <- true
+ defer func() { <-csem }()
+ cmd := exec.Command(exe, pt.name)
+ cmd.Env = append(os.Environ(), "GODEBUG=cgocheck="+cgocheck)
+ return cmd.CombinedOutput()
+ }
if pt.expensive {
- cmd.Env = cgocheckEnv("1")
- buf, err := cmd.CombinedOutput()
+ buf, err := runcmd("1")
if err != nil {
- t.Logf("%#q:\n%s", args(cmd), buf)
+ t.Logf("%s", buf)
if pt.fail {
t.Fatalf("test marked expensive, but failed when not expensive: %v", err)
} else {
@@ -519,54 +579,43 @@ func testOne(t *testing.T, pt ptrTest) {
}
}
- cmd = exec.Command(exe)
- cmd.Dir = src
}
+ cgocheck := ""
if pt.expensive {
- cmd.Env = cgocheckEnv("2")
+ cgocheck = "2"
}
- buf, err = cmd.CombinedOutput()
+ buf, err := runcmd(cgocheck)
if pt.fail {
if err == nil {
- t.Logf("%#q:\n%s", args(cmd), buf)
+ t.Logf("%s", buf)
t.Fatalf("did not fail as expected")
} else if !bytes.Contains(buf, []byte("Go pointer")) {
- t.Logf("%#q:\n%s", args(cmd), buf)
+ t.Logf("%s", buf)
t.Fatalf("did not print expected error (failed with %v)", err)
}
} else {
if err != nil {
- t.Logf("%#q:\n%s", args(cmd), buf)
+ t.Logf("%s", buf)
t.Fatalf("failed unexpectedly: %v", err)
}
if !pt.expensive {
// Make sure it passes with the expensive checks.
- cmd := exec.Command(exe)
- cmd.Dir = src
- cmd.Env = cgocheckEnv("2")
- buf, err := cmd.CombinedOutput()
+ buf, err := runcmd("2")
if err != nil {
- t.Logf("%#q:\n%s", args(cmd), buf)
+ t.Logf("%s", buf)
t.Fatalf("failed unexpectedly with expensive checks: %v", err)
}
}
}
if pt.fail {
- cmd = exec.Command(exe)
- cmd.Dir = src
- cmd.Env = cgocheckEnv("0")
- buf, err := cmd.CombinedOutput()
+ buf, err := runcmd("0")
if err != nil {
- t.Logf("%#q:\n%s", args(cmd), buf)
+ t.Logf("%s", buf)
t.Fatalf("failed unexpectedly with GODEBUG=cgocheck=0: %v", err)
}
}
}
-
-func cgocheckEnv(val string) []string {
- return append(os.Environ(), "GODEBUG=cgocheck="+val)
-}
diff --git a/libgo/misc/cgo/errors/src/err2.go b/libgo/misc/cgo/errors/src/err2.go
deleted file mode 100644
index 3ab410b..0000000
--- a/libgo/misc/cgo/errors/src/err2.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2013 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.
-
-package main
-
-import "C"
-
-func main() {
- s := ""
- _ = s
- C.malloc(s) // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/err3.go b/libgo/misc/cgo/errors/src/err3.go
deleted file mode 100644
index 609e1a0..0000000
--- a/libgo/misc/cgo/errors/src/err3.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 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.
-
-package main
-
-/*
-typedef struct foo foo_t;
-typedef struct bar bar_t;
-
-foo_t *foop;
-*/
-import "C"
-
-func main() {
- x := (*C.bar_t)(nil)
- C.foop = x // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue13129.go b/libgo/misc/cgo/errors/src/issue13129.go
deleted file mode 100644
index 057bce4..0000000
--- a/libgo/misc/cgo/errors/src/issue13129.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 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.
-
-// issue 13129: used to output error about C.unsignedshort with CC=clang
-
-package main
-
-import "C"
-
-func main() {
- var x C.ushort
- x = int(0) // ERROR HERE: C\.ushort
-}
diff --git a/libgo/misc/cgo/errors/src/issue13423.go b/libgo/misc/cgo/errors/src/issue13423.go
deleted file mode 100644
index fc19157..0000000
--- a/libgo/misc/cgo/errors/src/issue13423.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 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.
-
-package main
-
-// #include <stdio.h>
-import "C"
-
-func main() {
- _ = C.fopen() // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue13467.go b/libgo/misc/cgo/errors/src/issue13467.go
deleted file mode 100644
index e061880..0000000
--- a/libgo/misc/cgo/errors/src/issue13467.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 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.
-
-package p
-
-/*
-static int transform(int x) { return x; }
-*/
-import "C"
-
-func F() {
- var x rune = '✈'
- var _ rune = C.transform(x) // ERROR HERE: C\.int
-}
diff --git a/libgo/misc/cgo/errors/src/issue13635.go b/libgo/misc/cgo/errors/src/issue13635.go
deleted file mode 100644
index 3f38f5d..0000000
--- a/libgo/misc/cgo/errors/src/issue13635.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2015 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.
-
-// issue 13635: used to output error about C.unsignedchar.
-// This test tests all such types.
-
-package pkg
-
-import "C"
-
-func main() {
- var (
- _ C.uchar = "uc" // ERROR HERE: C\.uchar
- _ C.schar = "sc" // ERROR HERE: C\.schar
- _ C.ushort = "us" // ERROR HERE: C\.ushort
- _ C.uint = "ui" // ERROR HERE: C\.uint
- _ C.ulong = "ul" // ERROR HERE: C\.ulong
- _ C.longlong = "ll" // ERROR HERE: C\.longlong
- _ C.ulonglong = "ull" // ERROR HERE: C\.ulonglong
- _ C.complexfloat = "cf" // ERROR HERE: C\.complexfloat
- _ C.complexdouble = "cd" // ERROR HERE: C\.complexdouble
- )
-}
diff --git a/libgo/misc/cgo/errors/src/issue13830.go b/libgo/misc/cgo/errors/src/issue13830.go
deleted file mode 100644
index ac20c82..0000000
--- a/libgo/misc/cgo/errors/src/issue13830.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 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.
-
-// cgo converts C void* to Go unsafe.Pointer, so despite appearances C
-// void** is Go *unsafe.Pointer. This test verifies that we detect the
-// problem at build time.
-
-package main
-
-// typedef void v;
-// void F(v** p) {}
-import "C"
-
-import "unsafe"
-
-type v [0]byte
-
-func f(p **v) {
- C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
-}
-
-func main() {
- var p *v
- f(&p)
-}
diff --git a/libgo/misc/cgo/errors/src/issue16116.go b/libgo/misc/cgo/errors/src/issue16116.go
deleted file mode 100644
index 1e01cab..0000000
--- a/libgo/misc/cgo/errors/src/issue16116.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 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.
-
-package main
-
-// void f(void *p, int x) {}
-import "C"
-
-func main() {
- _ = C.f(1) // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue16591.go b/libgo/misc/cgo/errors/src/issue16591.go
deleted file mode 100644
index 10eb840..0000000
--- a/libgo/misc/cgo/errors/src/issue16591.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 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.
-
-// Issue 16591: Test that we detect an invalid call that was being
-// hidden by a type conversion inserted by cgo checking.
-
-package p
-
-// void f(int** p) { }
-import "C"
-
-type x *C.int
-
-func F(p *x) {
- C.f(p) // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue26745.go b/libgo/misc/cgo/errors/src/issue26745.go
deleted file mode 100644
index 0e22453..0000000
--- a/libgo/misc/cgo/errors/src/issue26745.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 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.
-
-package main
-
-// int a;
-// void CF(int i) {}
-import "C"
-
-func F1(i int) int {
- return C.a + 1 // ERROR HERE: :13
-}
-
-func F2(i int) {
- C.CF(i) // ERROR HERE: :6
-}
diff --git a/libgo/misc/cgo/errors/src/issue7757.go b/libgo/misc/cgo/errors/src/issue7757.go
deleted file mode 100644
index 0426e9f..0000000
--- a/libgo/misc/cgo/errors/src/issue7757.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 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.
-
-package main
-
-/*
-void foo() {}
-*/
-import "C"
-
-func main() {
- C.foo = C.foo // ERROR HERE
-}
diff --git a/libgo/misc/cgo/errors/src/issue8442.go b/libgo/misc/cgo/errors/src/issue8442.go
deleted file mode 100644
index 60477ad..0000000
--- a/libgo/misc/cgo/errors/src/issue8442.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 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.
-
-package main
-
-// Issue 8442. Cgo output unhelpful error messages for
-// invalid C preambles.
-
-/*
-void issue8442foo(UNDEF*); // ERROR HERE
-*/
-import "C"
-
-func main() {
- C.issue8442foo(nil)
-}
diff --git a/libgo/misc/cgo/errors/src/err1.go b/libgo/misc/cgo/errors/testdata/err1.go
index 2c232cf..ced7443 100644
--- a/libgo/misc/cgo/errors/src/err1.go
+++ b/libgo/misc/cgo/errors/testdata/err1.go
@@ -10,6 +10,10 @@ package main
void test() {
xxx; // ERROR HERE
}
+
+// Issue 8442. Cgo output unhelpful error messages for
+// invalid C preambles.
+void issue8442foo(UNDEF*); // ERROR HERE
*/
import "C"
diff --git a/libgo/misc/cgo/errors/testdata/err2.go b/libgo/misc/cgo/errors/testdata/err2.go
new file mode 100644
index 0000000..1d22401
--- /dev/null
+++ b/libgo/misc/cgo/errors/testdata/err2.go
@@ -0,0 +1,102 @@
+// Copyright 2013 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.
+
+package main
+
+/*
+#include <stdio.h>
+
+typedef struct foo foo_t;
+typedef struct bar bar_t;
+
+foo_t *foop;
+
+long double x = 0;
+
+static int transform(int x) { return x; }
+
+typedef void v;
+void F(v** p) {}
+
+void fvi(void *p, int x) {}
+
+void fppi(int** p) {}
+
+int i;
+void fi(int i) {}
+*/
+import "C"
+import (
+ "unsafe"
+)
+
+func main() {
+ s := ""
+ _ = s
+ C.malloc(s) // ERROR HERE
+
+ x := (*C.bar_t)(nil)
+ C.foop = x // ERROR HERE
+
+ // issue 13129: used to output error about C.unsignedshort with CC=clang
+ var x C.ushort
+ x = int(0) // ERROR HERE: C\.ushort
+
+ // issue 13423
+ _ = C.fopen() // ERROR HERE
+
+ // issue 13467
+ var x rune = '✈'
+ var _ rune = C.transform(x) // ERROR HERE: C\.int
+
+ // issue 13635: used to output error about C.unsignedchar.
+ // This test tests all such types.
+ var (
+ _ C.uchar = "uc" // ERROR HERE: C\.uchar
+ _ C.schar = "sc" // ERROR HERE: C\.schar
+ _ C.ushort = "us" // ERROR HERE: C\.ushort
+ _ C.uint = "ui" // ERROR HERE: C\.uint
+ _ C.ulong = "ul" // ERROR HERE: C\.ulong
+ _ C.longlong = "ll" // ERROR HERE: C\.longlong
+ _ C.ulonglong = "ull" // ERROR HERE: C\.ulonglong
+ _ C.complexfloat = "cf" // ERROR HERE: C\.complexfloat
+ _ C.complexdouble = "cd" // ERROR HERE: C\.complexdouble
+ )
+
+ // issue 13830
+ // cgo converts C void* to Go unsafe.Pointer, so despite appearances C
+ // void** is Go *unsafe.Pointer. This test verifies that we detect the
+ // problem at build time.
+ {
+ type v [0]byte
+
+ f := func(p **v) {
+ C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
+ }
+ var p *v
+ f(&p)
+ }
+
+ // issue 16116
+ _ = C.fvi(1) // ERROR HERE
+
+ // Issue 16591: Test that we detect an invalid call that was being
+ // hidden by a type conversion inserted by cgo checking.
+ {
+ type x *C.int
+ var p *x
+ C.fppi(p) // ERROR HERE
+ }
+
+ // issue 26745
+ _ = func(i int) int {
+ return C.i + 1 // ERROR HERE: :13
+ }
+ _ = func(i int) {
+ C.fi(i) // ERROR HERE: :6
+ }
+
+ C.fi = C.fi // ERROR HERE
+
+}
diff --git a/libgo/misc/cgo/errors/src/err4.go b/libgo/misc/cgo/errors/testdata/err4.go
index 8e5f78e..8e5f78e 100644
--- a/libgo/misc/cgo/errors/src/err4.go
+++ b/libgo/misc/cgo/errors/testdata/err4.go
diff --git a/libgo/misc/cgo/errors/src/issue11097a.go b/libgo/misc/cgo/errors/testdata/issue11097a.go
index 028d10c..028d10c 100644
--- a/libgo/misc/cgo/errors/src/issue11097a.go
+++ b/libgo/misc/cgo/errors/testdata/issue11097a.go
diff --git a/libgo/misc/cgo/errors/src/issue11097b.go b/libgo/misc/cgo/errors/testdata/issue11097b.go
index b00f24f..b00f24f 100644
--- a/libgo/misc/cgo/errors/src/issue11097b.go
+++ b/libgo/misc/cgo/errors/testdata/issue11097b.go
diff --git a/libgo/misc/cgo/errors/src/issue14669.go b/libgo/misc/cgo/errors/testdata/issue14669.go
index 04d2bcb..04d2bcb 100644
--- a/libgo/misc/cgo/errors/src/issue14669.go
+++ b/libgo/misc/cgo/errors/testdata/issue14669.go
diff --git a/libgo/misc/cgo/errors/src/issue18452.go b/libgo/misc/cgo/errors/testdata/issue18452.go
index 0386d76..0386d76 100644
--- a/libgo/misc/cgo/errors/src/issue18452.go
+++ b/libgo/misc/cgo/errors/testdata/issue18452.go
diff --git a/libgo/misc/cgo/errors/src/issue18889.go b/libgo/misc/cgo/errors/testdata/issue18889.go
index bba6b8f..bba6b8f 100644
--- a/libgo/misc/cgo/errors/src/issue18889.go
+++ b/libgo/misc/cgo/errors/testdata/issue18889.go
diff --git a/libgo/misc/cgo/errors/src/issue28069.go b/libgo/misc/cgo/errors/testdata/issue28069.go
index e19a3b4..e19a3b4 100644
--- a/libgo/misc/cgo/errors/src/issue28069.go
+++ b/libgo/misc/cgo/errors/testdata/issue28069.go
diff --git a/libgo/misc/cgo/errors/src/issue28721.go b/libgo/misc/cgo/errors/testdata/issue28721.go
index 0eb2a92..0eb2a92 100644
--- a/libgo/misc/cgo/errors/src/issue28721.go
+++ b/libgo/misc/cgo/errors/testdata/issue28721.go
diff --git a/libgo/misc/cgo/errors/src/long_double_size.go b/libgo/misc/cgo/errors/testdata/long_double_size.go
index 8b797f8..8b797f8 100644
--- a/libgo/misc/cgo/errors/src/long_double_size.go
+++ b/libgo/misc/cgo/errors/testdata/long_double_size.go
diff --git a/libgo/misc/cgo/errors/src/malloc.go b/libgo/misc/cgo/errors/testdata/malloc.go
index 65da0208..65da0208 100644
--- a/libgo/misc/cgo/errors/src/malloc.go
+++ b/libgo/misc/cgo/errors/testdata/malloc.go
diff --git a/libgo/misc/cgo/fortran/test.bash b/libgo/misc/cgo/fortran/test.bash
index 1e0d59e..9498da0 100644
--- a/libgo/misc/cgo/fortran/test.bash
+++ b/libgo/misc/cgo/fortran/test.bash
@@ -14,12 +14,17 @@ goos=$(go env GOOS)
libext="so"
if [ "$goos" = "darwin" ]; then
libext="dylib"
+elif [ "$goos" = "aix" ]; then
+ libtext="a"
fi
case "$FC" in
*gfortran*)
libpath=$(dirname $($FC -print-file-name=libgfortran.$libext))
- export CGO_LDFLAGS="$CGO_LDFLAGS -Wl,-rpath,$libpath -L $libpath"
+ if [ "$goos" != "aix" ]; then
+ RPATH_FLAG="-Wl,-rpath,$libpath"
+ fi
+ export CGO_LDFLAGS="$CGO_LDFLAGS $RPATH_FLAG -L $libpath"
;;
esac
diff --git a/libgo/misc/cgo/life/life_test.go b/libgo/misc/cgo/life/life_test.go
new file mode 100644
index 0000000..3c95d87
--- /dev/null
+++ b/libgo/misc/cgo/life/life_test.go
@@ -0,0 +1,64 @@
+// Copyright 2019 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.
+
+package life_test
+
+import (
+ "bytes"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "testing"
+)
+
+func TestMain(m *testing.M) {
+ log.SetFlags(log.Lshortfile)
+ os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+ GOPATH, err := ioutil.TempDir("", "cgolife")
+ if err != nil {
+ log.Panic(err)
+ }
+ defer os.RemoveAll(GOPATH)
+ os.Setenv("GOPATH", GOPATH)
+
+ // Copy testdata into GOPATH/src/cgolife, along with a go.mod file
+ // declaring the same path.
+ modRoot := filepath.Join(GOPATH, "src", "cgolife")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ log.Panic(err)
+ }
+ if err := os.Chdir(modRoot); err != nil {
+ log.Panic(err)
+ }
+ os.Setenv("PWD", modRoot)
+ if err := ioutil.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil {
+ log.Panic(err)
+ }
+
+ return m.Run()
+}
+
+func TestTestRun(t *testing.T) {
+ if os.Getenv("GOOS") == "android" {
+ t.Skip("the go tool runs with CGO_ENABLED=0 on the android device")
+ }
+ out, err := exec.Command("go", "env", "GOROOT").Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ GOROOT := string(bytes.TrimSpace(out))
+
+ cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/life/overlaydir_test.go b/libgo/misc/cgo/life/overlaydir_test.go
new file mode 100644
index 0000000..f381ea6
--- /dev/null
+++ b/libgo/misc/cgo/life/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package life_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/life/c-life.c b/libgo/misc/cgo/life/testdata/c-life.c
index f853163..f853163 100644
--- a/libgo/misc/cgo/life/c-life.c
+++ b/libgo/misc/cgo/life/testdata/c-life.c
diff --git a/libgo/misc/cgo/life/life.go b/libgo/misc/cgo/life/testdata/life.go
index 170a620..2e0af81 100644
--- a/libgo/misc/cgo/life/life.go
+++ b/libgo/misc/cgo/life/testdata/life.go
@@ -4,7 +4,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-package life
+package cgolife
// #include "life.h"
import "C"
diff --git a/libgo/misc/cgo/life/life.h b/libgo/misc/cgo/life/testdata/life.h
index 11d2b97..11d2b97 100644
--- a/libgo/misc/cgo/life/life.h
+++ b/libgo/misc/cgo/life/testdata/life.h
diff --git a/libgo/misc/cgo/life/main.go b/libgo/misc/cgo/life/testdata/main.go
index 145a273b..cc2ca7c 100644
--- a/libgo/misc/cgo/life/main.go
+++ b/libgo/misc/cgo/life/testdata/main.go
@@ -14,7 +14,7 @@ import (
"flag"
"fmt"
- "."
+ "cgolife"
)
const MAXDIM = 100
@@ -34,7 +34,7 @@ func main() {
}
}
- life.Run(*gen, *dim, *dim, a[:])
+ cgolife.Run(*gen, *dim, *dim, a[:])
for i := 0; i < *dim; i++ {
for j := 0; j < *dim; j++ {
diff --git a/libgo/misc/cgo/life/main.out b/libgo/misc/cgo/life/testdata/main.out
index 26fc9c6..26fc9c6 100644
--- a/libgo/misc/cgo/life/main.out
+++ b/libgo/misc/cgo/life/testdata/main.out
diff --git a/libgo/misc/cgo/stdio/overlaydir_test.go b/libgo/misc/cgo/stdio/overlaydir_test.go
new file mode 100644
index 0000000..8a8dcdb
--- /dev/null
+++ b/libgo/misc/cgo/stdio/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package stdio_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/stdio/stdio_test.go b/libgo/misc/cgo/stdio/stdio_test.go
new file mode 100644
index 0000000..ab5d328
--- /dev/null
+++ b/libgo/misc/cgo/stdio/stdio_test.go
@@ -0,0 +1,64 @@
+// Copyright 2019 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.
+
+package stdio_test
+
+import (
+ "bytes"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "testing"
+)
+
+func TestMain(m *testing.M) {
+ log.SetFlags(log.Lshortfile)
+ os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+ GOPATH, err := ioutil.TempDir("", "cgostdio")
+ if err != nil {
+ log.Panic(err)
+ }
+ defer os.RemoveAll(GOPATH)
+ os.Setenv("GOPATH", GOPATH)
+
+ // Copy testdata into GOPATH/src/cgostdio, along with a go.mod file
+ // declaring the same path.
+ modRoot := filepath.Join(GOPATH, "src", "cgostdio")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ log.Panic(err)
+ }
+ if err := os.Chdir(modRoot); err != nil {
+ log.Panic(err)
+ }
+ os.Setenv("PWD", modRoot)
+ if err := ioutil.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil {
+ log.Panic(err)
+ }
+
+ return m.Run()
+}
+
+func TestTestRun(t *testing.T) {
+ if os.Getenv("GOOS") == "android" {
+ t.Skip("subpackage stdio is not available on android")
+ }
+ out, err := exec.Command("go", "env", "GOROOT").Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ GOROOT := string(bytes.TrimSpace(out))
+
+ cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".")
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/stdio/chain.go b/libgo/misc/cgo/stdio/testdata/chain.go
index cdc3852..6c3f406 100644
--- a/libgo/misc/cgo/stdio/chain.go
+++ b/libgo/misc/cgo/stdio/testdata/chain.go
@@ -14,7 +14,7 @@ import (
"runtime"
"strconv"
- "../stdio"
+ "cgostdio/stdio"
)
const N = 10
diff --git a/libgo/misc/cgo/stdio/chain.out b/libgo/misc/cgo/stdio/testdata/chain.out
index 963cf9b..963cf9b 100644
--- a/libgo/misc/cgo/stdio/chain.out
+++ b/libgo/misc/cgo/stdio/testdata/chain.out
diff --git a/libgo/misc/cgo/stdio/fib.go b/libgo/misc/cgo/stdio/testdata/fib.go
index 58f185c..49cb0ea 100644
--- a/libgo/misc/cgo/stdio/fib.go
+++ b/libgo/misc/cgo/stdio/testdata/fib.go
@@ -17,7 +17,7 @@ import (
"runtime"
"strconv"
- "../stdio"
+ "cgostdio/stdio"
)
func fibber(c, out chan int64, i int64) {
diff --git a/libgo/misc/cgo/stdio/fib.out b/libgo/misc/cgo/stdio/testdata/fib.out
index 17ff503..17ff503 100644
--- a/libgo/misc/cgo/stdio/fib.out
+++ b/libgo/misc/cgo/stdio/testdata/fib.out
diff --git a/libgo/misc/cgo/stdio/hello.go b/libgo/misc/cgo/stdio/testdata/hello.go
index 56220d3..046bfee 100644
--- a/libgo/misc/cgo/stdio/hello.go
+++ b/libgo/misc/cgo/stdio/testdata/hello.go
@@ -8,7 +8,7 @@
package main
-import "../stdio"
+import "cgostdio/stdio"
func main() {
stdio.Stdout.WriteString(stdio.Greeting + "\n")
diff --git a/libgo/misc/cgo/stdio/hello.out b/libgo/misc/cgo/stdio/testdata/hello.out
index 4b5fa63..4b5fa63 100644
--- a/libgo/misc/cgo/stdio/hello.out
+++ b/libgo/misc/cgo/stdio/testdata/hello.out
diff --git a/libgo/misc/cgo/stdio/run.out b/libgo/misc/cgo/stdio/testdata/run.out
index c0e4965..c0e4965 100644
--- a/libgo/misc/cgo/stdio/run.out
+++ b/libgo/misc/cgo/stdio/testdata/run.out
diff --git a/libgo/misc/cgo/stdio/file.go b/libgo/misc/cgo/stdio/testdata/stdio/file.go
index a024f2c..a024f2c 100644
--- a/libgo/misc/cgo/stdio/file.go
+++ b/libgo/misc/cgo/stdio/testdata/stdio/file.go
diff --git a/libgo/misc/cgo/stdio/stdio.go b/libgo/misc/cgo/stdio/testdata/stdio/stdio.go
index d216e44..d216e44 100644
--- a/libgo/misc/cgo/stdio/stdio.go
+++ b/libgo/misc/cgo/stdio/testdata/stdio/stdio.go
diff --git a/libgo/misc/cgo/test/align.go b/libgo/misc/cgo/test/align.go
deleted file mode 100644
index a23b44f..0000000
--- a/libgo/misc/cgo/test/align.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2010 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.
-
-package cgotest
-
-/*
-#include <stdio.h>
-
-typedef unsigned char Uint8;
-typedef unsigned short Uint16;
-
-typedef enum {
- MOD1 = 0x0000,
- MODX = 0x8000
-} SDLMod;
-
-typedef enum {
- A = 1,
- B = 322,
- SDLK_LAST
-} SDLKey;
-
-typedef struct SDL_keysym {
- Uint8 scancode;
- SDLKey sym;
- SDLMod mod;
- Uint16 unicode;
-} SDL_keysym;
-
-typedef struct SDL_KeyboardEvent {
- Uint8 typ;
- Uint8 which;
- Uint8 state;
- SDL_keysym keysym;
-} SDL_KeyboardEvent;
-
-void makeEvent(SDL_KeyboardEvent *event) {
- unsigned char *p;
- int i;
-
- p = (unsigned char*)event;
- for (i=0; i<sizeof *event; i++) {
- p[i] = i;
- }
-}
-
-int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
- return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
-}
-
-void cTest(SDL_KeyboardEvent *event) {
- printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
- event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
- fflush(stdout);
-}
-
-*/
-import "C"
-
-import (
- "testing"
-)
-
-func testAlign(t *testing.T) {
- var evt C.SDL_KeyboardEvent
- C.makeEvent(&evt)
- if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
- t.Error("*** bad alignment")
- C.cTest(&evt)
- t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
- evt.typ, evt.which, evt.state, evt.keysym.scancode,
- evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
- t.Error(evt)
- }
-}
diff --git a/libgo/misc/cgo/test/api.go b/libgo/misc/cgo/test/api.go
deleted file mode 100644
index d2b09cb..0000000
--- a/libgo/misc/cgo/test/api.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2013 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.
-
-// API Compatibility Checks for cgo
-
-package cgotest
-
-// #include <stdlib.h>
-//
-// // Test for issue 17723.
-// typedef char *cstring_pointer;
-// static void cstring_pointer_fun(cstring_pointer dummy) { }
-//
-// const char *api_hello = "hello!";
-import "C"
-import "unsafe"
-
-func testAPI() {
- var cs *C.char
- cs = C.CString("hello")
- defer C.free(unsafe.Pointer(cs))
- var s string
- s = C.GoString((*C.char)(C.api_hello))
- s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
- var b []byte
- b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
- _, _ = s, b
- C.cstring_pointer_fun(nil)
-}
diff --git a/libgo/misc/cgo/test/basic.go b/libgo/misc/cgo/test/basic.go
deleted file mode 100644
index 2655a66..0000000
--- a/libgo/misc/cgo/test/basic.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2010 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.
-
-// Basic test cases for cgo.
-
-package cgotest
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#define SHIFT(x, y) ((x)<<(y))
-#define KILO SHIFT(1, 10)
-#define UINT32VAL 0xc008427bU
-
-enum E {
- Enum1 = 1,
- Enum2 = 2,
-};
-
-typedef unsigned char cgo_uuid_t[20];
-
-void uuid_generate(cgo_uuid_t x) {
- x[0] = 0;
-}
-
-struct S {
- int x;
-};
-
-const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-
-extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
-
-enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
-
-// issue 1222
-typedef union {
- long align;
-} xxpthread_mutex_t;
-
-struct ibv_async_event {
- union {
- int x;
- } element;
-};
-
-struct ibv_context {
- xxpthread_mutex_t mutex;
-};
-
-int add(int x, int y) {
- return x+y;
-};
-*/
-import "C"
-import (
- "runtime"
- "syscall"
- "testing"
- "unsafe"
-)
-
-const EINVAL = C.EINVAL /* test #define */
-
-var KILO = C.KILO
-
-func uuidgen() {
- var uuid C.cgo_uuid_t
- C.uuid_generate(&uuid[0])
-}
-
-func Strtol(s string, base int) (int, error) {
- p := C.CString(s)
- n, err := C.strtol(p, nil, C.int(base))
- C.free(unsafe.Pointer(p))
- return int(n), err
-}
-
-func Atol(s string) int {
- p := C.CString(s)
- n := C.atol(p)
- C.free(unsafe.Pointer(p))
- return int(n)
-}
-
-func testConst(t *testing.T) {
- C.myConstFunc(nil, 0, nil)
-}
-
-func testEnum(t *testing.T) {
- if C.Enum1 != 1 || C.Enum2 != 2 {
- t.Error("bad enum", C.Enum1, C.Enum2)
- }
-}
-
-func testAtol(t *testing.T) {
- l := Atol("123")
- if l != 123 {
- t.Error("Atol 123: ", l)
- }
-}
-
-func testErrno(t *testing.T) {
- p := C.CString("no-such-file")
- m := C.CString("r")
- f, err := C.fopen(p, m)
- C.free(unsafe.Pointer(p))
- C.free(unsafe.Pointer(m))
- if err == nil {
- C.fclose(f)
- t.Fatalf("C.fopen: should fail")
- }
- if err != syscall.ENOENT {
- t.Fatalf("C.fopen: unexpected error: %v", err)
- }
-}
-
-func testMultipleAssign(t *testing.T) {
- p := C.CString("234")
- n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
- if runtime.GOOS == "openbsd" {
- // Bug in OpenBSD strtol(3) - base > 36 succeeds.
- if (n != 0 && n != 239089) || m != 234 {
- t.Fatal("Strtol x2: ", n, m)
- }
- } else if n != 0 || m != 234 {
- t.Fatal("Strtol x2: ", n, m)
- }
- C.free(unsafe.Pointer(p))
-}
-
-var (
- cuint = (C.uint)(0)
- culong C.ulong
- cchar C.char
-)
-
-type Context struct {
- ctx *C.struct_ibv_context
-}
-
-func benchCgoCall(b *testing.B) {
- const x = C.int(2)
- const y = C.int(3)
- for i := 0; i < b.N; i++ {
- C.add(x, y)
- }
-}
-
-var sinkString string
-
-func benchGoString(b *testing.B) {
- for i := 0; i < b.N; i++ {
- sinkString = C.GoString(C.cstr)
- }
- const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
- if sinkString != want {
- b.Fatalf("%q != %q", sinkString, want)
- }
-}
-
-// Issue 2470.
-func testUnsignedInt(t *testing.T) {
- a := (int64)(C.UINT32VAL)
- b := (int64)(0xc008427b)
- if a != b {
- t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
- }
-}
-
-// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
-func sliceOperands(array [2000]int) {
- _ = array[C.KILO:C.KILO:C.KILO] // no type error
-}
-
-// set in cgo_thread_lock.go init
-var testThreadLockFunc = func(*testing.T) {}
diff --git a/libgo/misc/cgo/test/callback.go b/libgo/misc/cgo/test/callback.go
index 4fc6b39..e749650 100644
--- a/libgo/misc/cgo/test/callback.go
+++ b/libgo/misc/cgo/test/callback.go
@@ -199,7 +199,7 @@ func testCallbackCallers(t *testing.T) {
t.Errorf("expected %d frames, got %d", len(name), n)
}
for i := 0; i < n; i++ {
- f := runtime.FuncForPC(pc[i])
+ f := runtime.FuncForPC(pc[i] - 1) // TODO: use runtime.CallersFrames
if f == nil {
t.Fatalf("expected non-nil Func for pc %d", pc[i])
}
@@ -209,6 +209,10 @@ func testCallbackCallers(t *testing.T) {
if strings.HasPrefix(fname, "_") {
fname = path.Base(f.Name()[1:])
}
+ // In module mode, this package has a fully-qualified import path.
+ // Remove it if present.
+ fname = strings.TrimPrefix(fname, "misc/cgo/")
+
namei := ""
if i < len(name) {
namei = name[i]
diff --git a/libgo/misc/cgo/test/cflags.go b/libgo/misc/cgo/test/cflags.go
deleted file mode 100644
index bc290bf..0000000
--- a/libgo/misc/cgo/test/cflags.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 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.
-
-// Test that the #cgo CFLAGS directive works,
-// with and without platform filters.
-// See https://golang.org/issue/5224 for details.
-package cgotest
-
-/*
-#cgo CFLAGS: -DCOMMON_VALUE=123
-#cgo windows CFLAGS: -DIS_WINDOWS=1
-#cgo !windows CFLAGS: -DIS_WINDOWS=0
-int common = COMMON_VALUE;
-int is_windows = IS_WINDOWS;
-*/
-import "C"
-
-import (
- "runtime"
- "testing"
-)
-
-func testCflags(t *testing.T) {
- is_windows := C.is_windows == 1
- if is_windows != (runtime.GOOS == "windows") {
- t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
- }
- if C.common != 123 {
- t.Errorf("common: %v (expected 123)", C.common)
- }
-}
diff --git a/libgo/misc/cgo/test/cgo_linux_test.go b/libgo/misc/cgo/test/cgo_linux_test.go
index 9c15f69..7b56e11 100644
--- a/libgo/misc/cgo/test/cgo_linux_test.go
+++ b/libgo/misc/cgo/test/cgo_linux_test.go
@@ -4,9 +4,16 @@
package cgotest
-import "testing"
+import (
+ "runtime"
+ "testing"
+)
-func TestSetgid(t *testing.T) { testSetgid(t) }
+func TestSetgid(t *testing.T) {
+ if runtime.GOOS == "android" {
+ t.Skip("unsupported on Android")
+ }
+ testSetgid(t)
+}
func Test6997(t *testing.T) { test6997(t) }
func TestBuildID(t *testing.T) { testBuildID(t) }
-func Test9400(t *testing.T) { test9400(t) }
diff --git a/libgo/misc/cgo/test/cgo_stubs_android_test.go b/libgo/misc/cgo/test/cgo_stubs_android_test.go
index 710e094..a1c2482 100644
--- a/libgo/misc/cgo/test/cgo_stubs_android_test.go
+++ b/libgo/misc/cgo/test/cgo_stubs_android_test.go
@@ -8,6 +8,5 @@ import "testing"
// Stubs for tests that fails to build on Android
func test6997(t *testing.T) {}
-func test3775(t *testing.T) {}
func test8694(t *testing.T) {}
func testSigaltstack(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/cgo_test.go b/libgo/misc/cgo/test/cgo_test.go
index 2cb93d9..c66df2c 100644
--- a/libgo/misc/cgo/test/cgo_test.go
+++ b/libgo/misc/cgo/test/cgo_test.go
@@ -10,91 +10,86 @@ import "testing"
// so that they can use cgo (import "C").
// These wrappers are here for gotest to find.
-func TestAlign(t *testing.T) { testAlign(t) }
-func TestConst(t *testing.T) { testConst(t) }
-func TestEnum(t *testing.T) { testEnum(t) }
-func TestAtol(t *testing.T) { testAtol(t) }
-func TestErrno(t *testing.T) { testErrno(t) }
-func TestMultipleAssign(t *testing.T) { testMultipleAssign(t) }
-func TestUnsignedInt(t *testing.T) { testUnsignedInt(t) }
-func TestCallback(t *testing.T) { testCallback(t) }
-func TestCallbackGC(t *testing.T) { testCallbackGC(t) }
-func TestCallbackPanic(t *testing.T) { testCallbackPanic(t) }
-func TestCallbackPanicLoop(t *testing.T) { testCallbackPanicLoop(t) }
-func TestCallbackPanicLocked(t *testing.T) { testCallbackPanicLocked(t) }
-func TestPanicFromC(t *testing.T) { testPanicFromC(t) }
-func TestZeroArgCallback(t *testing.T) { testZeroArgCallback(t) }
-func TestBlocking(t *testing.T) { testBlocking(t) }
func Test1328(t *testing.T) { test1328(t) }
-func TestParallelSleep(t *testing.T) { testParallelSleep(t) }
-func TestSetEnv(t *testing.T) { testSetEnv(t) }
-func TestHelpers(t *testing.T) { testHelpers(t) }
-func TestLibgcc(t *testing.T) { testLibgcc(t) }
func Test1635(t *testing.T) { test1635(t) }
-func TestPrintf(t *testing.T) { testPrintf(t) }
-func Test4029(t *testing.T) { test4029(t) }
-func TestBoolAlign(t *testing.T) { testBoolAlign(t) }
+func Test3250(t *testing.T) { test3250(t) }
func Test3729(t *testing.T) { test3729(t) }
func Test3775(t *testing.T) { test3775(t) }
-func TestCthread(t *testing.T) { testCthread(t) }
-func TestCallbackCallers(t *testing.T) { testCallbackCallers(t) }
+func Test4029(t *testing.T) { test4029(t) }
+func Test4339(t *testing.T) { test4339(t) }
func Test5227(t *testing.T) { test5227(t) }
-func TestCflags(t *testing.T) { testCflags(t) }
+func Test5242(t *testing.T) { test5242(t) }
func Test5337(t *testing.T) { test5337(t) }
func Test5548(t *testing.T) { test5548(t) }
func Test5603(t *testing.T) { test5603(t) }
-func Test6833(t *testing.T) { test6833(t) }
-func Test3250(t *testing.T) { test3250(t) }
-func TestCallbackStack(t *testing.T) { testCallbackStack(t) }
-func TestFpVar(t *testing.T) { testFpVar(t) }
-func Test4339(t *testing.T) { test4339(t) }
-func Test6390(t *testing.T) { test6390(t) }
func Test5986(t *testing.T) { test5986(t) }
-func Test7665(t *testing.T) { test7665(t) }
-func TestNaming(t *testing.T) { testNaming(t) }
+func Test6390(t *testing.T) { test6390(t) }
+func Test6833(t *testing.T) { test6833(t) }
+func Test6907(t *testing.T) { test6907(t) }
+func Test6907Go(t *testing.T) { test6907Go(t) }
func Test7560(t *testing.T) { test7560(t) }
-func Test5242(t *testing.T) { test5242(t) }
-func Test8092(t *testing.T) { test8092(t) }
+func Test7665(t *testing.T) { test7665(t) }
func Test7978(t *testing.T) { test7978(t) }
-func Test8694(t *testing.T) { test8694(t) }
+func Test8092(t *testing.T) { test8092(t) }
func Test8517(t *testing.T) { test8517(t) }
+func Test8694(t *testing.T) { test8694(t) }
func Test8811(t *testing.T) { test8811(t) }
-func TestReturnAfterGrow(t *testing.T) { testReturnAfterGrow(t) }
-func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
-func Test9026(t *testing.T) { test9026(t) }
-func Test9510(t *testing.T) { test9510(t) }
func Test9557(t *testing.T) { test9557(t) }
func Test10303(t *testing.T) { test10303(t, 10) }
func Test11925(t *testing.T) { test11925(t) }
func Test12030(t *testing.T) { test12030(t) }
-func TestGCC68255(t *testing.T) { testGCC68255(t) }
-func TestCallGoWithString(t *testing.T) { testCallGoWithString(t) }
func Test14838(t *testing.T) { test14838(t) }
-func Test8756(t *testing.T) { test8756(t) }
func Test17065(t *testing.T) { test17065(t) }
-func TestThreadLock(t *testing.T) { testThreadLockFunc(t) }
-func TestCheckConst(t *testing.T) { testCheckConst(t) }
func Test17537(t *testing.T) { test17537(t) }
func Test18126(t *testing.T) { test18126(t) }
-func Test20369(t *testing.T) { test20369(t) }
func Test18720(t *testing.T) { test18720(t) }
-func Test20266(t *testing.T) { test20266(t) }
func Test20129(t *testing.T) { test20129(t) }
+func Test20369(t *testing.T) { test20369(t) }
func Test20910(t *testing.T) { test20910(t) }
func Test21708(t *testing.T) { test21708(t) }
func Test21809(t *testing.T) { test21809(t) }
-func Test6907(t *testing.T) { test6907(t) }
-func Test6907Go(t *testing.T) { test6907Go(t) }
func Test21897(t *testing.T) { test21897(t) }
func Test22906(t *testing.T) { test22906(t) }
+func Test23356(t *testing.T) { test23356(t) }
func Test24206(t *testing.T) { test24206(t) }
func Test25143(t *testing.T) { test25143(t) }
-func Test23356(t *testing.T) { test23356(t) }
func Test26066(t *testing.T) { test26066(t) }
-func Test26213(t *testing.T) { test26213(t) }
func Test27660(t *testing.T) { test27660(t) }
func Test28896(t *testing.T) { test28896(t) }
func Test30065(t *testing.T) { test30065(t) }
+func Test32579(t *testing.T) { test32579(t) }
+func TestAlign(t *testing.T) { testAlign(t) }
+func TestAtol(t *testing.T) { testAtol(t) }
+func TestBlocking(t *testing.T) { testBlocking(t) }
+func TestBoolAlign(t *testing.T) { testBoolAlign(t) }
+func TestCallGoWithString(t *testing.T) { testCallGoWithString(t) }
+func TestCallback(t *testing.T) { testCallback(t) }
+func TestCallbackCallers(t *testing.T) { testCallbackCallers(t) }
+func TestCallbackGC(t *testing.T) { testCallbackGC(t) }
+func TestCallbackPanic(t *testing.T) { testCallbackPanic(t) }
+func TestCallbackPanicLocked(t *testing.T) { testCallbackPanicLocked(t) }
+func TestCallbackPanicLoop(t *testing.T) { testCallbackPanicLoop(t) }
+func TestCallbackStack(t *testing.T) { testCallbackStack(t) }
+func TestCflags(t *testing.T) { testCflags(t) }
+func TestCheckConst(t *testing.T) { testCheckConst(t) }
+func TestConst(t *testing.T) { testConst(t) }
+func TestCthread(t *testing.T) { testCthread(t) }
+func TestEnum(t *testing.T) { testEnum(t) }
+func TestErrno(t *testing.T) { testErrno(t) }
+func TestFpVar(t *testing.T) { testFpVar(t) }
+func TestHelpers(t *testing.T) { testHelpers(t) }
+func TestLibgcc(t *testing.T) { testLibgcc(t) }
+func TestMultipleAssign(t *testing.T) { testMultipleAssign(t) }
+func TestNaming(t *testing.T) { testNaming(t) }
+func TestPanicFromC(t *testing.T) { testPanicFromC(t) }
+func TestParallelSleep(t *testing.T) { testParallelSleep(t) }
+func TestPrintf(t *testing.T) { testPrintf(t) }
+func TestReturnAfterGrow(t *testing.T) { testReturnAfterGrow(t) }
+func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
+func TestSetEnv(t *testing.T) { testSetEnv(t) }
+func TestThreadLock(t *testing.T) { testThreadLockFunc(t) }
+func TestUnsignedInt(t *testing.T) { testUnsignedInt(t) }
+func TestZeroArgCallback(t *testing.T) { testZeroArgCallback(t) }
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
func BenchmarkGoString(b *testing.B) { benchGoString(b) }
diff --git a/libgo/misc/cgo/test/checkconst.go b/libgo/misc/cgo/test/checkconst.go
deleted file mode 100644
index 0160c1e..0000000
--- a/libgo/misc/cgo/test/checkconst.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 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.
-
-// Test a constant in conjunction with pointer checking.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-#define CheckConstVal 0
-
-typedef struct {
- int *p;
-} CheckConstStruct;
-
-static void CheckConstFunc(CheckConstStruct *p, int e) {
-}
-*/
-import "C"
-
-import (
- "testing"
- "unsafe"
-)
-
-func testCheckConst(t *testing.T) {
- // The test is that this compiles successfully.
- p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
- defer C.free(p)
- C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
-}
diff --git a/libgo/misc/cgo/test/complex.go b/libgo/misc/cgo/test/complex.go
deleted file mode 100644
index ca0a97d..0000000
--- a/libgo/misc/cgo/test/complex.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 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.
-
-package cgotest
-
-/*
-struct {
- float x;
- _Complex float y;
-} cplxAlign = { 3.14, 2.17 };
-*/
-import "C"
-
-import "testing"
-
-func TestComplexAlign(t *testing.T) {
- if C.cplxAlign.x != 3.14 {
- t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
- }
- if C.cplxAlign.y != 2.17 {
- t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
- }
-}
diff --git a/libgo/misc/cgo/test/cthread.go b/libgo/misc/cgo/test/cthread.go
deleted file mode 100644
index af44911..0000000
--- a/libgo/misc/cgo/test/cthread.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-// extern void doAdd(int, int);
-import "C"
-
-import (
- "runtime"
- "sync"
- "testing"
-)
-
-var sum struct {
- sync.Mutex
- i int
-}
-
-//export Add
-func Add(x int) {
- defer func() {
- recover()
- }()
- sum.Lock()
- sum.i += x
- sum.Unlock()
- var p *int
- *p = 2
-}
-
-func testCthread(t *testing.T) {
- if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
- t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
- }
- sum.i = 0
- C.doAdd(10, 6)
-
- want := 10 * (10 - 1) / 2 * 6
- if sum.i != want {
- t.Fatalf("sum=%d, want %d", sum.i, want)
- }
-}
diff --git a/libgo/misc/cgo/test/duplicate_symbol.go b/libgo/misc/cgo/test/duplicate_symbol.go
deleted file mode 100644
index 6144271..0000000
--- a/libgo/misc/cgo/test/duplicate_symbol.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2010 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.
-
-// This file contains test cases for cgo.
-
-package cgotest
-
-/*
-int base_symbol = 0;
-
-#define alias_one base_symbol
-#define alias_two base_symbol
-*/
-import "C"
-
-import "fmt"
-
-func duplicateSymbols() {
- fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
-}
diff --git a/libgo/misc/cgo/test/env.go b/libgo/misc/cgo/test/env.go
deleted file mode 100644
index b2081b7..0000000
--- a/libgo/misc/cgo/test/env.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2011 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.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-*/
-import "C"
-import (
- "os"
- "runtime"
- "testing"
- "unsafe"
-)
-
-// This is really an os package test but here for convenience.
-func testSetEnv(t *testing.T) {
- if runtime.GOOS == "windows" {
- // Go uses SetEnvironmentVariable on windows. Howerver,
- // C runtime takes a *copy* at process startup of thei
- // OS environment, and stores it in environ/envp.
- // It is this copy that getenv/putenv manipulate.
- t.Logf("skipping test")
- return
- }
- const key = "CGO_OS_TEST_KEY"
- const val = "CGO_OS_TEST_VALUE"
- os.Setenv(key, val)
- keyc := C.CString(key)
- defer C.free(unsafe.Pointer(keyc))
- v := C.getenv(keyc)
- if uintptr(unsafe.Pointer(v)) == 0 {
- t.Fatal("getenv returned NULL")
- }
- vs := C.GoString(v)
- if vs != val {
- t.Fatalf("getenv() = %q; want %q", vs, val)
- }
-}
diff --git a/libgo/misc/cgo/test/exports.go b/libgo/misc/cgo/test/exports.go
deleted file mode 100644
index 71e5dcd..0000000
--- a/libgo/misc/cgo/test/exports.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2011 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.
-
-package cgotest
-
-import "C"
-import "runtime"
-
-//export ReturnIntLong
-func ReturnIntLong() (int, C.long) {
- return 1, 2
-}
-
-//export gc
-func gc() {
- runtime.GC()
-}
diff --git a/libgo/misc/cgo/test/fpvar.go b/libgo/misc/cgo/test/fpvar.go
deleted file mode 100644
index 7aab8ca..0000000
--- a/libgo/misc/cgo/test/fpvar.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 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.
-
-// This file contains test cases for cgo with function pointer variables.
-
-package cgotest
-
-/*
-typedef int (*intFunc) ();
-
-int
-bridge_int_func(intFunc f)
-{
- return f();
-}
-
-int fortytwo()
-{
- return 42;
-}
-
-*/
-import "C"
-import "testing"
-
-func callBridge(f C.intFunc) int {
- return int(C.bridge_int_func(f))
-}
-
-func callCBridge(f C.intFunc) C.int {
- return C.bridge_int_func(f)
-}
-
-func testFpVar(t *testing.T) {
- const expected = 42
- f := C.intFunc(C.fortytwo)
- res1 := C.bridge_int_func(f)
- if r1 := int(res1); r1 != expected {
- t.Errorf("got %d, want %d", r1, expected)
- }
- res2 := callCBridge(f)
- if r2 := int(res2); r2 != expected {
- t.Errorf("got %d, want %d", r2, expected)
- }
- r3 := callBridge(f)
- if r3 != expected {
- t.Errorf("got %d, want %d", r3, expected)
- }
-}
diff --git a/libgo/misc/cgo/test/helpers.go b/libgo/misc/cgo/test/helpers.go
deleted file mode 100644
index f6a822a..0000000
--- a/libgo/misc/cgo/test/helpers.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2011 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.
-
-package cgotest
-
-// const char *greeting = "hello, world";
-import "C"
-
-import (
- "reflect"
- "testing"
- "unsafe"
-)
-
-const greeting = "hello, world"
-
-type testPair struct {
- Name string
- Got, Want interface{}
-}
-
-var testPairs = []testPair{
- {"GoString", C.GoString(C.greeting), greeting},
- {"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
- {"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
-}
-
-func testHelpers(t *testing.T) {
- for _, pair := range testPairs {
- if !reflect.DeepEqual(pair.Got, pair.Want) {
- t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
- }
- }
-}
diff --git a/libgo/misc/cgo/test/issue10303.go b/libgo/misc/cgo/test/issue10303.go
deleted file mode 100644
index 66e2644..0000000
--- a/libgo/misc/cgo/test/issue10303.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2015 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.
-
-// Issue 10303. Pointers passed to C were not marked as escaping (bug in cgo).
-
-package cgotest
-
-import "runtime"
-
-/*
-typedef int *intptr;
-
-void setintstar(int *x) {
- *x = 1;
-}
-
-void setintptr(intptr x) {
- *x = 1;
-}
-
-void setvoidptr(void *x) {
- *(int*)x = 1;
-}
-
-typedef struct Struct Struct;
-struct Struct {
- int *P;
-};
-
-void setstruct(Struct s) {
- *s.P = 1;
-}
-
-*/
-import "C"
-
-import (
- "testing"
- "unsafe"
-)
-
-func test10303(t *testing.T, n int) {
- if runtime.Compiler == "gccgo" {
- t.Skip("gccgo permits C pointers on the stack")
- }
-
- // Run at a few different stack depths just to avoid an unlucky pass
- // due to variables ending up on different pages.
- if n > 0 {
- test10303(t, n-1)
- }
- if t.Failed() {
- return
- }
- var x, y, z, v, si C.int
- var s C.Struct
- C.setintstar(&x)
- C.setintptr(&y)
- C.setvoidptr(unsafe.Pointer(&v))
- s.P = &si
- C.setstruct(s)
-
- if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
- t.Error("C int* argument on stack")
- }
- if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
- t.Error("C intptr argument on stack")
- }
- if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
- t.Error("C void* argument on stack")
- }
- if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
- t.Error("C struct field pointer on stack")
- }
-}
diff --git a/libgo/misc/cgo/test/issue11925.go b/libgo/misc/cgo/test/issue11925.go
deleted file mode 100644
index c5c8a26..0000000
--- a/libgo/misc/cgo/test/issue11925.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2015 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.
-
-// Issue 11925. Structs with zero-length trailing fields are now
-// padded by the Go compiler.
-
-package cgotest
-
-/*
-struct a11925 {
- int i;
- char a[0];
- char b[0];
-};
-
-struct b11925 {
- int i;
- char a[0];
- char b[];
-};
-*/
-import "C"
-
-import (
- "testing"
- "unsafe"
-)
-
-func test11925(t *testing.T) {
- if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
- t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
- }
- if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
- t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
- }
-}
diff --git a/libgo/misc/cgo/test/issue12030.go b/libgo/misc/cgo/test/issue12030.go
deleted file mode 100644
index f863c58..0000000
--- a/libgo/misc/cgo/test/issue12030.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 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.
-
-// Issue 12030. sprintf is defined in both ntdll and msvcrt,
-// Normally we want the one in the msvcrt.
-
-package cgotest
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-void issue12030conv(char *buf, double x) {
- sprintf(buf, "d=%g", x);
-}
-*/
-import "C"
-
-import (
- "fmt"
- "testing"
- "unsafe"
-)
-
-func test12030(t *testing.T) {
- buf := (*C.char)(C.malloc(256))
- defer C.free(unsafe.Pointer(buf))
- for _, f := range []float64{1.0, 2.0, 3.14} {
- C.issue12030conv(buf, C.double(f))
- got := C.GoString(buf)
- if want := fmt.Sprintf("d=%g", f); got != want {
- t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
- }
- }
-}
diff --git a/libgo/misc/cgo/test/issue1222.go b/libgo/misc/cgo/test/issue1222.go
deleted file mode 100644
index 4868da8..0000000
--- a/libgo/misc/cgo/test/issue1222.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2010 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.
-
-// This file contains test cases for cgo.
-
-package cgotest
-
-/*
-// issue 1222
-typedef union {
- long align;
-} xxpthread_mutex_t;
-
-struct ibv_async_event {
- union {
- int x;
- } element;
-};
-
-struct ibv_context {
- xxpthread_mutex_t mutex;
-};
-*/
-import "C"
-
-type AsyncEvent struct {
- event C.struct_ibv_async_event
-}
diff --git a/libgo/misc/cgo/test/issue1328.go b/libgo/misc/cgo/test/issue1328.go
deleted file mode 100644
index 2401c10..0000000
--- a/libgo/misc/cgo/test/issue1328.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2011 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.
-
-package cgotest
-
-import "testing"
-
-// extern void BackIntoGo(void);
-// void IntoC(void);
-import "C"
-
-//export BackIntoGo
-func BackIntoGo() {
- x := 1
-
- for i := 0; i < 10000; i++ {
- xvariadic(x)
- if x != 1 {
- panic("x is not 1?")
- }
- }
-}
-
-func xvariadic(x ...interface{}) {
-}
-
-func test1328(t *testing.T) {
- C.IntoC()
-}
diff --git a/libgo/misc/cgo/test/issue13930.go b/libgo/misc/cgo/test/issue13930.go
deleted file mode 100644
index c4a08ee..0000000
--- a/libgo/misc/cgo/test/issue13930.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 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.
-
-// Issue 13930. Test that cgo's multiple-value special form for
-// C function calls works in variable declaration statements.
-
-package cgotest
-
-// #include <stdlib.h>
-import "C"
-
-var _, _ = C.abs(0)
diff --git a/libgo/misc/cgo/test/issue14838.go b/libgo/misc/cgo/test/issue14838.go
deleted file mode 100644
index c8e1681..0000000
--- a/libgo/misc/cgo/test/issue14838.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 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.
-
-// Issue 14838. add CBytes function
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-int check_cbytes(char *b, size_t l) {
- int i;
- for (i = 0; i < l; i++) {
- if (b[i] != i) {
- return 0;
- }
- }
- return 1;
-}
-*/
-import "C"
-
-import (
- "testing"
- "unsafe"
-)
-
-func test14838(t *testing.T) {
- data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
- cData := C.CBytes(data)
- defer C.free(cData)
-
- if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
- t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
- }
-}
diff --git a/libgo/misc/cgo/test/issue1560.go b/libgo/misc/cgo/test/issue1560.go
deleted file mode 100644
index 30f6152..0000000
--- a/libgo/misc/cgo/test/issue1560.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2011 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.
-
-package cgotest
-
-/*
-// mysleep returns the absolute start time in ms.
-long long mysleep(int seconds);
-
-// twoSleep returns the absolute start time of the first sleep
-// in ms.
-long long twoSleep(int);
-*/
-import "C"
-
-import (
- "testing"
- "time"
-)
-
-var sleepDone = make(chan int64)
-
-// parallelSleep returns the absolute difference between the start time
-// of the two sleeps.
-func parallelSleep(n int) int64 {
- t := int64(C.twoSleep(C.int(n))) - <-sleepDone
- if t < 0 {
- return -t
- }
- return t
-}
-
-//export BackgroundSleep
-func BackgroundSleep(n int32) {
- go func() {
- sleepDone <- int64(C.mysleep(C.int(n)))
- }()
-}
-
-func testParallelSleep(t *testing.T) {
- sleepSec := 1
- dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
- t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
- // bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
- // we detect if the start times of those sleeps are > 0.5*sleepSec-second.
- if dt >= time.Duration(sleepSec)*time.Second/2 {
- t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
- }
-}
diff --git a/libgo/misc/cgo/test/issue1635.go b/libgo/misc/cgo/test/issue1635.go
deleted file mode 100644
index 2589927..0000000
--- a/libgo/misc/cgo/test/issue1635.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2012 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.
-
-package cgotest
-
-/*
-// Mac OS X's gcc will generate scattered relocation 2/1 for
-// this function on Darwin/386, and 8l couldn't handle it.
-// this example is in issue 1635
-#include <stdio.h>
-void scatter() {
- void *p = scatter;
- printf("scatter = %p\n", p);
-}
-
-// Adding this explicit extern declaration makes this a test for
-// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
-// It used to cause a cgo error when building with GCC 6.
-extern int hola;
-
-// this example is in issue 3253
-int hola = 0;
-int testHola() { return hola; }
-*/
-import "C"
-
-import "testing"
-
-func test1635(t *testing.T) {
- C.scatter()
- if v := C.hola; v != 0 {
- t.Fatalf("C.hola is %d, should be 0", v)
- }
- if v := C.testHola(); v != 0 {
- t.Fatalf("C.testHola() is %d, should be 0", v)
- }
-}
diff --git a/libgo/misc/cgo/test/issue17065.go b/libgo/misc/cgo/test/issue17065.go
deleted file mode 100644
index ede30bc..0000000
--- a/libgo/misc/cgo/test/issue17065.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 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.
-
-package cgotest
-
-/*
-// Test that C symbols larger than a page play nicely with the race detector.
-// See issue 17065.
-
-int ii[65537];
-*/
-import "C"
-
-import (
- "runtime"
- "testing"
-)
-
-var sink C.int
-
-func test17065(t *testing.T) {
- if runtime.GOOS == "darwin" {
- t.Skip("broken on darwin; issue 17065")
- }
- for i := range C.ii {
- sink = C.ii[i]
- }
-}
diff --git a/libgo/misc/cgo/test/issue17537.go b/libgo/misc/cgo/test/issue17537.go
deleted file mode 100644
index 777104e..0000000
--- a/libgo/misc/cgo/test/issue17537.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016 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.
-
-// Issue 17537. The void* cast introduced by cgo to avoid problems
-// with const/volatile qualifiers breaks C preprocessor macros that
-// emulate functions.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-typedef struct {
- int i;
-} S17537;
-
-int I17537(S17537 *p);
-
-#define I17537(p) ((p)->i)
-
-// Calling this function used to fail without the cast.
-const int F17537(const char **p) {
- return **p;
-}
-
-// Calling this function used to trigger an error from the C compiler
-// (issue 18298).
-void F18298(const void *const *p) {
-}
-
-// Test that conversions between typedefs work as they used to.
-typedef const void *T18298_1;
-struct S18298 { int i; };
-typedef const struct S18298 *T18298_2;
-void G18298(T18298_1 t) {
-}
-*/
-import "C"
-
-import "testing"
-
-func test17537(t *testing.T) {
- v := C.S17537{i: 17537}
- if got, want := C.I17537(&v), C.int(17537); got != want {
- t.Errorf("got %d, want %d", got, want)
- }
-
- p := (*C.char)(C.malloc(1))
- *p = 17
- if got, want := C.F17537(&p), C.int(17); got != want {
- t.Errorf("got %d, want %d", got, want)
- }
-
- C.F18298(nil)
- var v18298 C.T18298_2
- C.G18298(C.T18298_1(v18298))
-}
diff --git a/libgo/misc/cgo/test/issue18126.go b/libgo/misc/cgo/test/issue18126.go
deleted file mode 100644
index ac94a66..0000000
--- a/libgo/misc/cgo/test/issue18126.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 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.
-
-// Issue 18126: cgo check of void function returning errno.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-void Issue18126C(void **p) {
-}
-*/
-import "C"
-
-import (
- "testing"
-)
-
-func test18126(t *testing.T) {
- p := C.malloc(1)
- _, err := C.Issue18126C(&p)
- C.free(p)
- _ = err
-}
diff --git a/libgo/misc/cgo/test/issue18146.go b/libgo/misc/cgo/test/issue18146.go
index 8b7bb77..196d98f 100644
--- a/libgo/misc/cgo/test/issue18146.go
+++ b/libgo/misc/cgo/test/issue18146.go
@@ -8,8 +8,6 @@
package cgotest
-import "C"
-
import (
"bytes"
"crypto/md5"
@@ -46,12 +44,12 @@ func test18146(t *testing.T) {
switch runtime.GOOS {
default:
setNproc = false
+ case "aix":
+ nproc = 9
case "linux":
nproc = 6
case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd":
nproc = 7
- case "aix":
- nproc = 9
}
if setNproc {
var rlim syscall.Rlimit
diff --git a/libgo/misc/cgo/test/issue18720.go b/libgo/misc/cgo/test/issue18720.go
deleted file mode 100644
index 3d64003..0000000
--- a/libgo/misc/cgo/test/issue18720.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-/*
-#define HELLO "hello"
-#define WORLD "world"
-#define HELLO_WORLD HELLO "\000" WORLD
-
-struct foo { char c; };
-#define SIZE_OF(x) sizeof(x)
-#define SIZE_OF_FOO SIZE_OF(struct foo)
-#define VAR1 VAR
-#define VAR var
-int var = 5;
-
-#define ADDR &var
-
-#define CALL fn()
-int fn(void) {
- return ++var;
-}
-*/
-import "C"
-import "testing"
-
-func test18720(t *testing.T) {
- if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
- t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
- }
-
- if got, want := C.VAR1, C.int(5); got != want {
- t.Errorf("C.VAR1 == %v, expected %v", got, want)
- }
-
- if got, want := *C.ADDR, C.int(5); got != want {
- t.Errorf("*C.ADDR == %v, expected %v", got, want)
- }
-
- if got, want := C.CALL, C.int(6); got != want {
- t.Errorf("C.CALL == %v, expected %v", got, want)
- }
-
- if got, want := C.CALL, C.int(7); got != want {
- t.Errorf("C.CALL == %v, expected %v", got, want)
- }
-
- // Issue 20125.
- if got, want := C.SIZE_OF_FOO, 1; got != want {
- t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
- }
-}
diff --git a/libgo/misc/cgo/test/issue20129.go b/libgo/misc/cgo/test/issue20129.go
deleted file mode 100644
index e69e0e1..0000000
--- a/libgo/misc/cgo/test/issue20129.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-/*
-int issue20129 = 0;
-typedef void issue20129Void;
-issue20129Void issue20129Foo() {
- issue20129 = 1;
-}
-typedef issue20129Void issue20129Void2;
-issue20129Void2 issue20129Bar() {
- issue20129 = 2;
-}
-*/
-import "C"
-import "testing"
-
-func test20129(t *testing.T) {
- if C.issue20129 != 0 {
- t.Fatal("test is broken")
- }
- C.issue20129Foo()
- if C.issue20129 != 1 {
- t.Errorf("got %v but expected %v", C.issue20129, 1)
- }
- C.issue20129Bar()
- if C.issue20129 != 2 {
- t.Errorf("got %v but expected %v", C.issue20129, 2)
- }
-}
diff --git a/libgo/misc/cgo/test/issue20369.go b/libgo/misc/cgo/test/issue20369.go
deleted file mode 100644
index 37b4b78..0000000
--- a/libgo/misc/cgo/test/issue20369.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-/*
-#define UINT64_MAX 18446744073709551615ULL
-*/
-import "C"
-import (
- "math"
- "testing"
-)
-
-func test20369(t *testing.T) {
- if C.UINT64_MAX != math.MaxUint64 {
- t.Fatalf("got %v, want %v", uint64(C.UINT64_MAX), uint64(math.MaxUint64))
- }
-}
diff --git a/libgo/misc/cgo/test/issue20910.go b/libgo/misc/cgo/test/issue20910.go
deleted file mode 100644
index 69d7d92..0000000
--- a/libgo/misc/cgo/test/issue20910.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-//void callMulti(void);
-import "C"
-
-import "testing"
-
-//export multi
-func multi() (*C.char, C.int) {
- return C.CString("multi"), 0
-}
-
-func test20910(t *testing.T) {
- C.callMulti()
-}
diff --git a/libgo/misc/cgo/test/issue21708.go b/libgo/misc/cgo/test/issue21708.go
deleted file mode 100644
index d413e3c5..0000000
--- a/libgo/misc/cgo/test/issue21708.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-// #include <stdint.h>
-// #define CAST_TO_INT64 (int64_t)(-1)
-import "C"
-import "testing"
-
-func test21708(t *testing.T) {
- if got, want := C.CAST_TO_INT64, -1; got != want {
- t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
- }
-}
diff --git a/libgo/misc/cgo/test/issue21809.go b/libgo/misc/cgo/test/issue21809.go
deleted file mode 100644
index a3a6b88..0000000
--- a/libgo/misc/cgo/test/issue21809.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-// Issue 21809. Compile C `typedef` to go type aliases.
-
-// typedef long MySigned_t;
-// /* tests alias-to-alias */
-// typedef MySigned_t MySigned2_t;
-//
-// long takes_long(long x) { return x * x; }
-// MySigned_t takes_typedef(MySigned_t x) { return x * x; }
-import "C"
-
-import "testing"
-
-func test21809(t *testing.T) {
- longVar := C.long(3)
- typedefVar := C.MySigned_t(4)
- typedefTypedefVar := C.MySigned2_t(5)
-
- // all three should be considered identical to `long`
- if ret := C.takes_long(longVar); ret != 9 {
- t.Errorf("got %v but expected %v", ret, 9)
- }
- if ret := C.takes_long(typedefVar); ret != 16 {
- t.Errorf("got %v but expected %v", ret, 16)
- }
- if ret := C.takes_long(typedefTypedefVar); ret != 25 {
- t.Errorf("got %v but expected %v", ret, 25)
- }
-
- // They should also be identical to the typedef'd type
- if ret := C.takes_typedef(longVar); ret != 9 {
- t.Errorf("got %v but expected %v", ret, 9)
- }
- if ret := C.takes_typedef(typedefVar); ret != 16 {
- t.Errorf("got %v but expected %v", ret, 16)
- }
- if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
- t.Errorf("got %v but expected %v", ret, 25)
- }
-}
diff --git a/libgo/misc/cgo/test/issue22958.go b/libgo/misc/cgo/test/issue22958.go
deleted file mode 100644
index a5f058f..0000000
--- a/libgo/misc/cgo/test/issue22958.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-// Test handling of bitfields.
-
-/*
-typedef struct {
- unsigned long long f8 : 8;
- unsigned long long f16 : 16;
- unsigned long long f24 : 24;
- unsigned long long f32 : 32;
- unsigned long long f40 : 40;
- unsigned long long f48 : 48;
- unsigned long long f56 : 56;
- unsigned long long f64 : 64;
-} issue22958Type;
-*/
-import "C"
-
-// Nothing to run, just make sure this compiles.
-var Vissue22958 C.issue22958Type
diff --git a/libgo/misc/cgo/test/issue23356.go b/libgo/misc/cgo/test/issue23356.go
deleted file mode 100644
index 1c39012..0000000
--- a/libgo/misc/cgo/test/issue23356.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 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.
-
-package cgotest
-
-// int a(void) { return 5; };
-// int r(void) { return 3; };
-import "C"
-import "testing"
-
-func test23356(t *testing.T) {
- if got, want := C.a(), C.int(5); got != want {
- t.Errorf("C.a() == %v, expected %v", got, want)
- }
- if got, want := C.r(), C.int(3); got != want {
- t.Errorf("C.r() == %v, expected %v", got, want)
- }
-}
diff --git a/libgo/misc/cgo/test/issue23720.go b/libgo/misc/cgo/test/issue23720.go
deleted file mode 100644
index 934fff3..0000000
--- a/libgo/misc/cgo/test/issue23720.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 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.
-
-// Test that we can pass compatible typedefs.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-typedef int *issue23720A;
-
-typedef const int *issue23720B;
-
-void issue23720F(issue23720B a) {}
-*/
-import "C"
-
-func Issue23720F() {
- var x C.issue23720A
- C.issue23720F(x)
-}
diff --git a/libgo/misc/cgo/test/issue24206.go b/libgo/misc/cgo/test/issue24206.go
deleted file mode 100644
index 5fec68e..0000000
--- a/libgo/misc/cgo/test/issue24206.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// +build amd64,linux
-
-// Copyright 2018 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.
-
-package cgotest
-
-// Test that C.GoString uses IndexByte in safe manner.
-
-/*
-#include <sys/mman.h>
-
-// Returns string with null byte at the last valid address
-char* dangerousString1() {
- int pageSize = 4096;
- char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
- mprotect(data + pageSize,pageSize,PROT_NONE);
- int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
- int i = start;
- for (; i < pageSize; i++) {
- data[i] = 'x';
- }
- data[pageSize -1 ] = 0;
- return data+start;
-}
-
-char* dangerousString2() {
- int pageSize = 4096;
- char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
- mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
- int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
- int i = start;
- for (; i < 2 * pageSize; i++) {
- data[i] = 'x';
- }
- data[2*pageSize -1 ] = 0;
- return data+start;
-}
-*/
-import "C"
-
-import (
- "testing"
-)
-
-func test24206(t *testing.T) {
- if l := len(C.GoString(C.dangerousString1())); l != 123 {
- t.Errorf("Incorrect string length - got %d, want 123", l)
- }
- if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
- t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
- }
-}
diff --git a/libgo/misc/cgo/test/issue24206_generic.go b/libgo/misc/cgo/test/issue24206_generic.go
deleted file mode 100644
index 27c4d65..0000000
--- a/libgo/misc/cgo/test/issue24206_generic.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build !amd64 !linux
-
-// Copyright 2018 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.
-
-package cgotest
-
-import "testing"
-
-func test24206(t *testing.T) {
- t.Skip("Skipping on non-amd64 or non-linux system")
-}
diff --git a/libgo/misc/cgo/test/issue2462.go b/libgo/misc/cgo/test/issue2462.go
deleted file mode 100644
index febca1e..0000000
--- a/libgo/misc/cgo/test/issue2462.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2011 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.
-
-package cgotest
-
-import "C"
-
-//export exportbyte
-func exportbyte() byte {
- return 0
-}
-
-//export exportbool
-func exportbool() bool {
- return false
-}
-
-//export exportrune
-func exportrune() rune {
- return 0
-}
-
-//export exporterror
-func exporterror() error {
- return nil
-}
-
-//export exportint
-func exportint() int {
- return 0
-}
-
-//export exportuint
-func exportuint() uint {
- return 0
-}
-
-//export exportuintptr
-func exportuintptr() uintptr {
- return (uintptr)(0)
-}
-
-//export exportint8
-func exportint8() int8 {
- return 0
-}
-
-//export exportuint8
-func exportuint8() uint8 {
- return 0
-}
-
-//export exportint16
-func exportint16() int16 {
- return 0
-}
-
-//export exportuint16
-func exportuint16() uint16 {
- return 0
-}
-
-//export exportint32
-func exportint32() int32 {
- return 0
-}
-
-//export exportuint32
-func exportuint32() uint32 {
- return 0
-}
-
-//export exportint64
-func exportint64() int64 {
- return 0
-}
-
-//export exportuint64
-func exportuint64() uint64 {
- return 0
-}
-
-//export exportfloat32
-func exportfloat32() float32 {
- return 0
-}
-
-//export exportfloat64
-func exportfloat64() float64 {
- return 0
-}
-
-//export exportcomplex64
-func exportcomplex64() complex64 {
- return 0
-}
-
-//export exportcomplex128
-func exportcomplex128() complex128 {
- return 0
-}
diff --git a/libgo/misc/cgo/test/issue25143.go b/libgo/misc/cgo/test/issue25143.go
deleted file mode 100644
index 607bfe4..0000000
--- a/libgo/misc/cgo/test/issue25143.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 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.
-
-package cgotest
-
-import "C"
-import "testing"
-
-func issue25143sum(ns ...C.int) C.int {
- total := C.int(0)
- for _, n := range ns {
- total += n
- }
- return total
-}
-
-func test25143(t *testing.T) {
- if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
- t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
- }
-}
diff --git a/libgo/misc/cgo/test/issue26066.go b/libgo/misc/cgo/test/issue26066.go
deleted file mode 100644
index 21028e7..0000000
--- a/libgo/misc/cgo/test/issue26066.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 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.
-
-// Wrong type of constant with GCC 8 and newer.
-
-package cgotest
-
-// const unsigned long long int issue26066 = (const unsigned long long) -1;
-import "C"
-
-import "testing"
-
-func test26066(t *testing.T) {
- var i = int64(C.issue26066)
- if i != -1 {
- t.Errorf("got %d, want -1", i)
- }
-}
diff --git a/libgo/misc/cgo/test/issue26517.go b/libgo/misc/cgo/test/issue26517.go
deleted file mode 100644
index c1bf1c9..0000000
--- a/libgo/misc/cgo/test/issue26517.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 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.
-
-package cgotest
-
-// Introduce two pointer types which are distinct, but have the same
-// base type. Make sure that both of those pointer types get resolved
-// correctly. Before the fix for 26517 if one of these pointer types
-// was resolved before the other one was processed, the second one
-// would never be resolved.
-// Before this issue was fixed this test failed on Windows,
-// where va_list expands to a named char* type.
-
-/*
-#include <stdarg.h>
-typedef va_list TypeOne;
-typedef char *TypeTwo;
-*/
-import "C"
-
-var a C.TypeOne
-var b C.TypeTwo
diff --git a/libgo/misc/cgo/test/issue28545.go b/libgo/misc/cgo/test/issue28545.go
deleted file mode 100644
index 8419b89..0000000
--- a/libgo/misc/cgo/test/issue28545.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 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.
-
-// Failed to add type conversion for negative constant.
-// Issue 28772: Failed to add type conversion for Go constant set to C constant.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-#include <complex.h>
-
-#define issue28772Constant 1
-
-static void issue28545F(char **p, int n, complex double a) {}
-*/
-import "C"
-
-const issue28772Constant = C.issue28772Constant
-
-func issue28545G(p **C.char) {
- C.issue28545F(p, -1, (0))
- C.issue28545F(p, 2+3, complex(1, 1))
- C.issue28545F(p, issue28772Constant, issue28772Constant2)
-}
diff --git a/libgo/misc/cgo/test/issue28772.go b/libgo/misc/cgo/test/issue28772.go
deleted file mode 100644
index bed786b..0000000
--- a/libgo/misc/cgo/test/issue28772.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 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.
-
-package cgotest
-
-// Constants didn't work if defined in different source file.
-
-// #define issue28772Constant2 2
-import "C"
-
-const issue28772Constant2 = C.issue28772Constant2
diff --git a/libgo/misc/cgo/test/issue28896.go b/libgo/misc/cgo/test/issue28896.go
deleted file mode 100644
index 8796040f..0000000
--- a/libgo/misc/cgo/test/issue28896.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2018 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.
-
-// cgo was incorrectly adding padding after a packed struct.
-
-package cgotest
-
-/*
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-typedef struct {
- void *f1;
- uint32_t f2;
-} __attribute__((__packed__)) innerPacked;
-
-typedef struct {
- innerPacked g1;
- uint64_t g2;
-} outerPacked;
-
-typedef struct {
- void *f1;
- uint32_t f2;
-} innerUnpacked;
-
-typedef struct {
- innerUnpacked g1;
- uint64_t g2;
-} outerUnpacked;
-
-size_t offset(int x) {
- switch (x) {
- case 0:
- return offsetof(innerPacked, f2);
- case 1:
- return offsetof(outerPacked, g2);
- case 2:
- return offsetof(innerUnpacked, f2);
- case 3:
- return offsetof(outerUnpacked, g2);
- default:
- abort();
- }
-}
-*/
-import "C"
-
-import (
- "testing"
- "unsafe"
-)
-
-func offset(i int) uintptr {
- var pi C.innerPacked
- var po C.outerPacked
- var ui C.innerUnpacked
- var uo C.outerUnpacked
- switch i {
- case 0:
- return unsafe.Offsetof(pi.f2)
- case 1:
- return unsafe.Offsetof(po.g2)
- case 2:
- return unsafe.Offsetof(ui.f2)
- case 3:
- return unsafe.Offsetof(uo.g2)
- default:
- panic("can't happen")
- }
-}
-
-func test28896(t *testing.T) {
- for i := 0; i < 4; i++ {
- c := uintptr(C.offset(C.int(i)))
- g := offset(i)
- if c != g {
- t.Errorf("%d: C: %d != Go %d", i, c, g)
- }
- }
-}
diff --git a/libgo/misc/cgo/test/issue29383.go b/libgo/misc/cgo/test/issue29383.go
deleted file mode 100644
index 462c9a3..0000000
--- a/libgo/misc/cgo/test/issue29383.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 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.
-
-// cgo's /*line*/ comments failed when inserted after '/',
-// because the result looked like a "//" comment.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include <stddef.h>
-import "C"
-
-func Issue29383(n, size uint) int {
- if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
- return 0
- }
- return 0
-}
diff --git a/libgo/misc/cgo/test/issue29748.go b/libgo/misc/cgo/test/issue29748.go
deleted file mode 100644
index 8229b3b..0000000
--- a/libgo/misc/cgo/test/issue29748.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2019 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.
-
-// Error handling a struct initializer that requires pointer checking.
-// Compilation test only, nothing to run.
-
-package cgotest
-
-// typedef struct { char **p; } S29748;
-// static int f29748(S29748 *p) { return 0; }
-import "C"
-
-var Vissue29748 = C.f29748(&C.S29748{
- nil,
-})
-
-func Fissue299748() {
- C.f29748(&C.S29748{
- nil,
- })
-}
diff --git a/libgo/misc/cgo/test/issue29781.go b/libgo/misc/cgo/test/issue29781.go
deleted file mode 100644
index 0fd8c08..0000000
--- a/libgo/misc/cgo/test/issue29781.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2019 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.
-
-// Error with newline inserted into constant expression.
-// Compilation test only, nothing to run.
-
-package cgotest
-
-// static void issue29781F(char **p, int n) {}
-// #define ISSUE29781C 0
-import "C"
-
-func issue29781G() {
- var p *C.char
- C.issue29781F(&p, C.ISSUE29781C+1)
-}
diff --git a/libgo/misc/cgo/test/issue30065.go b/libgo/misc/cgo/test/issue30065.go
deleted file mode 100644
index 396d437..0000000
--- a/libgo/misc/cgo/test/issue30065.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 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.
-
-// Don't make a private copy of an array when taking the address of an
-// element.
-
-package cgotest
-
-// #include <string.h>
-import "C"
-
-import (
- "testing"
- "unsafe"
-)
-
-func test30065(t *testing.T) {
- var a [256]byte
- b := []byte("a")
- C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
- if a[0] != 'a' {
- t.Errorf("&a failed: got %c, want %c", a[0], 'a')
- }
-
- b = []byte("b")
- C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
- if a[0] != 'b' {
- t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
- }
-
- d := make([]byte, 256)
- b = []byte("c")
- C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
- if d[0] != 'c' {
- t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
- }
-}
diff --git a/libgo/misc/cgo/test/issue3250.go b/libgo/misc/cgo/test/issue3250.go
deleted file mode 100644
index f85c16b..0000000
--- a/libgo/misc/cgo/test/issue3250.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 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.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <signal.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-static void *thread(void *p) {
- const int M = 100;
- int i;
- (void)p;
- for (i = 0; i < M; i++) {
- pthread_kill(pthread_self(), SIGCHLD);
- usleep(rand() % 20 + 5);
- }
- return NULL;
-}
-void testSendSIG() {
- const int N = 20;
- int i;
- pthread_t tid[N];
- for (i = 0; i < N; i++) {
- usleep(rand() % 200 + 100);
- pthread_create(&tid[i], 0, thread, NULL);
- }
- for (i = 0; i < N; i++)
- pthread_join(tid[i], 0);
-}
-*/
-import "C"
-
-import (
- "os"
- "os/signal"
- "syscall"
- "testing"
- "time"
-)
-
-func test3250(t *testing.T) {
- t.Skip("skipped, see golang.org/issue/5885")
- const (
- thres = 1
- sig = syscall.SIGCHLD
- )
- type result struct {
- n int
- sig os.Signal
- }
- var (
- sigCh = make(chan os.Signal, 10)
- waitStart = make(chan struct{})
- waitDone = make(chan result)
- )
-
- signal.Notify(sigCh, sig)
-
- go func() {
- n := 0
- alarm := time.After(time.Second * 3)
- for {
- select {
- case <-waitStart:
- waitStart = nil
- case v := <-sigCh:
- n++
- if v != sig || n > thres {
- waitDone <- result{n, v}
- return
- }
- case <-alarm:
- waitDone <- result{n, sig}
- return
- }
- }
- }()
-
- waitStart <- struct{}{}
- C.testSendSIG()
- r := <-waitDone
- if r.sig != sig {
- t.Fatalf("received signal %v, but want %v", r.sig, sig)
- }
- t.Logf("got %d signals\n", r.n)
- if r.n <= thres {
- t.Fatalf("expected more than %d", thres)
- }
-}
diff --git a/libgo/misc/cgo/test/issue3261.go b/libgo/misc/cgo/test/issue3261.go
deleted file mode 100644
index 7137569..0000000
--- a/libgo/misc/cgo/test/issue3261.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2012 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.
-
-package cgotest
-
-/*
-// libgcc on ARM might be compiled as thumb code, but our 5l
-// can't handle that, so we have to disable this test on arm.
-#ifdef __ARMEL__
-#include <stdio.h>
-int vabs(int x) {
- puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
- return (x < 0) ? -x : x;
-}
-#elif defined(__arm64__) && defined(__clang__)
-#include <stdio.h>
-int vabs(int x) {
- puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
- return (x < 0) ? -x : x;
-}
-#else
-int __absvsi2(int); // dummy prototype for libgcc function
-// we shouldn't name the function abs, as gcc might use
-// the builtin one.
-int vabs(int x) { return __absvsi2(x); }
-#endif
-*/
-import "C"
-
-import "testing"
-
-func testLibgcc(t *testing.T) {
- var table = []struct {
- in, out C.int
- }{
- {0, 0},
- {1, 1},
- {-42, 42},
- {1000300, 1000300},
- {1 - 1<<31, 1<<31 - 1},
- }
- for _, v := range table {
- if o := C.vabs(v.in); o != v.out {
- t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
- return
- }
- }
-}
diff --git a/libgo/misc/cgo/test/issue3729.go b/libgo/misc/cgo/test/issue3729.go
deleted file mode 100644
index 947b90a..0000000
--- a/libgo/misc/cgo/test/issue3729.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2012 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.
-
-// Issue 3729: cmd/cgo: access errno from void C function
-// void f(void) returns [0]byte, error in Go world.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <errno.h>
-
-void g(void) {
- errno = E2BIG;
-}
-
-// try to pass some non-trivial arguments to function g2
-const char _expA = 0x42;
-const float _expB = 3.14159;
-const short _expC = 0x55aa;
-const int _expD = 0xdeadbeef;
-void g2(int x, char a, float b, short c, int d) {
- if (a == _expA && b == _expB && c == _expC && d == _expD)
- errno = x;
- else
- errno = -1;
-}
-*/
-import "C"
-
-import (
- "syscall"
- "testing"
-)
-
-func test3729(t *testing.T) {
- _, e := C.g()
- if e != syscall.E2BIG {
- t.Errorf("got %q, expect %q", e, syscall.E2BIG)
- }
- _, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
- if e != syscall.EINVAL {
- t.Errorf("got %q, expect %q", e, syscall.EINVAL)
- }
-}
diff --git a/libgo/misc/cgo/test/issue3729w.go b/libgo/misc/cgo/test/issue3729w.go
deleted file mode 100644
index 69296b5..0000000
--- a/libgo/misc/cgo/test/issue3729w.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2012 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.
-
-// Issue 3729: cmd/cgo: access errno from void C function
-// void f(void) returns [0]byte, error in Go world.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test3729(t *testing.T) {
- t.Log("skip errno test on Windows")
-}
diff --git a/libgo/misc/cgo/test/issue3741.go b/libgo/misc/cgo/test/issue3741.go
deleted file mode 100644
index 314038c..0000000
--- a/libgo/misc/cgo/test/issue3741.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 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.
-
-package cgotest
-
-import "C"
-
-//export exportSliceIn
-func exportSliceIn(s []byte) bool {
- return len(s) == cap(s)
-}
-
-//export exportSliceOut
-func exportSliceOut() []byte {
- return []byte{1}
-}
-
-//export exportSliceInOut
-func exportSliceInOut(s []byte) []byte {
- return s
-}
diff --git a/libgo/misc/cgo/test/issue3775.go b/libgo/misc/cgo/test/issue3775.go
deleted file mode 100644
index 5aca760..0000000
--- a/libgo/misc/cgo/test/issue3775.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// +build !android
-
-package cgotest
-
-/*
-void lockOSThreadCallback(void);
-inline static void lockOSThreadC(void)
-{
- lockOSThreadCallback();
-}
-int usleep(unsigned usec);
-*/
-import "C"
-
-import (
- "runtime"
- "testing"
-)
-
-func init() {
- // Same as test3775 but run during init so that
- // there are two levels of internal runtime lock
- // (1 for init, 1 for cgo).
- // This would have been broken by CL 11663043.
- C.lockOSThreadC()
-}
-
-func test3775(t *testing.T) {
- // Used to panic because of the UnlockOSThread below.
- C.lockOSThreadC()
-}
-
-//export lockOSThreadCallback
-func lockOSThreadCallback() {
- runtime.LockOSThread()
- runtime.UnlockOSThread()
- go C.usleep(10000)
- runtime.Gosched()
-}
diff --git a/libgo/misc/cgo/test/issue3945.go b/libgo/misc/cgo/test/issue3945.go
deleted file mode 100644
index 2f9fe23..0000000
--- a/libgo/misc/cgo/test/issue3945.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 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.
-
-package cgotest
-
-// Test that cgo reserves enough stack space during cgo call.
-// See https://golang.org/issue/3945 for details.
-
-// #include <stdio.h>
-//
-// void say() {
-// printf("%s from C\n", "hello");
-// }
-//
-import "C"
-
-import "testing"
-
-func testPrintf(t *testing.T) {
- C.say()
-}
diff --git a/libgo/misc/cgo/test/issue4054a.go b/libgo/misc/cgo/test/issue4054a.go
deleted file mode 100644
index 2abdac5..0000000
--- a/libgo/misc/cgo/test/issue4054a.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 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.
-
-package cgotest
-
-/*
-typedef enum {
- A = 0,
- B,
- C,
- D,
- E,
- F,
- G,
- H,
- I,
- J,
-} issue4054a;
-*/
-import "C"
-
-var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
diff --git a/libgo/misc/cgo/test/issue4054b.go b/libgo/misc/cgo/test/issue4054b.go
deleted file mode 100644
index 048964c..0000000
--- a/libgo/misc/cgo/test/issue4054b.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 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.
-
-package cgotest
-
-/*
-typedef enum {
- A = 0,
- B,
- C,
- D,
- E,
- F,
- G,
- H,
- I,
- J,
-} issue4054b;
-*/
-import "C"
-
-var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
diff --git a/libgo/misc/cgo/test/issue4339.go b/libgo/misc/cgo/test/issue4339.go
deleted file mode 100644
index 3715fde..0000000
--- a/libgo/misc/cgo/test/issue4339.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-/*
-// We've historically permitted #include <>, so test it here. Issue 29333.
-#include <issue4339.h>
-*/
-import "C"
-
-import "testing"
-
-func test4339(t *testing.T) {
- C.handle4339(&C.exported4339)
-}
diff --git a/libgo/misc/cgo/test/issue4417.go b/libgo/misc/cgo/test/issue4417.go
deleted file mode 100644
index 9b18287..0000000
--- a/libgo/misc/cgo/test/issue4417.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2012 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.
-
-// Issue 4417: cmd/cgo: bool alignment/padding issue.
-// bool alignment is wrong and causing wrong arguments when calling functions.
-//
-
-package cgotest
-
-/*
-#include <stdbool.h>
-
-static int c_bool(bool a, bool b, int c, bool d, bool e) {
- return c;
-}
-*/
-import "C"
-import "testing"
-
-func testBoolAlign(t *testing.T) {
- b := C.c_bool(true, true, 10, true, false)
- if b != 10 {
- t.Fatalf("found %d expected 10\n", b)
- }
- b = C.c_bool(true, true, 5, true, true)
- if b != 5 {
- t.Fatalf("found %d expected 5\n", b)
- }
- b = C.c_bool(true, true, 3, true, false)
- if b != 3 {
- t.Fatalf("found %d expected 3\n", b)
- }
- b = C.c_bool(false, false, 1, true, false)
- if b != 1 {
- t.Fatalf("found %d expected 1\n", b)
- }
- b = C.c_bool(false, true, 200, true, false)
- if b != 200 {
- t.Fatalf("found %d expected 200\n", b)
- }
-}
diff --git a/libgo/misc/cgo/test/issue4857.go b/libgo/misc/cgo/test/issue4857.go
deleted file mode 100644
index b18979b..0000000
--- a/libgo/misc/cgo/test/issue4857.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-/*
-#cgo CFLAGS: -Werror
-const struct { int a; } *issue4857() { return (void *)0; }
-*/
-import "C"
-
-func test4857() {
- _ = C.issue4857()
-}
diff --git a/libgo/misc/cgo/test/issue5227.go b/libgo/misc/cgo/test/issue5227.go
deleted file mode 100644
index 53c3bf1..0000000
--- a/libgo/misc/cgo/test/issue5227.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2013 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.
-
-// Issue 5227: linker incorrectly treats common symbols and
-// leaves them undefined.
-
-package cgotest
-
-/*
-typedef struct {
- int Count;
-} Fontinfo;
-
-Fontinfo SansTypeface;
-
-extern void init();
-
-Fontinfo loadfont() {
- Fontinfo f = {0};
- return f;
-}
-
-void init() {
- SansTypeface = loadfont();
-}
-*/
-import "C"
-
-import "testing"
-
-func test5227(t *testing.T) {
- C.init()
-}
-
-func selectfont() C.Fontinfo {
- return C.SansTypeface
-}
diff --git a/libgo/misc/cgo/test/issue5242.go b/libgo/misc/cgo/test/issue5242.go
deleted file mode 100644
index c81cd40..0000000
--- a/libgo/misc/cgo/test/issue5242.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 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.
-
-// Issue 5242. Cgo incorrectly computed the alignment of structs
-// with no Go accessible fields as 0, and then panicked on
-// modulo-by-zero computations.
-
-package cgotest
-
-/*
-typedef struct {
-} foo;
-
-typedef struct {
- int x : 1;
-} bar;
-
-int issue5242(foo f, bar b) {
- return 5242;
-}
-*/
-import "C"
-
-import "testing"
-
-func test5242(t *testing.T) {
- if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
- t.Errorf("got %v", got)
- }
-}
diff --git a/libgo/misc/cgo/test/issue5337.go b/libgo/misc/cgo/test/issue5337.go
deleted file mode 100644
index 9041d95..0000000
--- a/libgo/misc/cgo/test/issue5337.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 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.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <signal.h>
-#include <pthread.h>
-
-static void *thread1(void *p) {
- (void)p;
- pthread_kill(pthread_self(), SIGPROF);
- return NULL;
-}
-void test5337() {
- pthread_t tid;
- pthread_create(&tid, 0, thread1, NULL);
- pthread_join(tid, 0);
-}
-*/
-import "C"
-
-import "testing"
-
-// Verify that we can withstand SIGPROF received on foreign threads
-func test5337(t *testing.T) {
- C.test5337()
-}
diff --git a/libgo/misc/cgo/test/issue5337w.go b/libgo/misc/cgo/test/issue5337w.go
deleted file mode 100644
index 7b46757..0000000
--- a/libgo/misc/cgo/test/issue5337w.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 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.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test5337(t *testing.T) {}
diff --git a/libgo/misc/cgo/test/issue5548.go b/libgo/misc/cgo/test/issue5548.go
deleted file mode 100644
index 0710da7..0000000
--- a/libgo/misc/cgo/test/issue5548.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-import "testing"
-
-/*
-extern int issue5548_in_c(void);
-*/
-import "C"
-
-//export issue5548FromC
-func issue5548FromC(s string, i int) int {
- if len(s) == 4 && s == "test" && i == 42 {
- return 12345
- }
- println("got", len(s), i)
- return 9876
-}
-
-func test5548(t *testing.T) {
- if x := C.issue5548_in_c(); x != 12345 {
- t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
- }
-}
diff --git a/libgo/misc/cgo/test/issue5603.go b/libgo/misc/cgo/test/issue5603.go
deleted file mode 100644
index ab84339..0000000
--- a/libgo/misc/cgo/test/issue5603.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-/*
-const long long issue5603exp = 0x12345678;
-long long issue5603foo0() { return issue5603exp; }
-long long issue5603foo1(void *p) { return issue5603exp; }
-long long issue5603foo2(void *p, void *q) { return issue5603exp; }
-long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
-long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
-*/
-import "C"
-
-import "testing"
-
-func test5603(t *testing.T) {
- var x [5]int64
- exp := int64(C.issue5603exp)
- x[0] = int64(C.issue5603foo0())
- x[1] = int64(C.issue5603foo1(nil))
- x[2] = int64(C.issue5603foo2(nil, nil))
- x[3] = int64(C.issue5603foo3(nil, nil, nil))
- x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
- for i, v := range x {
- if v != exp {
- t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
- }
- }
-}
diff --git a/libgo/misc/cgo/test/issue5740.go b/libgo/misc/cgo/test/issue5740.go
deleted file mode 100644
index 059e316..0000000
--- a/libgo/misc/cgo/test/issue5740.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-// int test5740a(void), test5740b(void);
-import "C"
-import "testing"
-
-func test5740(t *testing.T) {
- if v := C.test5740a() + C.test5740b(); v != 5 {
- t.Errorf("expected 5, got %v", v)
- }
-}
diff --git a/libgo/misc/cgo/test/issue5986.go b/libgo/misc/cgo/test/issue5986.go
deleted file mode 100644
index 9be1614..0000000
--- a/libgo/misc/cgo/test/issue5986.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-/*
-#cgo LDFLAGS: -lm
-#include <stdio.h>
-#include <math.h>
-
-static void output5986()
-{
- int current_row = 0, row_count = 0;
- double sum_squares = 0;
- double d;
- do {
- if (current_row == 10) {
- current_row = 0;
- }
- ++row_count;
- }
- while (current_row++ != 1);
- d = sqrt(sum_squares / row_count);
- printf("sqrt is: %g\n", d);
-}
-*/
-import "C"
-import "testing"
-
-func test5986(t *testing.T) {
- C.output5986()
-}
diff --git a/libgo/misc/cgo/test/issue6128.go b/libgo/misc/cgo/test/issue6128.go
deleted file mode 100644
index 9832d79..0000000
--- a/libgo/misc/cgo/test/issue6128.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-// Test handling of #defined names in clang.
-// golang.org/issue/6128.
-
-/*
-// NOTE: Must use hex, or else a shortcut for decimals
-// in cgo avoids trying to pass this to clang.
-#define X 0x1
-*/
-import "C"
-
-func test6128() {
- // nothing to run, just make sure this compiles.
- _ = C.X
-}
diff --git a/libgo/misc/cgo/test/issue6390.go b/libgo/misc/cgo/test/issue6390.go
deleted file mode 100644
index 5642899..0000000
--- a/libgo/misc/cgo/test/issue6390.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-// #include <stdlib.h>
-import "C"
-
-import "testing"
-
-func test6390(t *testing.T) {
- p1 := C.malloc(1024)
- if p1 == nil {
- t.Fatalf("C.malloc(1024) returned nil")
- }
- p2 := C.malloc(0)
- if p2 == nil {
- t.Fatalf("C.malloc(0) returned nil")
- }
- C.free(p1)
- C.free(p2)
-}
diff --git a/libgo/misc/cgo/test/issue6472.go b/libgo/misc/cgo/test/issue6472.go
deleted file mode 100644
index d416a05..0000000
--- a/libgo/misc/cgo/test/issue6472.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-/*
-typedef struct
-{
- struct
- {
- int x;
- } y[16];
-} z;
-*/
-import "C"
-
-func test6472() {
- // nothing to run, just make sure this compiles
- s := new(C.z)
- println(s.y[0].x)
-}
diff --git a/libgo/misc/cgo/test/issue6506.go b/libgo/misc/cgo/test/issue6506.go
deleted file mode 100644
index c54b54b..0000000
--- a/libgo/misc/cgo/test/issue6506.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-// Test handling of size_t in the face of incorrect clang debug information.
-// golang.org/issue/6506.
-
-/*
-#include <stdlib.h>
-#include <string.h>
-*/
-import "C"
-
-func test6506() {
- // nothing to run, just make sure this compiles
- var x C.size_t
-
- C.calloc(x, x)
- C.malloc(x)
- C.realloc(nil, x)
- C.memcpy(nil, nil, x)
- C.memcmp(nil, nil, x)
- C.memmove(nil, nil, x)
- C.strncpy(nil, nil, x)
- C.strncmp(nil, nil, x)
- C.strncat(nil, nil, x)
- x = C.strxfrm(nil, nil, x)
- C.memchr(nil, 0, x)
- x = C.strcspn(nil, nil)
- x = C.strspn(nil, nil)
- C.memset(nil, 0, x)
- x = C.strlen(nil)
- _ = x
-}
diff --git a/libgo/misc/cgo/test/issue6612.go b/libgo/misc/cgo/test/issue6612.go
deleted file mode 100644
index 15a12fa..0000000
--- a/libgo/misc/cgo/test/issue6612.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2013 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.
-
-// golang.org/issue/6612
-// Test new scheme for deciding whether C.name is an expression, type, constant.
-// Clang silences some warnings when the name is a #defined macro, so test those too
-// (even though we now use errors exclusively, not warnings).
-
-package cgotest
-
-/*
-void myfunc(void) {}
-int myvar = 5;
-const char *mytext = "abcdef";
-typedef int mytype;
-enum {
- myenum = 1234,
-};
-
-#define myfunc_def myfunc
-#define myvar_def myvar
-#define mytext_def mytext
-#define mytype_def mytype
-#define myenum_def myenum
-#define myint_def 12345
-#define myfloat_def 1.5
-#define mystring_def "hello"
-*/
-import "C"
-
-import "testing"
-
-func testNaming(t *testing.T) {
- C.myfunc()
- C.myfunc_def()
- if v := C.myvar; v != 5 {
- t.Errorf("C.myvar = %d, want 5", v)
- }
- if v := C.myvar_def; v != 5 {
- t.Errorf("C.myvar_def = %d, want 5", v)
- }
- if s := C.GoString(C.mytext); s != "abcdef" {
- t.Errorf("C.mytext = %q, want %q", s, "abcdef")
- }
- if s := C.GoString(C.mytext_def); s != "abcdef" {
- t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
- }
- if c := C.myenum; c != 1234 {
- t.Errorf("C.myenum = %v, want 1234", c)
- }
- if c := C.myenum_def; c != 1234 {
- t.Errorf("C.myenum_def = %v, want 1234", c)
- }
- {
- const c = C.myenum
- if c != 1234 {
- t.Errorf("C.myenum as const = %v, want 1234", c)
- }
- }
- {
- const c = C.myenum_def
- if c != 1234 {
- t.Errorf("C.myenum as const = %v, want 1234", c)
- }
- }
- if c := C.myint_def; c != 12345 {
- t.Errorf("C.myint_def = %v, want 12345", c)
- }
- {
- const c = C.myint_def
- if c != 12345 {
- t.Errorf("C.myint as const = %v, want 12345", c)
- }
- }
-
- if c := C.myfloat_def; c != 1.5 {
- t.Errorf("C.myint_def = %v, want 1.5", c)
- }
- {
- const c = C.myfloat_def
- if c != 1.5 {
- t.Errorf("C.myint as const = %v, want 1.5", c)
- }
- }
-
- if s := C.mystring_def; s != "hello" {
- t.Errorf("C.mystring_def = %q, want %q", s, "hello")
- }
-}
diff --git a/libgo/misc/cgo/test/issue6833.go b/libgo/misc/cgo/test/issue6833.go
deleted file mode 100644
index de60dbf..0000000
--- a/libgo/misc/cgo/test/issue6833.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-/*
-extern unsigned long long issue6833Func(unsigned int, unsigned long long);
-*/
-import "C"
-
-import "testing"
-
-//export GoIssue6833Func
-func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
- return aui64 + uint64(aui)
-}
-
-func test6833(t *testing.T) {
- ui := 7
- ull := uint64(0x4000300020001000)
- v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
- exp := uint64(ui) + ull
- if v != exp {
- t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
- }
-}
diff --git a/libgo/misc/cgo/test/issue6907.go b/libgo/misc/cgo/test/issue6907.go
deleted file mode 100644
index 00495ab..0000000
--- a/libgo/misc/cgo/test/issue6907.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-#include <string.h>
-
-char* Issue6907CopyString(_GoString_ s) {
- size_t n;
- const char *p;
- char *r;
-
- n = _GoStringLen(s);
- p = _GoStringPtr(s);
- r = malloc(n + 1);
- memmove(r, p, n);
- r[n] = '\0';
- return r;
-}
-*/
-import "C"
-
-import "testing"
-
-func test6907(t *testing.T) {
- want := "yarn"
- if got := C.GoString(C.Issue6907CopyString(want)); got != want {
- t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
- }
-}
diff --git a/libgo/misc/cgo/test/issue6907export.go b/libgo/misc/cgo/test/issue6907export.go
deleted file mode 100644
index d41899e..0000000
--- a/libgo/misc/cgo/test/issue6907export.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 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.
-
-package cgotest
-
-/*
-extern int CheckIssue6907C(_GoString_);
-*/
-import "C"
-
-import (
- "testing"
-)
-
-const CString = "C string"
-
-//export CheckIssue6907Go
-func CheckIssue6907Go(s string) C.int {
- if s == CString {
- return 1
- }
- return 0
-}
-
-func test6907Go(t *testing.T) {
- if got := C.CheckIssue6907C(CString); got != 1 {
- t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
- }
-}
diff --git a/libgo/misc/cgo/test/issue7560.go b/libgo/misc/cgo/test/issue7560.go
deleted file mode 100644
index f36d8a1..0000000
--- a/libgo/misc/cgo/test/issue7560.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 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.
-
-package cgotest
-
-/*
-#include <stdint.h>
-
-typedef struct {
- char x;
- long y;
-} __attribute__((__packed__)) misaligned;
-
-int
-offset7560(void)
-{
- return (uintptr_t)&((misaligned*)0)->y;
-}
-*/
-import "C"
-
-import (
- "reflect"
- "testing"
-)
-
-func test7560(t *testing.T) {
- // some mingw don't implement __packed__ correctly.
- if C.offset7560() != 1 {
- t.Skip("C compiler did not pack struct")
- }
-
- // C.misaligned should have x but then a padding field to get to the end of the struct.
- // There should not be a field named 'y'.
- var v C.misaligned
- rt := reflect.TypeOf(&v).Elem()
- if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
- t.Errorf("unexpected fields in C.misaligned:\n")
- for i := 0; i < rt.NumField(); i++ {
- t.Logf("%+v\n", rt.Field(i))
- }
- }
-}
diff --git a/libgo/misc/cgo/test/issue7665.go b/libgo/misc/cgo/test/issue7665.go
deleted file mode 100644
index ce03458..0000000
--- a/libgo/misc/cgo/test/issue7665.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2013 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.
-
-package cgotest
-
-import (
- "testing"
- "unsafe"
-)
-
-// extern void f7665(void);
-import "C"
-
-//export f7665
-func f7665() {}
-
-var bad7665 unsafe.Pointer = C.f7665
-var good7665 uintptr = uintptr(C.f7665)
-
-func test7665(t *testing.T) {
- if bad7665 == nil || uintptr(bad7665) != good7665 {
- t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
- }
-}
diff --git a/libgo/misc/cgo/test/issue7786.go b/libgo/misc/cgo/test/issue7786.go
deleted file mode 100644
index 1344e9e..0000000
--- a/libgo/misc/cgo/test/issue7786.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 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.
-
-// Issue 7786. No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
-
-package cgotest
-
-// struct test7786;
-// typedef struct test7786 typedef_test7786;
-// void f7786(struct test7786 *ctx) {}
-// void g7786(typedef_test7786 *ctx) {}
-//
-// typedef struct body7786 typedef_body7786;
-// struct body7786 { int x; };
-// void b7786(struct body7786 *ctx) {}
-// void c7786(typedef_body7786 *ctx) {}
-//
-// typedef union union7786 typedef_union7786;
-// void u7786(union union7786 *ctx) {}
-// void v7786(typedef_union7786 *ctx) {}
-import "C"
-
-func f() {
- var x1 *C.typedef_test7786
- var x2 *C.struct_test7786
- x1 = x2
- x2 = x1
- C.f7786(x1)
- C.f7786(x2)
- C.g7786(x1)
- C.g7786(x2)
-
- var b1 *C.typedef_body7786
- var b2 *C.struct_body7786
- b1 = b2
- b2 = b1
- C.b7786(b1)
- C.b7786(b2)
- C.c7786(b1)
- C.c7786(b2)
-
- var u1 *C.typedef_union7786
- var u2 *C.union_union7786
- u1 = u2
- u2 = u1
- C.u7786(u1)
- C.u7786(u2)
- C.v7786(u1)
- C.v7786(u2)
-}
diff --git a/libgo/misc/cgo/test/issue7978.go b/libgo/misc/cgo/test/issue7978.go
deleted file mode 100644
index f0809d3..0000000
--- a/libgo/misc/cgo/test/issue7978.go
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2014 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.
-
-// Issue 7978. Stack tracing didn't work during cgo code after calling a Go
-// callback. Make sure GC works and the stack trace is correct.
-
-package cgotest
-
-/*
-#include <stdint.h>
-
-void issue7978cb(void);
-
-// use ugly atomic variable sync since that doesn't require calling back into
-// Go code or OS dependencies
-static void issue7978c(uint32_t *sync) {
- while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 0)
- ;
- __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
- while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 2)
- ;
- issue7978cb();
- __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
- while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 6)
- ;
-}
-*/
-import "C"
-
-import (
- "runtime"
- "runtime/debug"
- "strings"
- "sync/atomic"
- "testing"
-)
-
-var issue7978sync uint32
-
-func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
- runtime.GC()
- buf := make([]byte, 65536)
- trace := string(buf[:runtime.Stack(buf, true)])
- for _, goroutine := range strings.Split(trace, "\n\n") {
- if strings.Contains(goroutine, "test.issue7978go") {
- trace := strings.Split(goroutine, "\n")
- // look for the expected function in the stack
- for i := 0; i < depth; i++ {
- if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
- t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
- return
- }
- if strings.Contains(trace[1+2*i], wantFunc) {
- return
- }
- }
- t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
- return
- }
- }
- t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
-}
-
-func issue7978wait(store uint32, wait uint32) {
- if store != 0 {
- atomic.StoreUint32(&issue7978sync, store)
- }
- for atomic.LoadUint32(&issue7978sync) != wait {
- runtime.Gosched()
- }
-}
-
-//export issue7978cb
-func issue7978cb() {
- // Force a stack growth from the callback to put extra
- // pressure on the runtime. See issue #17785.
- growStack(64)
- issue7978wait(3, 4)
-}
-
-func growStack(n int) int {
- var buf [128]int
- if n == 0 {
- return 0
- }
- return buf[growStack(n-1)]
-}
-
-func issue7978go() {
- C.issue7978c((*C.uint32_t)(&issue7978sync))
- issue7978wait(7, 8)
-}
-
-func test7978(t *testing.T) {
- if runtime.Compiler == "gccgo" {
- t.Skip("gccgo can not do stack traces of C code")
- }
- debug.SetTraceback("2")
- issue7978sync = 0
- go issue7978go()
- // test in c code, before callback
- issue7978wait(0, 1)
- issue7978check(t, "_Cfunc_issue7978c(", "", 1)
- // test in go code, during callback
- issue7978wait(2, 3)
- issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
- // test in c code, after callback
- issue7978wait(4, 5)
- issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
- // test in go code, after return from cgo
- issue7978wait(6, 7)
- issue7978check(t, "test.issue7978go(", "", 3)
- atomic.StoreUint32(&issue7978sync, 8)
-}
diff --git a/libgo/misc/cgo/test/issue8092.go b/libgo/misc/cgo/test/issue8092.go
deleted file mode 100644
index 19123e7..0000000
--- a/libgo/misc/cgo/test/issue8092.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 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.
-
-// Issue 8092. Test that linker defined symbols (e.g., text, data) don't
-// conflict with C symbols.
-
-package cgotest
-
-/*
-char text[] = "text";
-char data[] = "data";
-char *ctext(void) { return text; }
-char *cdata(void) { return data; }
-*/
-import "C"
-
-import "testing"
-
-func test8092(t *testing.T) {
- tests := []struct {
- s string
- a, b *C.char
- }{
- {"text", &C.text[0], C.ctext()},
- {"data", &C.data[0], C.cdata()},
- }
- for _, test := range tests {
- if test.a != test.b {
- t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
- }
- if got := C.GoString(test.a); got != test.s {
- t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
- }
- }
-}
diff --git a/libgo/misc/cgo/test/issue8331a.go b/libgo/misc/cgo/test/issue8331a.go
deleted file mode 100644
index 92e2579..0000000
--- a/libgo/misc/cgo/test/issue8331a.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 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.
-
-// Issue 8331. A typedef of an unnamed struct is the same struct when
-// #include'd twice. No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include "issue8331.h"
-import "C"
-
-func issue8331a() C.issue8331 {
- return issue8331Var
-}
diff --git a/libgo/misc/cgo/test/issue8331b.go b/libgo/misc/cgo/test/issue8331b.go
deleted file mode 100644
index 5324aa2..0000000
--- a/libgo/misc/cgo/test/issue8331b.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 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.
-
-// Issue 8331. A typedef of an unnamed struct is the same struct when
-// #include'd twice. No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include "issue8331.h"
-import "C"
-
-var issue8331Var C.issue8331
diff --git a/libgo/misc/cgo/test/issue8428.go b/libgo/misc/cgo/test/issue8428.go
deleted file mode 100644
index 2e5a555..0000000
--- a/libgo/misc/cgo/test/issue8428.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 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.
-
-// This test fails on older versions of OS X because they use older buggy
-// versions of Clang that emit ambiguous DWARF info. See issue 8611.
-// +build !darwin
-
-package cgotest
-
-// Issue 8428. Cgo inconsistently translated zero size arrays.
-
-/*
-struct issue8428one {
- char b;
- char rest[];
-};
-
-struct issue8428two {
- void *p;
- char b;
- char rest[0];
- char pad;
-};
-
-struct issue8428three {
- char w[1][2][3][0];
- char x[2][3][0][1];
- char y[3][0][1][2];
- char z[0][1][2][3];
-};
-*/
-import "C"
-
-import "unsafe"
-
-var _ = C.struct_issue8428one{
- b: C.char(0),
- // The trailing rest field is not available in cgo.
- // See issue 11925.
- // rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428two{
- p: unsafe.Pointer(nil),
- b: C.char(0),
- rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428three{
- w: [1][2][3][0]C.char{},
- x: [2][3][0][1]C.char{},
- y: [3][0][1][2]C.char{},
- z: [0][1][2][3]C.char{},
-}
diff --git a/libgo/misc/cgo/test/issue8441.go b/libgo/misc/cgo/test/issue8441.go
deleted file mode 100644
index 4489ca9..0000000
--- a/libgo/misc/cgo/test/issue8441.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 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.
-
-// Issue 8368 and 8441. Recursive struct definitions didn't work.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-typedef struct one one;
-typedef struct two two;
-struct one {
- two *x;
-};
-struct two {
- one *x;
-};
-*/
-import "C"
-
-func issue8368(one *C.struct_one, two *C.struct_two) {
-}
-
-func issue8441(one *C.one, two *C.two) {
- issue8441(two.x, one.x)
-}
diff --git a/libgo/misc/cgo/test/issue8811.go b/libgo/misc/cgo/test/issue8811.go
deleted file mode 100644
index f812732..0000000
--- a/libgo/misc/cgo/test/issue8811.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 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.
-
-package cgotest
-
-/*
-extern int issue8811Initialized;
-extern void issue8811Init();
-
-void issue8811Execute() {
- if(!issue8811Initialized)
- issue8811Init();
-}
-*/
-import "C"
-
-import "testing"
-
-func test8811(t *testing.T) {
- C.issue8811Execute()
-}
diff --git a/libgo/misc/cgo/test/issue9557.go b/libgo/misc/cgo/test/issue9557.go
deleted file mode 100644
index 4e8922a..0000000
--- a/libgo/misc/cgo/test/issue9557.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 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.
-
-// cgo rewrote C.var to *_Cvar_var, but left
-// C.var.field as _Cvar.var.field. It now rewrites
-// the latter as (*_Cvar_var).field.
-// See https://golang.org/issue/9557.
-
-package cgotest
-
-// struct issue9557_t {
-// int a;
-// } test9557bar = { 42 };
-//
-// struct issue9557_t *issue9557foo = &test9557bar;
-import "C"
-import "testing"
-
-func test9557(t *testing.T) {
- // implicitly dereference a Go variable
- foo := C.issue9557foo
- if v := foo.a; v != 42 {
- t.Fatalf("foo.a expected 42, but got %d", v)
- }
-
- // explicitly dereference a C variable
- if v := (*C.issue9557foo).a; v != 42 {
- t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
- }
-
- // implicitly dereference a C variable
- if v := C.issue9557foo.a; v != 42 {
- t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
- }
-}
diff --git a/libgo/misc/cgo/test/overlaydir_test.go b/libgo/misc/cgo/test/overlaydir_test.go
new file mode 100644
index 0000000..1b5c67d
--- /dev/null
+++ b/libgo/misc/cgo/test/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package cgotest
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/test/pkg_test.go b/libgo/misc/cgo/test/pkg_test.go
new file mode 100644
index 0000000..08e075c
--- /dev/null
+++ b/libgo/misc/cgo/test/pkg_test.go
@@ -0,0 +1,69 @@
+// Copyright 2019 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.
+
+package cgotest
+
+import (
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+)
+
+// TestCrossPackageTests compiles and runs tests that depend on imports of other
+// local packages, using source code stored in the testdata directory.
+//
+// The tests in the misc directory tree do not have a valid import path in
+// GOPATH mode, so they previously used relative imports. However, relative
+// imports do not work in module mode. In order to make the test work in both
+// modes, we synthesize a GOPATH in which the module paths are equivalent, and
+// run the tests as a subprocess.
+//
+// If and when we no longer support these tests in GOPATH mode, we can remove
+// this shim and move the tests currently located in testdata back into the
+// parent directory.
+func TestCrossPackageTests(t *testing.T) {
+ switch runtime.GOOS {
+ case "android":
+ t.Skip("Can't exec cmd/go subprocess on Android.")
+ case "darwin":
+ switch runtime.GOARCH {
+ case "arm", "arm64":
+ t.Skip("Can't exec cmd/go subprocess on iOS.")
+ }
+ }
+
+ GOPATH, err := ioutil.TempDir("", "cgotest")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(GOPATH)
+
+ modRoot := filepath.Join(GOPATH, "src", "cgotest")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ t.Fatal(err)
+ }
+ if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgotest\n"), 0666); err != nil {
+ t.Fatal(err)
+ }
+
+ cmd := exec.Command("go", "test")
+ if testing.Verbose() {
+ cmd.Args = append(cmd.Args, "-v")
+ }
+ if testing.Short() {
+ cmd.Args = append(cmd.Args, "-short")
+ }
+ cmd.Dir = modRoot
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH, "PWD="+cmd.Dir)
+ out, err := cmd.CombinedOutput()
+ if err == nil {
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+ } else {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+}
diff --git a/libgo/misc/cgo/test/sigaltstack.go b/libgo/misc/cgo/test/sigaltstack.go
index 2b7a1ec..2c9b81c 100644
--- a/libgo/misc/cgo/test/sigaltstack.go
+++ b/libgo/misc/cgo/test/sigaltstack.go
@@ -55,7 +55,7 @@ import (
func testSigaltstack(t *testing.T) {
switch {
- case runtime.GOOS == "solaris", runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64"):
+ case runtime.GOOS == "solaris", runtime.GOOS == "illumos", runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64"):
t.Skipf("switching signal stack not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
case runtime.GOOS == "darwin" && runtime.GOARCH == "386":
t.Skipf("sigaltstack fails on darwin/386")
diff --git a/libgo/misc/cgo/test/test.go b/libgo/misc/cgo/test/test.go
new file mode 100644
index 0000000..2d060bf
--- /dev/null
+++ b/libgo/misc/cgo/test/test.go
@@ -0,0 +1,2104 @@
+// Copyright 2010 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.
+
+// Test cases for cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains C definitions (not just declarations)
+// and so it must NOT contain any //export directives on Go functions.
+// See testx.go for exports.
+
+package cgotest
+
+/*
+#include <complex.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <errno.h>
+#cgo LDFLAGS: -lm
+
+#ifndef WIN32
+#include <pthread.h>
+#include <signal.h>
+#endif
+
+// alignment tests
+
+typedef unsigned char Uint8;
+typedef unsigned short Uint16;
+
+typedef enum {
+ MOD1 = 0x0000,
+ MODX = 0x8000
+} SDLMod;
+
+typedef enum {
+ A1 = 1,
+ B1 = 322,
+ SDLK_LAST
+} SDLKey;
+
+typedef struct SDL_keysym {
+ Uint8 scancode;
+ SDLKey sym;
+ SDLMod mod;
+ Uint16 unicode;
+} SDL_keysym;
+
+typedef struct SDL_KeyboardEvent {
+ Uint8 typ;
+ Uint8 which;
+ Uint8 state;
+ SDL_keysym keysym;
+} SDL_KeyboardEvent;
+
+void makeEvent(SDL_KeyboardEvent *event) {
+ unsigned char *p;
+ int i;
+
+ p = (unsigned char*)event;
+ for (i=0; i<sizeof *event; i++) {
+ p[i] = i;
+ }
+}
+
+int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
+ return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
+}
+
+void cTest(SDL_KeyboardEvent *event) {
+ printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
+ event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
+ fflush(stdout);
+}
+
+// api
+
+const char *greeting = "hello, world";
+
+// basic test cases
+
+#define SHIFT(x, y) ((x)<<(y))
+#define KILO SHIFT(1, 10)
+#define UINT32VAL 0xc008427bU
+
+enum E {
+ Enum1 = 1,
+ Enum2 = 2,
+};
+
+typedef unsigned char cgo_uuid_t[20];
+
+void uuid_generate(cgo_uuid_t x) {
+ x[0] = 0;
+}
+
+struct S {
+ int x;
+};
+
+const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+
+extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
+
+enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
+
+int add(int x, int y) {
+ return x+y;
+};
+
+// complex alignment
+
+struct {
+ float x;
+ _Complex float y;
+} cplxAlign = { 3.14, 2.17 };
+
+// constants and pointer checking
+
+#define CheckConstVal 0
+
+typedef struct {
+ int *p;
+} CheckConstStruct;
+
+static void CheckConstFunc(CheckConstStruct *p, int e) {}
+
+// duplicate symbol
+
+int base_symbol = 0;
+#define alias_one base_symbol
+#define alias_two base_symbol
+
+// function pointer variables
+
+typedef int (*intFunc) ();
+
+int
+bridge_int_func(intFunc f)
+{
+ return f();
+}
+
+int fortytwo()
+{
+ return 42;
+}
+
+// issue 1222
+typedef union {
+ long align;
+} xxpthread_mutex_t;
+struct ibv_async_event {
+ union {
+ int x;
+ } element;
+};
+struct ibv_context {
+ xxpthread_mutex_t mutex;
+};
+
+// issue 1635
+// Mac OS X's gcc will generate scattered relocation 2/1 for
+// this function on Darwin/386, and 8l couldn't handle it.
+// this example is in issue 1635
+void scatter() {
+ void *p = scatter;
+ printf("scatter = %p\n", p);
+}
+
+// Adding this explicit extern declaration makes this a test for
+// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
+// It used to cause a cgo error when building with GCC 6.
+extern int hola;
+
+// this example is in issue 3253
+int hola = 0;
+int testHola() { return hola; }
+
+// issue 3250
+#ifdef WIN32
+void testSendSIG() {}
+#else
+static void *thread(void *p) {
+ const int M = 100;
+ int i;
+ (void)p;
+ for (i = 0; i < M; i++) {
+ pthread_kill(pthread_self(), SIGCHLD);
+ usleep(rand() % 20 + 5);
+ }
+ return NULL;
+}
+void testSendSIG() {
+ const int N = 20;
+ int i;
+ pthread_t tid[N];
+ for (i = 0; i < N; i++) {
+ usleep(rand() % 200 + 100);
+ pthread_create(&tid[i], 0, thread, NULL);
+ }
+ for (i = 0; i < N; i++)
+ pthread_join(tid[i], 0);
+}
+#endif
+
+// issue 3261
+// libgcc on ARM might be compiled as thumb code, but our 5l
+// can't handle that, so we have to disable this test on arm.
+#ifdef __ARMEL__
+int vabs(int x) {
+ puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
+ return (x < 0) ? -x : x;
+}
+#elif defined(__arm64__) && defined(__clang__)
+int vabs(int x) {
+ puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
+ return (x < 0) ? -x : x;
+}
+#else
+int __absvsi2(int); // dummy prototype for libgcc function
+// we shouldn't name the function abs, as gcc might use
+// the builtin one.
+int vabs(int x) { return __absvsi2(x); }
+#endif
+
+
+// issue 3729
+// access errno from void C function
+const char _expA = 0x42;
+const float _expB = 3.14159;
+const short _expC = 0x55aa;
+const int _expD = 0xdeadbeef;
+
+#ifdef WIN32
+void g(void) {}
+void g2(int x, char a, float b, short c, int d) {}
+#else
+
+void g(void) {
+ errno = E2BIG;
+}
+
+// try to pass some non-trivial arguments to function g2
+void g2(int x, char a, float b, short c, int d) {
+ if (a == _expA && b == _expB && c == _expC && d == _expD)
+ errno = x;
+ else
+ errno = -1;
+}
+#endif
+
+// issue 3945
+// Test that cgo reserves enough stack space during cgo call.
+// See https://golang.org/issue/3945 for details.
+void say() {
+ printf("%s from C\n", "hello");
+}
+
+// issue 4054 part 1 - other half in testx.go
+
+typedef enum {
+ A = 0,
+ B,
+ C,
+ D,
+ E,
+ F,
+ G,
+ H,
+ II,
+ J,
+} issue4054a;
+
+// issue 4339
+// We've historically permitted #include <>, so test it here. Issue 29333.
+#include <issue4339.h>
+
+// issue 4417
+// cmd/cgo: bool alignment/padding issue.
+// bool alignment is wrong and causing wrong arguments when calling functions.
+static int c_bool(bool a, bool b, int c, bool d, bool e) {
+ return c;
+}
+
+// issue 4857
+#cgo CFLAGS: -Werror
+const struct { int a; } *issue4857() { return (void *)0; }
+
+// issue 5224
+// Test that the #cgo CFLAGS directive works,
+// with and without platform filters.
+#cgo CFLAGS: -DCOMMON_VALUE=123
+#cgo windows CFLAGS: -DIS_WINDOWS=1
+#cgo !windows CFLAGS: -DIS_WINDOWS=0
+int common = COMMON_VALUE;
+int is_windows = IS_WINDOWS;
+
+// issue 5227
+// linker incorrectly treats common symbols and
+// leaves them undefined.
+
+typedef struct {
+ int Count;
+} Fontinfo;
+
+Fontinfo SansTypeface;
+
+extern void init();
+
+Fontinfo loadfont() {
+ Fontinfo f = {0};
+ return f;
+}
+
+void init() {
+ SansTypeface = loadfont();
+}
+
+// issue 5242
+// Cgo incorrectly computed the alignment of structs
+// with no Go accessible fields as 0, and then panicked on
+// modulo-by-zero computations.
+typedef struct {
+} foo;
+
+typedef struct {
+ int x : 1;
+} bar;
+
+int issue5242(foo f, bar b) {
+ return 5242;
+}
+
+// issue 5337
+// Verify that we can withstand SIGPROF received on foreign threads
+
+#ifdef WIN32
+void test5337() {}
+#else
+static void *thread1(void *p) {
+ (void)p;
+ pthread_kill(pthread_self(), SIGPROF);
+ return NULL;
+}
+void test5337() {
+ pthread_t tid;
+ pthread_create(&tid, 0, thread1, NULL);
+ pthread_join(tid, 0);
+}
+#endif
+
+// issue 5603
+
+const long long issue5603exp = 0x12345678;
+long long issue5603foo0() { return issue5603exp; }
+long long issue5603foo1(void *p) { return issue5603exp; }
+long long issue5603foo2(void *p, void *q) { return issue5603exp; }
+long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
+long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
+
+// issue 5740
+
+int test5740a(void), test5740b(void);
+
+// issue 5986
+static void output5986()
+{
+ int current_row = 0, row_count = 0;
+ double sum_squares = 0;
+ double d;
+ do {
+ if (current_row == 10) {
+ current_row = 0;
+ }
+ ++row_count;
+ }
+ while (current_row++ != 1);
+ d = sqrt(sum_squares / row_count);
+ printf("sqrt is: %g\n", d);
+}
+
+// issue 6128
+// Test handling of #defined names in clang.
+// NOTE: Must use hex, or else a shortcut for decimals
+// in cgo avoids trying to pass this to clang.
+#define X 0x1
+
+// issue 6472
+typedef struct
+{
+ struct
+ {
+ int x;
+ } y[16];
+} z;
+
+// issue 6612
+// Test new scheme for deciding whether C.name is an expression, type, constant.
+// Clang silences some warnings when the name is a #defined macro, so test those too
+// (even though we now use errors exclusively, not warnings).
+
+void myfunc(void) {}
+int myvar = 5;
+const char *mytext = "abcdef";
+typedef int mytype;
+enum {
+ myenum = 1234,
+};
+
+#define myfunc_def myfunc
+#define myvar_def myvar
+#define mytext_def mytext
+#define mytype_def mytype
+#define myenum_def myenum
+#define myint_def 12345
+#define myfloat_def 1.5
+#define mystring_def "hello"
+
+// issue 6907
+char* Issue6907CopyString(_GoString_ s) {
+ size_t n;
+ const char *p;
+ char *r;
+
+ n = _GoStringLen(s);
+ p = _GoStringPtr(s);
+ r = malloc(n + 1);
+ memmove(r, p, n);
+ r[n] = '\0';
+ return r;
+}
+
+// issue 7560
+typedef struct {
+ char x;
+ long y;
+} __attribute__((__packed__)) misaligned;
+
+int
+offset7560(void)
+{
+ return (uintptr_t)&((misaligned*)0)->y;
+}
+
+// issue 7786
+// No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
+
+struct test7786;
+typedef struct test7786 typedef_test7786;
+void f7786(struct test7786 *ctx) {}
+void g7786(typedef_test7786 *ctx) {}
+
+typedef struct body7786 typedef_body7786;
+struct body7786 { int x; };
+void b7786(struct body7786 *ctx) {}
+void c7786(typedef_body7786 *ctx) {}
+
+typedef union union7786 typedef_union7786;
+void u7786(union union7786 *ctx) {}
+void v7786(typedef_union7786 *ctx) {}
+
+// issue 8092
+// Test that linker defined symbols (e.g., text, data) don't
+// conflict with C symbols.
+char text[] = "text";
+char data[] = "data";
+char *ctext(void) { return text; }
+char *cdata(void) { return data; }
+
+// issue 8428
+// Cgo inconsistently translated zero size arrays.
+
+struct issue8428one {
+ char b;
+ char rest[];
+};
+
+struct issue8428two {
+ void *p;
+ char b;
+ char rest[0];
+ char pad;
+};
+
+struct issue8428three {
+ char w[1][2][3][0];
+ char x[2][3][0][1];
+ char y[3][0][1][2];
+ char z[0][1][2][3];
+};
+
+// issue 8331 part 1 - part 2 in testx.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice. No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 8368 and 8441
+// Recursive struct definitions didn't work.
+// No runtime test; just make sure it compiles.
+typedef struct one one;
+typedef struct two two;
+struct one {
+ two *x;
+};
+struct two {
+ one *x;
+};
+
+// issue 8811
+
+extern int issue8811Initialized;
+extern void issue8811Init();
+
+void issue8811Execute() {
+ if(!issue8811Initialized)
+ issue8811Init();
+}
+
+// issue 9557
+
+struct issue9557_t {
+ int a;
+} test9557bar = { 42 };
+struct issue9557_t *issue9557foo = &test9557bar;
+
+// issue 10303
+// Pointers passed to C were not marked as escaping (bug in cgo).
+
+typedef int *intptr;
+
+void setintstar(int *x) {
+ *x = 1;
+}
+
+void setintptr(intptr x) {
+ *x = 1;
+}
+
+void setvoidptr(void *x) {
+ *(int*)x = 1;
+}
+
+typedef struct Struct Struct;
+struct Struct {
+ int *P;
+};
+
+void setstruct(Struct s) {
+ *s.P = 1;
+}
+
+// issue 11925
+// Structs with zero-length trailing fields are now padded by the Go compiler.
+
+struct a11925 {
+ int i;
+ char a[0];
+ char b[0];
+};
+
+struct b11925 {
+ int i;
+ char a[0];
+ char b[];
+};
+
+// issue 12030
+void issue12030conv(char *buf, double x) {
+ sprintf(buf, "d=%g", x);
+}
+
+// issue 14838
+
+int check_cbytes(char *b, size_t l) {
+ int i;
+ for (i = 0; i < l; i++) {
+ if (b[i] != i) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+// issue 17065
+// Test that C symbols larger than a page play nicely with the race detector.
+int ii[65537];
+
+// issue 17537
+// The void* cast introduced by cgo to avoid problems
+// with const/volatile qualifiers breaks C preprocessor macros that
+// emulate functions.
+
+typedef struct {
+ int i;
+} S17537;
+
+int I17537(S17537 *p);
+
+#define I17537(p) ((p)->i)
+
+// Calling this function used to fail without the cast.
+const int F17537(const char **p) {
+ return **p;
+}
+
+// issue 17723
+// API compatibility checks
+
+typedef char *cstring_pointer;
+static void cstring_pointer_fun(cstring_pointer dummy) { }
+const char *api_hello = "hello!";
+
+// Calling this function used to trigger an error from the C compiler
+// (issue 18298).
+void F18298(const void *const *p) {
+}
+
+// Test that conversions between typedefs work as they used to.
+typedef const void *T18298_1;
+struct S18298 { int i; };
+typedef const struct S18298 *T18298_2;
+void G18298(T18298_1 t) {
+}
+
+// issue 18126
+// cgo check of void function returning errno.
+void Issue18126C(void **p) {}
+
+// issue 18720
+
+#define HELLO "hello"
+#define WORLD "world"
+#define HELLO_WORLD HELLO "\000" WORLD
+
+struct foo { char c; };
+#define SIZE_OF(x) sizeof(x)
+#define SIZE_OF_FOO SIZE_OF(struct foo)
+#define VAR1 VAR
+#define VAR var
+int var = 5;
+
+#define ADDR &var
+
+#define CALL fn()
+int fn(void) {
+ return ++var;
+}
+
+// issue 20129
+
+int issue20129 = 0;
+typedef void issue20129Void;
+issue20129Void issue20129Foo() {
+ issue20129 = 1;
+}
+typedef issue20129Void issue20129Void2;
+issue20129Void2 issue20129Bar() {
+ issue20129 = 2;
+}
+
+// issue 20369
+#define XUINT64_MAX 18446744073709551615ULL
+
+// issue 21668
+// Fail to guess the kind of the constant "x".
+// No runtime test; just make sure it compiles.
+const int x21668 = 42;
+
+// issue 21708
+#define CAST_TO_INT64 (int64_t)(-1)
+
+// issue 21809
+// Compile C `typedef` to go type aliases.
+
+typedef long MySigned_t;
+// tests alias-to-alias
+typedef MySigned_t MySigned2_t;
+long takes_long(long x) { return x * x; }
+MySigned_t takes_typedef(MySigned_t x) { return x * x; }
+
+// issue 22906
+
+// It's going to be hard to include a whole real JVM to test this.
+// So we'll simulate a really easy JVM using just the parts we need.
+// This is the relevant part of jni.h.
+
+struct _jobject;
+
+typedef struct _jobject *jobject;
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+typedef jobject jweak;
+
+// Note: jvalue is already a non-pointer type due to it being a C union.
+
+// issue 22958
+
+typedef struct {
+ unsigned long long f8 : 8;
+ unsigned long long f16 : 16;
+ unsigned long long f24 : 24;
+ unsigned long long f32 : 32;
+ unsigned long long f40 : 40;
+ unsigned long long f48 : 48;
+ unsigned long long f56 : 56;
+ unsigned long long f64 : 64;
+} issue22958Type;
+
+// issue 23356
+int a(void) { return 5; };
+int r(void) { return 3; };
+
+// issue 23720
+typedef int *issue23720A;
+typedef const int *issue23720B;
+void issue23720F(issue23720B a) {}
+
+// issue 24206
+#if defined(__linux__) && defined(__x86_64__)
+#include <sys/mman.h>
+// Returns string with null byte at the last valid address
+char* dangerousString1() {
+ int pageSize = 4096;
+ char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+ mprotect(data + pageSize,pageSize,PROT_NONE);
+ int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+ int i = start;
+ for (; i < pageSize; i++) {
+ data[i] = 'x';
+ }
+ data[pageSize -1 ] = 0;
+ return data+start;
+}
+
+char* dangerousString2() {
+ int pageSize = 4096;
+ char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+ mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
+ int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+ int i = start;
+ for (; i < 2 * pageSize; i++) {
+ data[i] = 'x';
+ }
+ data[2*pageSize -1 ] = 0;
+ return data+start;
+}
+#else
+char *dangerousString1() { return NULL; }
+char *dangerousString2() { return NULL; }
+#endif
+
+// issue 26066
+const unsigned long long int issue26066 = (const unsigned long long) -1;
+
+// issue 26517
+// Introduce two pointer types which are distinct, but have the same
+// base type. Make sure that both of those pointer types get resolved
+// correctly. Before the fix for 26517 if one of these pointer types
+// was resolved before the other one was processed, the second one
+// would never be resolved.
+// Before this issue was fixed this test failed on Windows,
+// where va_list expands to a named char* type.
+typedef va_list TypeOne;
+typedef char *TypeTwo;
+
+// issue 28540
+
+static void twoargs1(void *p, int n) {}
+static void *twoargs2() { return 0; }
+static int twoargs3(void * p) { return 0; }
+
+// issue 28545
+// Failed to add type conversion for negative constant.
+
+static void issue28545F(char **p, int n, complex double a) {}
+
+// issue 28772 part 1 - part 2 in testx.go
+// Failed to add type conversion for Go constant set to C constant.
+// No runtime test; just make sure it compiles.
+
+#define issue28772Constant 1
+
+// issue 28896
+// cgo was incorrectly adding padding after a packed struct.
+typedef struct {
+ void *f1;
+ uint32_t f2;
+} __attribute__((__packed__)) innerPacked;
+
+typedef struct {
+ innerPacked g1;
+ uint64_t g2;
+} outerPacked;
+
+typedef struct {
+ void *f1;
+ uint32_t f2;
+} innerUnpacked;
+
+typedef struct {
+ innerUnpacked g1;
+ uint64_t g2;
+} outerUnpacked;
+
+size_t offset(int x) {
+ switch (x) {
+ case 0:
+ return offsetof(innerPacked, f2);
+ case 1:
+ return offsetof(outerPacked, g2);
+ case 2:
+ return offsetof(innerUnpacked, f2);
+ case 3:
+ return offsetof(outerUnpacked, g2);
+ default:
+ abort();
+ }
+}
+
+// issue 29748
+
+typedef struct { char **p; } S29748;
+static int f29748(S29748 *p) { return 0; }
+
+// issue 29781
+// Error with newline inserted into constant expression.
+// Compilation test only, nothing to run.
+
+static void issue29781F(char **p, int n) {}
+#define ISSUE29781C 0
+
+// issue 31093
+static uint16_t issue31093F(uint16_t v) { return v; }
+
+// issue 32579
+typedef struct S32579 { unsigned char data[1]; } S32579;
+*/
+import "C"
+
+import (
+ "context"
+ "fmt"
+ "math"
+ "math/rand"
+ "os"
+ "os/signal"
+ "reflect"
+ "runtime"
+ "sync"
+ "syscall"
+ "testing"
+ "time"
+ "unsafe"
+)
+
+// alignment
+
+func testAlign(t *testing.T) {
+ var evt C.SDL_KeyboardEvent
+ C.makeEvent(&evt)
+ if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
+ t.Error("*** bad alignment")
+ C.cTest(&evt)
+ t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
+ evt.typ, evt.which, evt.state, evt.keysym.scancode,
+ evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
+ t.Error(evt)
+ }
+}
+
+// api
+
+const greeting = "hello, world"
+
+type testPair struct {
+ Name string
+ Got, Want interface{}
+}
+
+var testPairs = []testPair{
+ {"GoString", C.GoString(C.greeting), greeting},
+ {"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
+ {"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
+}
+
+func testHelpers(t *testing.T) {
+ for _, pair := range testPairs {
+ if !reflect.DeepEqual(pair.Got, pair.Want) {
+ t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
+ }
+ }
+}
+
+// basic test cases
+
+const EINVAL = C.EINVAL /* test #define */
+
+var KILO = C.KILO
+
+func uuidgen() {
+ var uuid C.cgo_uuid_t
+ C.uuid_generate(&uuid[0])
+}
+
+func Strtol(s string, base int) (int, error) {
+ p := C.CString(s)
+ n, err := C.strtol(p, nil, C.int(base))
+ C.free(unsafe.Pointer(p))
+ return int(n), err
+}
+
+func Atol(s string) int {
+ p := C.CString(s)
+ n := C.atol(p)
+ C.free(unsafe.Pointer(p))
+ return int(n)
+}
+
+func testConst(t *testing.T) {
+ C.myConstFunc(nil, 0, nil)
+}
+
+func testEnum(t *testing.T) {
+ if C.Enum1 != 1 || C.Enum2 != 2 {
+ t.Error("bad enum", C.Enum1, C.Enum2)
+ }
+}
+
+func testAtol(t *testing.T) {
+ l := Atol("123")
+ if l != 123 {
+ t.Error("Atol 123: ", l)
+ }
+}
+
+func testErrno(t *testing.T) {
+ p := C.CString("no-such-file")
+ m := C.CString("r")
+ f, err := C.fopen(p, m)
+ C.free(unsafe.Pointer(p))
+ C.free(unsafe.Pointer(m))
+ if err == nil {
+ C.fclose(f)
+ t.Fatalf("C.fopen: should fail")
+ }
+ if err != syscall.ENOENT {
+ t.Fatalf("C.fopen: unexpected error: %v", err)
+ }
+}
+
+func testMultipleAssign(t *testing.T) {
+ p := C.CString("234")
+ n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
+ if runtime.GOOS == "openbsd" {
+ // Bug in OpenBSD strtol(3) - base > 36 succeeds.
+ if (n != 0 && n != 239089) || m != 234 {
+ t.Fatal("Strtol x2: ", n, m)
+ }
+ } else if n != 0 || m != 234 {
+ t.Fatal("Strtol x2: ", n, m)
+ }
+ C.free(unsafe.Pointer(p))
+}
+
+var (
+ cuint = (C.uint)(0)
+ culong C.ulong
+ cchar C.char
+)
+
+type Context struct {
+ ctx *C.struct_ibv_context
+}
+
+func benchCgoCall(b *testing.B) {
+ const x = C.int(2)
+ const y = C.int(3)
+ for i := 0; i < b.N; i++ {
+ C.add(x, y)
+ }
+}
+
+var sinkString string
+
+func benchGoString(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ sinkString = C.GoString(C.cstr)
+ }
+ const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+ if sinkString != want {
+ b.Fatalf("%q != %q", sinkString, want)
+ }
+}
+
+// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
+func sliceOperands(array [2000]int) {
+ _ = array[C.KILO:C.KILO:C.KILO] // no type error
+}
+
+// set in cgo_thread_lock.go init
+var testThreadLockFunc = func(*testing.T) {}
+
+// complex alignment
+
+func TestComplexAlign(t *testing.T) {
+ if C.cplxAlign.x != 3.14 {
+ t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
+ }
+ if C.cplxAlign.y != 2.17 {
+ t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
+ }
+}
+
+// constants and pointer checking
+
+func testCheckConst(t *testing.T) {
+ // The test is that this compiles successfully.
+ p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
+ defer C.free(p)
+ C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
+}
+
+// duplicate symbol
+
+func duplicateSymbols() {
+ fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
+}
+
+// environment
+
+// This is really an os package test but here for convenience.
+func testSetEnv(t *testing.T) {
+ if runtime.GOOS == "windows" {
+ // Go uses SetEnvironmentVariable on windows. However,
+ // C runtime takes a *copy* at process startup of the
+ // OS environment, and stores it in environ/envp.
+ // It is this copy that getenv/putenv manipulate.
+ t.Logf("skipping test")
+ return
+ }
+ const key = "CGO_OS_TEST_KEY"
+ const val = "CGO_OS_TEST_VALUE"
+ os.Setenv(key, val)
+ keyc := C.CString(key)
+ defer C.free(unsafe.Pointer(keyc))
+ v := C.getenv(keyc)
+ if uintptr(unsafe.Pointer(v)) == 0 {
+ t.Fatal("getenv returned NULL")
+ }
+ vs := C.GoString(v)
+ if vs != val {
+ t.Fatalf("getenv() = %q; want %q", vs, val)
+ }
+}
+
+// function pointer variables
+
+func callBridge(f C.intFunc) int {
+ return int(C.bridge_int_func(f))
+}
+
+func callCBridge(f C.intFunc) C.int {
+ return C.bridge_int_func(f)
+}
+
+func testFpVar(t *testing.T) {
+ const expected = 42
+ f := C.intFunc(C.fortytwo)
+ res1 := C.bridge_int_func(f)
+ if r1 := int(res1); r1 != expected {
+ t.Errorf("got %d, want %d", r1, expected)
+ }
+ res2 := callCBridge(f)
+ if r2 := int(res2); r2 != expected {
+ t.Errorf("got %d, want %d", r2, expected)
+ }
+ r3 := callBridge(f)
+ if r3 != expected {
+ t.Errorf("got %d, want %d", r3, expected)
+ }
+}
+
+// issue 1222
+type AsyncEvent struct {
+ event C.struct_ibv_async_event
+}
+
+// issue 1635
+
+func test1635(t *testing.T) {
+ C.scatter()
+ if v := C.hola; v != 0 {
+ t.Fatalf("C.hola is %d, should be 0", v)
+ }
+ if v := C.testHola(); v != 0 {
+ t.Fatalf("C.testHola() is %d, should be 0", v)
+ }
+}
+
+// issue 2470
+
+func testUnsignedInt(t *testing.T) {
+ a := (int64)(C.UINT32VAL)
+ b := (int64)(0xc008427b)
+ if a != b {
+ t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
+ }
+}
+
+// issue 3250
+
+func test3250(t *testing.T) {
+ if runtime.GOOS == "windows" {
+ t.Skip("not applicable on windows")
+ }
+
+ t.Skip("skipped, see golang.org/issue/5885")
+ var (
+ thres = 1
+ sig = syscall_dot_SIGCHLD
+ )
+ type result struct {
+ n int
+ sig os.Signal
+ }
+ var (
+ sigCh = make(chan os.Signal, 10)
+ waitStart = make(chan struct{})
+ waitDone = make(chan result)
+ )
+
+ signal.Notify(sigCh, sig)
+
+ go func() {
+ n := 0
+ alarm := time.After(time.Second * 3)
+ for {
+ select {
+ case <-waitStart:
+ waitStart = nil
+ case v := <-sigCh:
+ n++
+ if v != sig || n > thres {
+ waitDone <- result{n, v}
+ return
+ }
+ case <-alarm:
+ waitDone <- result{n, sig}
+ return
+ }
+ }
+ }()
+
+ waitStart <- struct{}{}
+ C.testSendSIG()
+ r := <-waitDone
+ if r.sig != sig {
+ t.Fatalf("received signal %v, but want %v", r.sig, sig)
+ }
+ t.Logf("got %d signals\n", r.n)
+ if r.n <= thres {
+ t.Fatalf("expected more than %d", thres)
+ }
+}
+
+// issue 3261
+
+func testLibgcc(t *testing.T) {
+ var table = []struct {
+ in, out C.int
+ }{
+ {0, 0},
+ {1, 1},
+ {-42, 42},
+ {1000300, 1000300},
+ {1 - 1<<31, 1<<31 - 1},
+ }
+ for _, v := range table {
+ if o := C.vabs(v.in); o != v.out {
+ t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
+ return
+ }
+ }
+}
+
+// issue 3729
+
+func test3729(t *testing.T) {
+ if runtime.GOOS == "windows" {
+ t.Skip("skipping on windows")
+ }
+
+ _, e := C.g()
+ if e != syscall.E2BIG {
+ t.Errorf("got %q, expect %q", e, syscall.E2BIG)
+ }
+ _, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
+ if e != syscall.EINVAL {
+ t.Errorf("got %q, expect %q", e, syscall.EINVAL)
+ }
+}
+
+// issue 3945
+
+func testPrintf(t *testing.T) {
+ C.say()
+}
+
+// issue 4054
+
+var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
+
+// issue 4339
+
+func test4339(t *testing.T) {
+ C.handle4339(&C.exported4339)
+}
+
+// issue 4417
+
+func testBoolAlign(t *testing.T) {
+ b := C.c_bool(true, true, 10, true, false)
+ if b != 10 {
+ t.Fatalf("found %d expected 10\n", b)
+ }
+ b = C.c_bool(true, true, 5, true, true)
+ if b != 5 {
+ t.Fatalf("found %d expected 5\n", b)
+ }
+ b = C.c_bool(true, true, 3, true, false)
+ if b != 3 {
+ t.Fatalf("found %d expected 3\n", b)
+ }
+ b = C.c_bool(false, false, 1, true, false)
+ if b != 1 {
+ t.Fatalf("found %d expected 1\n", b)
+ }
+ b = C.c_bool(false, true, 200, true, false)
+ if b != 200 {
+ t.Fatalf("found %d expected 200\n", b)
+ }
+}
+
+// issue 4857
+
+func test4857() {
+ _ = C.issue4857()
+}
+
+// issue 5224
+
+func testCflags(t *testing.T) {
+ is_windows := C.is_windows == 1
+ if is_windows != (runtime.GOOS == "windows") {
+ t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
+ }
+ if C.common != 123 {
+ t.Errorf("common: %v (expected 123)", C.common)
+ }
+}
+
+// issue 5227
+
+func test5227(t *testing.T) {
+ C.init()
+}
+
+func selectfont() C.Fontinfo {
+ return C.SansTypeface
+}
+
+// issue 5242
+
+func test5242(t *testing.T) {
+ if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
+ t.Errorf("got %v", got)
+ }
+}
+
+func test5603(t *testing.T) {
+ var x [5]int64
+ exp := int64(C.issue5603exp)
+ x[0] = int64(C.issue5603foo0())
+ x[1] = int64(C.issue5603foo1(nil))
+ x[2] = int64(C.issue5603foo2(nil, nil))
+ x[3] = int64(C.issue5603foo3(nil, nil, nil))
+ x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
+ for i, v := range x {
+ if v != exp {
+ t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
+ }
+ }
+}
+
+// issue 5337
+
+func test5337(t *testing.T) {
+ C.test5337()
+}
+
+// issue 5740
+
+func test5740(t *testing.T) {
+ if v := C.test5740a() + C.test5740b(); v != 5 {
+ t.Errorf("expected 5, got %v", v)
+ }
+}
+
+// issue 5986
+
+func test5986(t *testing.T) {
+ C.output5986()
+}
+
+// issue 6128
+
+func test6128() {
+ // nothing to run, just make sure this compiles.
+ _ = C.X
+}
+
+// issue 6390
+
+func test6390(t *testing.T) {
+ p1 := C.malloc(1024)
+ if p1 == nil {
+ t.Fatalf("C.malloc(1024) returned nil")
+ }
+ p2 := C.malloc(0)
+ if p2 == nil {
+ t.Fatalf("C.malloc(0) returned nil")
+ }
+ C.free(p1)
+ C.free(p2)
+}
+
+func test6472() {
+ // nothing to run, just make sure this compiles
+ s := new(C.z)
+ println(s.y[0].x)
+}
+
+// issue 6506
+
+func test6506() {
+ // nothing to run, just make sure this compiles
+ var x C.size_t
+
+ C.calloc(x, x)
+ C.malloc(x)
+ C.realloc(nil, x)
+ C.memcpy(nil, nil, x)
+ C.memcmp(nil, nil, x)
+ C.memmove(nil, nil, x)
+ C.strncpy(nil, nil, x)
+ C.strncmp(nil, nil, x)
+ C.strncat(nil, nil, x)
+ x = C.strxfrm(nil, nil, x)
+ C.memchr(nil, 0, x)
+ x = C.strcspn(nil, nil)
+ x = C.strspn(nil, nil)
+ C.memset(nil, 0, x)
+ x = C.strlen(nil)
+ _ = x
+}
+
+// issue 6612
+
+func testNaming(t *testing.T) {
+ C.myfunc()
+ C.myfunc_def()
+ if v := C.myvar; v != 5 {
+ t.Errorf("C.myvar = %d, want 5", v)
+ }
+ if v := C.myvar_def; v != 5 {
+ t.Errorf("C.myvar_def = %d, want 5", v)
+ }
+ if s := C.GoString(C.mytext); s != "abcdef" {
+ t.Errorf("C.mytext = %q, want %q", s, "abcdef")
+ }
+ if s := C.GoString(C.mytext_def); s != "abcdef" {
+ t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
+ }
+ if c := C.myenum; c != 1234 {
+ t.Errorf("C.myenum = %v, want 1234", c)
+ }
+ if c := C.myenum_def; c != 1234 {
+ t.Errorf("C.myenum_def = %v, want 1234", c)
+ }
+ {
+ const c = C.myenum
+ if c != 1234 {
+ t.Errorf("C.myenum as const = %v, want 1234", c)
+ }
+ }
+ {
+ const c = C.myenum_def
+ if c != 1234 {
+ t.Errorf("C.myenum as const = %v, want 1234", c)
+ }
+ }
+ if c := C.myint_def; c != 12345 {
+ t.Errorf("C.myint_def = %v, want 12345", c)
+ }
+ {
+ const c = C.myint_def
+ if c != 12345 {
+ t.Errorf("C.myint as const = %v, want 12345", c)
+ }
+ }
+
+ if c := C.myfloat_def; c != 1.5 {
+ t.Errorf("C.myint_def = %v, want 1.5", c)
+ }
+ {
+ const c = C.myfloat_def
+ if c != 1.5 {
+ t.Errorf("C.myint as const = %v, want 1.5", c)
+ }
+ }
+
+ if s := C.mystring_def; s != "hello" {
+ t.Errorf("C.mystring_def = %q, want %q", s, "hello")
+ }
+}
+
+// issue 6907
+
+func test6907(t *testing.T) {
+ want := "yarn"
+ if got := C.GoString(C.Issue6907CopyString(want)); got != want {
+ t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
+ }
+}
+
+// issue 7560
+
+func test7560(t *testing.T) {
+ // some mingw don't implement __packed__ correctly.
+ if C.offset7560() != 1 {
+ t.Skip("C compiler did not pack struct")
+ }
+
+ // C.misaligned should have x but then a padding field to get to the end of the struct.
+ // There should not be a field named 'y'.
+ var v C.misaligned
+ rt := reflect.TypeOf(&v).Elem()
+ if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
+ t.Errorf("unexpected fields in C.misaligned:\n")
+ for i := 0; i < rt.NumField(); i++ {
+ t.Logf("%+v\n", rt.Field(i))
+ }
+ }
+}
+
+// issue 7786
+
+func f() {
+ var x1 *C.typedef_test7786
+ var x2 *C.struct_test7786
+ x1 = x2
+ x2 = x1
+ C.f7786(x1)
+ C.f7786(x2)
+ C.g7786(x1)
+ C.g7786(x2)
+
+ var b1 *C.typedef_body7786
+ var b2 *C.struct_body7786
+ b1 = b2
+ b2 = b1
+ C.b7786(b1)
+ C.b7786(b2)
+ C.c7786(b1)
+ C.c7786(b2)
+
+ var u1 *C.typedef_union7786
+ var u2 *C.union_union7786
+ u1 = u2
+ u2 = u1
+ C.u7786(u1)
+ C.u7786(u2)
+ C.v7786(u1)
+ C.v7786(u2)
+}
+
+// issue 8092
+
+func test8092(t *testing.T) {
+ tests := []struct {
+ s string
+ a, b *C.char
+ }{
+ {"text", &C.text[0], C.ctext()},
+ {"data", &C.data[0], C.cdata()},
+ }
+ for _, test := range tests {
+ if test.a != test.b {
+ t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
+ }
+ if got := C.GoString(test.a); got != test.s {
+ t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
+ }
+ }
+}
+
+// issues 8368 and 8441
+
+func issue8368(one *C.struct_one, two *C.struct_two) {
+}
+
+func issue8441(one *C.one, two *C.two) {
+ issue8441(two.x, one.x)
+}
+
+// issue 8428
+
+var _ = C.struct_issue8428one{
+ b: C.char(0),
+ // The trailing rest field is not available in cgo.
+ // See issue 11925.
+ // rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428two{
+ p: unsafe.Pointer(nil),
+ b: C.char(0),
+ rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428three{
+ w: [1][2][3][0]C.char{},
+ x: [2][3][0][1]C.char{},
+ y: [3][0][1][2]C.char{},
+ z: [0][1][2][3]C.char{},
+}
+
+// issue 8811
+
+func test8811(t *testing.T) {
+ C.issue8811Execute()
+}
+
+// issue 9557
+
+func test9557(t *testing.T) {
+ // implicitly dereference a Go variable
+ foo := C.issue9557foo
+ if v := foo.a; v != 42 {
+ t.Fatalf("foo.a expected 42, but got %d", v)
+ }
+
+ // explicitly dereference a C variable
+ if v := (*C.issue9557foo).a; v != 42 {
+ t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
+ }
+
+ // implicitly dereference a C variable
+ if v := C.issue9557foo.a; v != 42 {
+ t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
+ }
+}
+
+// issue 8331 part 1
+
+func issue8331a() C.issue8331 {
+ return issue8331Var
+}
+
+// issue 10303
+
+func test10303(t *testing.T, n int) {
+ if runtime.Compiler == "gccgo" {
+ t.Skip("gccgo permits C pointers on the stack")
+ }
+
+ // Run at a few different stack depths just to avoid an unlucky pass
+ // due to variables ending up on different pages.
+ if n > 0 {
+ test10303(t, n-1)
+ }
+ if t.Failed() {
+ return
+ }
+ var x, y, z, v, si C.int
+ var s C.Struct
+ C.setintstar(&x)
+ C.setintptr(&y)
+ C.setvoidptr(unsafe.Pointer(&v))
+ s.P = &si
+ C.setstruct(s)
+
+ if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+ t.Error("C int* argument on stack")
+ }
+ if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+ t.Error("C intptr argument on stack")
+ }
+ if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+ t.Error("C void* argument on stack")
+ }
+ if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+ t.Error("C struct field pointer on stack")
+ }
+}
+
+// issue 11925
+
+func test11925(t *testing.T) {
+ if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
+ t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
+ }
+ if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
+ t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
+ }
+}
+
+// issue 12030
+
+func test12030(t *testing.T) {
+ buf := (*C.char)(C.malloc(256))
+ defer C.free(unsafe.Pointer(buf))
+ for _, f := range []float64{1.0, 2.0, 3.14} {
+ C.issue12030conv(buf, C.double(f))
+ got := C.GoString(buf)
+ if want := fmt.Sprintf("d=%g", f); got != want {
+ t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
+ }
+ }
+}
+
+// issue 13402
+
+var _ C.complexfloat
+var _ C.complexdouble
+
+// issue 13930
+// Test that cgo's multiple-value special form for
+// C function calls works in variable declaration statements.
+
+var _, _ = C.abs(0)
+
+// issue 14838
+
+func test14838(t *testing.T) {
+ data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+ cData := C.CBytes(data)
+ defer C.free(cData)
+
+ if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
+ t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
+ }
+}
+
+// issue 17065
+
+var sink C.int
+
+func test17065(t *testing.T) {
+ if runtime.GOOS == "darwin" {
+ t.Skip("broken on darwin; issue 17065")
+ }
+ for i := range C.ii {
+ sink = C.ii[i]
+ }
+}
+
+// issue 17537
+
+func test17537(t *testing.T) {
+ v := C.S17537{i: 17537}
+ if got, want := C.I17537(&v), C.int(17537); got != want {
+ t.Errorf("got %d, want %d", got, want)
+ }
+
+ p := (*C.char)(C.malloc(1))
+ *p = 17
+ if got, want := C.F17537(&p), C.int(17); got != want {
+ t.Errorf("got %d, want %d", got, want)
+ }
+
+ C.F18298(nil)
+ var v18298 C.T18298_2
+ C.G18298(C.T18298_1(v18298))
+}
+
+// issue 17723
+
+func testAPI() {
+ var cs *C.char
+ cs = C.CString("hello")
+ defer C.free(unsafe.Pointer(cs))
+ var s string
+ s = C.GoString((*C.char)(C.api_hello))
+ s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
+ var b []byte
+ b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
+ _, _ = s, b
+ C.cstring_pointer_fun(nil)
+}
+
+// issue 18126
+
+func test18126(t *testing.T) {
+ p := C.malloc(1)
+ _, err := C.Issue18126C(&p)
+ C.free(p)
+ _ = err
+}
+
+// issue 18720
+
+func test18720(t *testing.T) {
+ if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
+ t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
+ }
+
+ if got, want := C.VAR1, C.int(5); got != want {
+ t.Errorf("C.VAR1 == %v, expected %v", got, want)
+ }
+
+ if got, want := *C.ADDR, C.int(5); got != want {
+ t.Errorf("*C.ADDR == %v, expected %v", got, want)
+ }
+
+ if got, want := C.CALL, C.int(6); got != want {
+ t.Errorf("C.CALL == %v, expected %v", got, want)
+ }
+
+ if got, want := C.CALL, C.int(7); got != want {
+ t.Errorf("C.CALL == %v, expected %v", got, want)
+ }
+
+ // Issue 20125.
+ if got, want := C.SIZE_OF_FOO, 1; got != want {
+ t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
+ }
+}
+
+// issue 20129
+
+func test20129(t *testing.T) {
+ if C.issue20129 != 0 {
+ t.Fatal("test is broken")
+ }
+ C.issue20129Foo()
+ if C.issue20129 != 1 {
+ t.Errorf("got %v but expected %v", C.issue20129, 1)
+ }
+ C.issue20129Bar()
+ if C.issue20129 != 2 {
+ t.Errorf("got %v but expected %v", C.issue20129, 2)
+ }
+}
+
+// issue 20369
+
+func test20369(t *testing.T) {
+ if C.XUINT64_MAX != math.MaxUint64 {
+ t.Fatalf("got %v, want %v", uint64(C.XUINT64_MAX), uint64(math.MaxUint64))
+ }
+}
+
+// issue 21668
+
+var issue21668_X = C.x21668
+
+// issue 21708
+
+func test21708(t *testing.T) {
+ if got, want := C.CAST_TO_INT64, -1; got != want {
+ t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
+ }
+}
+
+// issue 21809
+
+func test21809(t *testing.T) {
+ longVar := C.long(3)
+ typedefVar := C.MySigned_t(4)
+ typedefTypedefVar := C.MySigned2_t(5)
+
+ // all three should be considered identical to `long`
+ if ret := C.takes_long(longVar); ret != 9 {
+ t.Errorf("got %v but expected %v", ret, 9)
+ }
+ if ret := C.takes_long(typedefVar); ret != 16 {
+ t.Errorf("got %v but expected %v", ret, 16)
+ }
+ if ret := C.takes_long(typedefTypedefVar); ret != 25 {
+ t.Errorf("got %v but expected %v", ret, 25)
+ }
+
+ // They should also be identical to the typedef'd type
+ if ret := C.takes_typedef(longVar); ret != 9 {
+ t.Errorf("got %v but expected %v", ret, 9)
+ }
+ if ret := C.takes_typedef(typedefVar); ret != 16 {
+ t.Errorf("got %v but expected %v", ret, 16)
+ }
+ if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
+ t.Errorf("got %v but expected %v", ret, 25)
+ }
+}
+
+// issue 22906
+
+func test22906(t *testing.T) {
+ var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
+ _ = x1
+ var x2 C.jclass = 0
+ _ = x2
+ var x3 C.jthrowable = 0
+ _ = x3
+ var x4 C.jstring = 0
+ _ = x4
+ var x5 C.jarray = 0
+ _ = x5
+ var x6 C.jbooleanArray = 0
+ _ = x6
+ var x7 C.jbyteArray = 0
+ _ = x7
+ var x8 C.jcharArray = 0
+ _ = x8
+ var x9 C.jshortArray = 0
+ _ = x9
+ var x10 C.jintArray = 0
+ _ = x10
+ var x11 C.jlongArray = 0
+ _ = x11
+ var x12 C.jfloatArray = 0
+ _ = x12
+ var x13 C.jdoubleArray = 0
+ _ = x13
+ var x14 C.jobjectArray = 0
+ _ = x14
+ var x15 C.jweak = 0
+ _ = x15
+}
+
+// issue 22958
+// Nothing to run, just make sure this compiles.
+var Vissue22958 C.issue22958Type
+
+func test23356(t *testing.T) {
+ if got, want := C.a(), C.int(5); got != want {
+ t.Errorf("C.a() == %v, expected %v", got, want)
+ }
+ if got, want := C.r(), C.int(3); got != want {
+ t.Errorf("C.r() == %v, expected %v", got, want)
+ }
+}
+
+// issue 23720
+
+func Issue23720F() {
+ var x C.issue23720A
+ C.issue23720F(x)
+}
+
+// issue 24206
+
+func test24206(t *testing.T) {
+ if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
+ t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
+ }
+
+ if l := len(C.GoString(C.dangerousString1())); l != 123 {
+ t.Errorf("Incorrect string length - got %d, want 123", l)
+ }
+ if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
+ t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
+ }
+}
+
+// issue 25143
+
+func issue25143sum(ns ...C.int) C.int {
+ total := C.int(0)
+ for _, n := range ns {
+ total += n
+ }
+ return total
+}
+
+func test25143(t *testing.T) {
+ if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
+ t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
+ }
+}
+
+// issue 26066
+// Wrong type of constant with GCC 8 and newer.
+
+func test26066(t *testing.T) {
+ var i = int64(C.issue26066)
+ if i != -1 {
+ t.Errorf("got %d, want -1", i)
+ }
+}
+
+// issue 26517
+var a C.TypeOne
+var b C.TypeTwo
+
+// issue 27660
+// Stress the interaction between the race detector and cgo in an
+// attempt to reproduce the memory corruption described in #27660.
+// The bug was very timing sensitive; at the time of writing this
+// test would only trigger the bug about once out of every five runs.
+
+func test27660(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+ ints := make([]int, 100)
+ locks := make([]sync.Mutex, 100)
+ // Slowly create threads so that ThreadSanitizer is forced to
+ // frequently resize its SyncClocks.
+ for i := 0; i < 100; i++ {
+ go func() {
+ for ctx.Err() == nil {
+ // Sleep in C for long enough that it is likely that the runtime
+ // will retake this goroutine's currently wired P.
+ C.usleep(1000 /* 1ms */)
+ runtime.Gosched() // avoid starvation (see #28701)
+ }
+ }()
+ go func() {
+ // Trigger lots of synchronization and memory reads/writes to
+ // increase the likelihood that the race described in #27660
+ // results in corruption of ThreadSanitizer's internal state
+ // and thus an assertion failure or segfault.
+ i := 0
+ for ctx.Err() == nil {
+ j := rand.Intn(100)
+ locks[j].Lock()
+ ints[j]++
+ locks[j].Unlock()
+ // Avoid making the loop unpreemptible
+ // for gccgo.
+ if i%0x1000000 == 0 {
+ runtime.Gosched()
+ }
+ i++
+ }
+ }()
+ time.Sleep(time.Millisecond)
+ }
+}
+
+// issue 28540
+
+func twoargsF() {
+ v := []string{}
+ C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
+}
+
+// issue 28545
+
+func issue28545G(p **C.char) {
+ C.issue28545F(p, -1, (0))
+ C.issue28545F(p, 2+3, complex(1, 1))
+ C.issue28545F(p, issue28772Constant, issue28772Constant2)
+}
+
+// issue 28772 part 1 - part 2 in testx.go
+
+const issue28772Constant = C.issue28772Constant
+
+// issue 28896
+
+func offset(i int) uintptr {
+ var pi C.innerPacked
+ var po C.outerPacked
+ var ui C.innerUnpacked
+ var uo C.outerUnpacked
+ switch i {
+ case 0:
+ return unsafe.Offsetof(pi.f2)
+ case 1:
+ return unsafe.Offsetof(po.g2)
+ case 2:
+ return unsafe.Offsetof(ui.f2)
+ case 3:
+ return unsafe.Offsetof(uo.g2)
+ default:
+ panic("can't happen")
+ }
+}
+
+func test28896(t *testing.T) {
+ for i := 0; i < 4; i++ {
+ c := uintptr(C.offset(C.int(i)))
+ g := offset(i)
+ if c != g {
+ t.Errorf("%d: C: %d != Go %d", i, c, g)
+ }
+ }
+}
+
+// issue 29383
+// cgo's /*line*/ comments failed when inserted after '/',
+// because the result looked like a "//" comment.
+// No runtime test; just make sure it compiles.
+
+func Issue29383(n, size uint) int {
+ if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
+ return 0
+ }
+ return 0
+}
+
+// issue 29748
+// Error handling a struct initializer that requires pointer checking.
+// Compilation test only, nothing to run.
+
+var Vissue29748 = C.f29748(&C.S29748{
+ nil,
+})
+
+func Fissue299748() {
+ C.f29748(&C.S29748{
+ nil,
+ })
+}
+
+// issue 29781
+
+var issue29781X struct{ X int }
+
+func issue29781F(...int) int { return 0 }
+
+func issue29781G() {
+ var p *C.char
+ C.issue29781F(&p, C.ISSUE29781C+1)
+ C.issue29781F(nil, (C.int)(
+ 0))
+ C.issue29781F(&p, (C.int)(0))
+ C.issue29781F(&p, (C.int)(
+ 0))
+ C.issue29781F(&p, (C.int)(issue29781X.
+ X))
+}
+
+// issue 30065
+
+func test30065(t *testing.T) {
+ var a [256]byte
+ b := []byte("a")
+ C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
+ if a[0] != 'a' {
+ t.Errorf("&a failed: got %c, want %c", a[0], 'a')
+ }
+
+ b = []byte("b")
+ C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
+ if a[0] != 'b' {
+ t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
+ }
+
+ d := make([]byte, 256)
+ b = []byte("c")
+ C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
+ if d[0] != 'c' {
+ t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
+ }
+}
+
+// issue 31093
+// No runtime test; just make sure it compiles.
+
+func Issue31093() {
+ C.issue31093F(C.ushort(0))
+}
+
+// issue 32579
+
+func test32579(t *testing.T) {
+ var s [1]C.struct_S32579
+ C.memset(unsafe.Pointer(&s[0].data[0]), 1, 1)
+ if s[0].data[0] != 1 {
+ t.Errorf("&s[0].data[0] failed: got %d, want %d", s[0].data[0], 1)
+ }
+}
diff --git a/libgo/misc/cgo/test/test22906.go b/libgo/misc/cgo/test/test22906.go
deleted file mode 100644
index 02bae9c..0000000
--- a/libgo/misc/cgo/test/test22906.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 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.
-
-// +build cgo
-
-package cgotest
-
-/*
-
-// It's going to be hard to include a whole real JVM to test this.
-// So we'll simulate a really easy JVM using just the parts we need.
-
-// This is the relevant part of jni.h.
-
-struct _jobject;
-
-typedef struct _jobject *jobject;
-typedef jobject jclass;
-typedef jobject jthrowable;
-typedef jobject jstring;
-typedef jobject jarray;
-typedef jarray jbooleanArray;
-typedef jarray jbyteArray;
-typedef jarray jcharArray;
-typedef jarray jshortArray;
-typedef jarray jintArray;
-typedef jarray jlongArray;
-typedef jarray jfloatArray;
-typedef jarray jdoubleArray;
-typedef jarray jobjectArray;
-
-typedef jobject jweak;
-
-// Note: jvalue is already a non-pointer type due to it being a C union.
-
-*/
-import "C"
-import (
- "testing"
-)
-
-func test22906(t *testing.T) {
- var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
- _ = x1
- var x2 C.jclass = 0
- _ = x2
- var x3 C.jthrowable = 0
- _ = x3
- var x4 C.jstring = 0
- _ = x4
- var x5 C.jarray = 0
- _ = x5
- var x6 C.jbooleanArray = 0
- _ = x6
- var x7 C.jbyteArray = 0
- _ = x7
- var x8 C.jcharArray = 0
- _ = x8
- var x9 C.jshortArray = 0
- _ = x9
- var x10 C.jintArray = 0
- _ = x10
- var x11 C.jlongArray = 0
- _ = x11
- var x12 C.jfloatArray = 0
- _ = x12
- var x13 C.jdoubleArray = 0
- _ = x13
- var x14 C.jobjectArray = 0
- _ = x14
- var x15 C.jweak = 0
- _ = x15
-}
diff --git a/libgo/misc/cgo/test/test27660.go b/libgo/misc/cgo/test/test27660.go
deleted file mode 100644
index 0345aa7..0000000
--- a/libgo/misc/cgo/test/test27660.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018 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.
-
-// Stress the interaction between the race detector and cgo in an
-// attempt to reproduce the memory corruption described in #27660.
-// The bug was very timing sensitive; at the time of writing this
-// test would only trigger the bug about once out of every five runs.
-
-package cgotest
-
-// #include <unistd.h>
-import "C"
-
-import (
- "context"
- "math/rand"
- "runtime"
- "sync"
- "testing"
- "time"
-)
-
-func test27660(t *testing.T) {
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
- ints := make([]int, 100)
- locks := make([]sync.Mutex, 100)
- // Slowly create threads so that ThreadSanitizer is forced to
- // frequently resize its SyncClocks.
- for i := 0; i < 100; i++ {
- go func() {
- for ctx.Err() == nil {
- // Sleep in C for long enough that it is likely that the runtime
- // will retake this goroutine's currently wired P.
- C.usleep(1000 /* 1ms */)
- runtime.Gosched() // avoid starvation (see #28701)
- }
- }()
- go func() {
- // Trigger lots of synchronization and memory reads/writes to
- // increase the likelihood that the race described in #27660
- // results in corruption of ThreadSanitizer's internal state
- // and thus an assertion failure or segfault.
- i := 0
- for ctx.Err() == nil {
- j := rand.Intn(100)
- locks[j].Lock()
- ints[j]++
- locks[j].Unlock()
- // Avoid making the loop unpreemptible
- // for gccgo.
- if i%0x1000000 == 0 {
- runtime.Gosched()
- }
- i++
- }
- }()
- time.Sleep(time.Millisecond)
- }
-}
diff --git a/libgo/misc/cgo/test/test_unix.go b/libgo/misc/cgo/test/test_unix.go
new file mode 100644
index 0000000..4a23446
--- /dev/null
+++ b/libgo/misc/cgo/test/test_unix.go
@@ -0,0 +1,11 @@
+// Copyright 2019 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.
+
+// +build !windows
+
+package cgotest
+
+import "syscall"
+
+var syscall_dot_SIGCHLD = syscall.SIGCHLD
diff --git a/libgo/misc/cgo/test/issue13402.go b/libgo/misc/cgo/test/test_windows.go
index 3af24c2..7bfb33a 100644
--- a/libgo/misc/cgo/test/issue13402.go
+++ b/libgo/misc/cgo/test/test_windows.go
@@ -1,10 +1,9 @@
-// Copyright 2015 The Go Authors. All rights reserved.
+// Copyright 2019 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.
package cgotest
-import "C"
+import "syscall"
-var _ C.complexfloat
-var _ C.complexdouble
+var syscall_dot_SIGCHLD syscall.Signal
diff --git a/libgo/misc/cgo/test/issue3250w.go b/libgo/misc/cgo/test/testdata/cgo_linux_test.go
index c2193aa..5cef09f 100644
--- a/libgo/misc/cgo/test/issue3250w.go
+++ b/libgo/misc/cgo/test/testdata/cgo_linux_test.go
@@ -1,11 +1,9 @@
-// Copyright 2013 The Go Authors. All rights reserved.
+// Copyright 2012 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.
-// +build windows
-
package cgotest
import "testing"
-func test3250(t *testing.T) {}
+func Test9400(t *testing.T) { test9400(t) }
diff --git a/libgo/misc/cgo/test/testdata/cgo_test.go b/libgo/misc/cgo/test/testdata/cgo_test.go
new file mode 100644
index 0000000..ffa076f
--- /dev/null
+++ b/libgo/misc/cgo/test/testdata/cgo_test.go
@@ -0,0 +1,18 @@
+// Copyright 2011 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.
+
+package cgotest
+
+import "testing"
+
+// The actual test functions are in non-_test.go files
+// so that they can use cgo (import "C").
+// These wrappers are here for gotest to find.
+
+func Test8756(t *testing.T) { test8756(t) }
+func Test9026(t *testing.T) { test9026(t) }
+func Test9510(t *testing.T) { test9510(t) }
+func Test20266(t *testing.T) { test20266(t) }
+func Test26213(t *testing.T) { test26213(t) }
+func TestGCC68255(t *testing.T) { testGCC68255(t) }
diff --git a/libgo/misc/cgo/test/gcc68255.go b/libgo/misc/cgo/test/testdata/gcc68255.go
index 23e103d..b431462 100644
--- a/libgo/misc/cgo/test/gcc68255.go
+++ b/libgo/misc/cgo/test/testdata/gcc68255.go
@@ -7,7 +7,7 @@ package cgotest
import (
"testing"
- "./gcc68255"
+ "cgotest/gcc68255"
)
func testGCC68255(t *testing.T) {
diff --git a/libgo/misc/cgo/test/gcc68255/a.go b/libgo/misc/cgo/test/testdata/gcc68255/a.go
index e106dee..e106dee 100644
--- a/libgo/misc/cgo/test/gcc68255/a.go
+++ b/libgo/misc/cgo/test/testdata/gcc68255/a.go
diff --git a/libgo/misc/cgo/test/gcc68255/c.c b/libgo/misc/cgo/test/testdata/gcc68255/c.c
index a4fe193..a4fe193 100644
--- a/libgo/misc/cgo/test/gcc68255/c.c
+++ b/libgo/misc/cgo/test/testdata/gcc68255/c.c
diff --git a/libgo/misc/cgo/test/gcc68255/c.h b/libgo/misc/cgo/test/testdata/gcc68255/c.h
index 05ecd81..05ecd81 100644
--- a/libgo/misc/cgo/test/gcc68255/c.h
+++ b/libgo/misc/cgo/test/testdata/gcc68255/c.h
diff --git a/libgo/misc/cgo/test/issue20266.go b/libgo/misc/cgo/test/testdata/issue20266.go
index 9f95086..9f95086 100644
--- a/libgo/misc/cgo/test/issue20266.go
+++ b/libgo/misc/cgo/test/testdata/issue20266.go
diff --git a/libgo/misc/cgo/test/issue20266/issue20266.h b/libgo/misc/cgo/test/testdata/issue20266/issue20266.h
index 8d3258e..8d3258e 100644
--- a/libgo/misc/cgo/test/issue20266/issue20266.h
+++ b/libgo/misc/cgo/test/testdata/issue20266/issue20266.h
diff --git a/libgo/misc/cgo/test/issue23555.go b/libgo/misc/cgo/test/testdata/issue23555.go
index 5fa44e6..4e944b5 100644
--- a/libgo/misc/cgo/test/issue23555.go
+++ b/libgo/misc/cgo/test/testdata/issue23555.go
@@ -7,5 +7,5 @@
package cgotest
-import _ "./issue23555a"
-import _ "./issue23555b"
+import _ "cgotest/issue23555a"
+import _ "cgotest/issue23555b"
diff --git a/libgo/misc/cgo/test/issue23555a/a.go b/libgo/misc/cgo/test/testdata/issue23555a/a.go
index cb6626b..cb6626b 100644
--- a/libgo/misc/cgo/test/issue23555a/a.go
+++ b/libgo/misc/cgo/test/testdata/issue23555a/a.go
diff --git a/libgo/misc/cgo/test/issue23555b/a.go b/libgo/misc/cgo/test/testdata/issue23555b/a.go
index cb6626b..cb6626b 100644
--- a/libgo/misc/cgo/test/issue23555b/a.go
+++ b/libgo/misc/cgo/test/testdata/issue23555b/a.go
diff --git a/libgo/misc/cgo/test/issue24161_darwin_test.go b/libgo/misc/cgo/test/testdata/issue24161_darwin_test.go
index 48072ff..64f4442 100644
--- a/libgo/misc/cgo/test/issue24161_darwin_test.go
+++ b/libgo/misc/cgo/test/testdata/issue24161_darwin_test.go
@@ -15,11 +15,11 @@ package cgotest
import (
"testing"
- "./issue24161arg"
- "./issue24161e0"
- "./issue24161e1"
- "./issue24161e2"
- "./issue24161res"
+ "cgotest/issue24161arg"
+ "cgotest/issue24161e0"
+ "cgotest/issue24161e1"
+ "cgotest/issue24161e2"
+ "cgotest/issue24161res"
)
func Test24161Arg(t *testing.T) {
diff --git a/libgo/misc/cgo/test/issue24161arg/def.go b/libgo/misc/cgo/test/testdata/issue24161arg/def.go
index d33479a..d33479a 100644
--- a/libgo/misc/cgo/test/issue24161arg/def.go
+++ b/libgo/misc/cgo/test/testdata/issue24161arg/def.go
diff --git a/libgo/misc/cgo/test/issue24161arg/use.go b/libgo/misc/cgo/test/testdata/issue24161arg/use.go
index 3e74944..3e74944 100644
--- a/libgo/misc/cgo/test/issue24161arg/use.go
+++ b/libgo/misc/cgo/test/testdata/issue24161arg/use.go
diff --git a/libgo/misc/cgo/test/issue24161e0/main.go b/libgo/misc/cgo/test/testdata/issue24161e0/main.go
index cbc1dee..cbc1dee 100644
--- a/libgo/misc/cgo/test/issue24161e0/main.go
+++ b/libgo/misc/cgo/test/testdata/issue24161e0/main.go
diff --git a/libgo/misc/cgo/test/issue24161e1/main.go b/libgo/misc/cgo/test/testdata/issue24161e1/main.go
index eb48fc0..eb48fc0 100644
--- a/libgo/misc/cgo/test/issue24161e1/main.go
+++ b/libgo/misc/cgo/test/testdata/issue24161e1/main.go
diff --git a/libgo/misc/cgo/test/issue24161e2/main.go b/libgo/misc/cgo/test/testdata/issue24161e2/main.go
index 1951c86..1951c86 100644
--- a/libgo/misc/cgo/test/issue24161e2/main.go
+++ b/libgo/misc/cgo/test/testdata/issue24161e2/main.go
diff --git a/libgo/misc/cgo/test/issue24161res/restype.go b/libgo/misc/cgo/test/testdata/issue24161res/restype.go
index e5719f2..e5719f2 100644
--- a/libgo/misc/cgo/test/issue24161res/restype.go
+++ b/libgo/misc/cgo/test/testdata/issue24161res/restype.go
diff --git a/libgo/misc/cgo/test/issue26213/jni.h b/libgo/misc/cgo/test/testdata/issue26213/jni.h
index 0c76979..0c76979 100644
--- a/libgo/misc/cgo/test/issue26213/jni.h
+++ b/libgo/misc/cgo/test/testdata/issue26213/jni.h
diff --git a/libgo/misc/cgo/test/issue26213/test26213.go b/libgo/misc/cgo/test/testdata/issue26213/test26213.go
index 5d1f637..5d1f637 100644
--- a/libgo/misc/cgo/test/issue26213/test26213.go
+++ b/libgo/misc/cgo/test/testdata/issue26213/test26213.go
diff --git a/libgo/misc/cgo/test/issue26430.go b/libgo/misc/cgo/test/testdata/issue26430.go
index 3ad5420..14c7a7c 100644
--- a/libgo/misc/cgo/test/issue26430.go
+++ b/libgo/misc/cgo/test/testdata/issue26430.go
@@ -7,4 +7,4 @@
package cgotest
-import _ "./issue26430"
+import _ "cgotest/issue26430"
diff --git a/libgo/misc/cgo/test/issue26430/a.go b/libgo/misc/cgo/test/testdata/issue26430/a.go
index fbaa46b..fbaa46b 100644
--- a/libgo/misc/cgo/test/issue26430/a.go
+++ b/libgo/misc/cgo/test/testdata/issue26430/a.go
diff --git a/libgo/misc/cgo/test/issue26430/b.go b/libgo/misc/cgo/test/testdata/issue26430/b.go
index a7c527c..a7c527c 100644
--- a/libgo/misc/cgo/test/issue26430/b.go
+++ b/libgo/misc/cgo/test/testdata/issue26430/b.go
diff --git a/libgo/misc/cgo/test/issue26743.go b/libgo/misc/cgo/test/testdata/issue26743.go
index 35c8473..000fb2b 100644
--- a/libgo/misc/cgo/test/issue26743.go
+++ b/libgo/misc/cgo/test/testdata/issue26743.go
@@ -7,4 +7,4 @@
package cgotest
-import _ "./issue26743"
+import _ "cgotest/issue26743"
diff --git a/libgo/misc/cgo/test/issue26743/a.go b/libgo/misc/cgo/test/testdata/issue26743/a.go
index a3df179..a3df179 100644
--- a/libgo/misc/cgo/test/issue26743/a.go
+++ b/libgo/misc/cgo/test/testdata/issue26743/a.go
diff --git a/libgo/misc/cgo/test/issue26743/b.go b/libgo/misc/cgo/test/testdata/issue26743/b.go
index c5f1ae4..c5f1ae4 100644
--- a/libgo/misc/cgo/test/issue26743/b.go
+++ b/libgo/misc/cgo/test/testdata/issue26743/b.go
diff --git a/libgo/misc/cgo/test/issue27054/egl.h b/libgo/misc/cgo/test/testdata/issue27054/egl.h
index 33a759e..33a759e 100644
--- a/libgo/misc/cgo/test/issue27054/egl.h
+++ b/libgo/misc/cgo/test/testdata/issue27054/egl.h
diff --git a/libgo/misc/cgo/test/issue27054/test27054.go b/libgo/misc/cgo/test/testdata/issue27054/test27054.go
index 186f5bd..186f5bd 100644
--- a/libgo/misc/cgo/test/issue27054/test27054.go
+++ b/libgo/misc/cgo/test/testdata/issue27054/test27054.go
diff --git a/libgo/misc/cgo/test/issue27340.go b/libgo/misc/cgo/test/testdata/issue27340.go
index f8c8a87..337550f 100644
--- a/libgo/misc/cgo/test/issue27340.go
+++ b/libgo/misc/cgo/test/testdata/issue27340.go
@@ -7,6 +7,6 @@
package cgotest
-import "./issue27340"
+import "cgotest/issue27340"
var issue27340Var = issue27340.Issue27340GoFunc
diff --git a/libgo/misc/cgo/test/issue27340/a.go b/libgo/misc/cgo/test/testdata/issue27340/a.go
index f5b120c..f5b120c 100644
--- a/libgo/misc/cgo/test/issue27340/a.go
+++ b/libgo/misc/cgo/test/testdata/issue27340/a.go
diff --git a/libgo/misc/cgo/test/issue21668.go b/libgo/misc/cgo/test/testdata/issue29563.go
index f15b920..84def3c 100644
--- a/libgo/misc/cgo/test/issue21668.go
+++ b/libgo/misc/cgo/test/testdata/issue29563.go
@@ -1,13 +1,12 @@
-// Copyright 2017 The Go Authors. All rights reserved.
+// Copyright 2019 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.
-// Fail to guess the kind of the constant "x".
+// +build !windows
+
+// Issue 29563: internal linker fails on duplicate weak symbols.
// No runtime test; just make sure it compiles.
package cgotest
-// const int x = 42;
-import "C"
-
-var issue21668_X = C.x
+import _ "cgotest/issue29563"
diff --git a/libgo/misc/cgo/test/testdata/issue29563/weak.go b/libgo/misc/cgo/test/testdata/issue29563/weak.go
new file mode 100644
index 0000000..21cf635c
--- /dev/null
+++ b/libgo/misc/cgo/test/testdata/issue29563/weak.go
@@ -0,0 +1,13 @@
+// Copyright 2019 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.
+
+package issue29563
+
+//int foo1();
+//int foo2();
+import "C"
+
+func Bar() int {
+ return int(C.foo1()) + int(C.foo2())
+}
diff --git a/libgo/misc/cgo/test/testdata/issue29563/weak1.c b/libgo/misc/cgo/test/testdata/issue29563/weak1.c
new file mode 100644
index 0000000..86a2273
--- /dev/null
+++ b/libgo/misc/cgo/test/testdata/issue29563/weak1.c
@@ -0,0 +1,11 @@
+// Copyright 2019 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.
+
+extern int weaksym __attribute__((__weak__));
+int weaksym = 42;
+
+int foo1()
+{
+ return weaksym;
+}
diff --git a/libgo/misc/cgo/test/testdata/issue29563/weak2.c b/libgo/misc/cgo/test/testdata/issue29563/weak2.c
new file mode 100644
index 0000000..e01eae8
--- /dev/null
+++ b/libgo/misc/cgo/test/testdata/issue29563/weak2.c
@@ -0,0 +1,11 @@
+// Copyright 2019 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.
+
+extern int weaksym __attribute__((__weak__));
+int weaksym = 42;
+
+int foo2()
+{
+ return weaksym;
+}
diff --git a/libgo/misc/cgo/test/issue8756.go b/libgo/misc/cgo/test/testdata/issue8756.go
index d8ee3b8..406c64c 100644
--- a/libgo/misc/cgo/test/issue8756.go
+++ b/libgo/misc/cgo/test/testdata/issue8756.go
@@ -8,7 +8,7 @@ import "C"
import (
"testing"
- "./issue8756"
+ "cgotest/issue8756"
)
func test8756(t *testing.T) {
diff --git a/libgo/misc/cgo/test/issue8756/issue8756.go b/libgo/misc/cgo/test/testdata/issue8756/issue8756.go
index 5f6b777..5f6b777 100644
--- a/libgo/misc/cgo/test/issue8756/issue8756.go
+++ b/libgo/misc/cgo/test/testdata/issue8756/issue8756.go
diff --git a/libgo/misc/cgo/test/issue8828.go b/libgo/misc/cgo/test/testdata/issue8828.go
index 304797c..0bca0f2 100644
--- a/libgo/misc/cgo/test/issue8828.go
+++ b/libgo/misc/cgo/test/testdata/issue8828.go
@@ -9,7 +9,7 @@
package cgotest
-import "./issue8828"
+import "cgotest/issue8828"
func p() {
issue8828.Bar()
diff --git a/libgo/misc/cgo/test/issue8828/issue8828.c b/libgo/misc/cgo/test/testdata/issue8828/issue8828.c
index 27ec23a..27ec23a 100644
--- a/libgo/misc/cgo/test/issue8828/issue8828.c
+++ b/libgo/misc/cgo/test/testdata/issue8828/issue8828.c
diff --git a/libgo/misc/cgo/test/issue8828/trivial.go b/libgo/misc/cgo/test/testdata/issue8828/trivial.go
index e7b9a4e..e7b9a4e 100644
--- a/libgo/misc/cgo/test/issue8828/trivial.go
+++ b/libgo/misc/cgo/test/testdata/issue8828/trivial.go
diff --git a/libgo/misc/cgo/test/issue9026.go b/libgo/misc/cgo/test/testdata/issue9026.go
index 8848d0e..3f48881 100644
--- a/libgo/misc/cgo/test/issue9026.go
+++ b/libgo/misc/cgo/test/testdata/issue9026.go
@@ -3,7 +3,7 @@ package cgotest
import (
"testing"
- "./issue9026"
+ "cgotest/issue9026"
)
func test9026(t *testing.T) { issue9026.Test(t) }
diff --git a/libgo/misc/cgo/test/issue9026/issue9026.go b/libgo/misc/cgo/test/testdata/issue9026/issue9026.go
index 149c265..149c265 100644
--- a/libgo/misc/cgo/test/issue9026/issue9026.go
+++ b/libgo/misc/cgo/test/testdata/issue9026/issue9026.go
diff --git a/libgo/misc/cgo/test/issue9400/asm_386.s b/libgo/misc/cgo/test/testdata/issue9400/asm_386.s
index 7f158b5..7f158b5 100644
--- a/libgo/misc/cgo/test/issue9400/asm_386.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_386.s
diff --git a/libgo/misc/cgo/test/issue9400/asm_amd64x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_amd64x.s
index 48b8619..48b8619 100644
--- a/libgo/misc/cgo/test/issue9400/asm_amd64x.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_amd64x.s
diff --git a/libgo/misc/cgo/test/issue9400/asm_arm.s b/libgo/misc/cgo/test/testdata/issue9400/asm_arm.s
index 96c2785..96c2785 100644
--- a/libgo/misc/cgo/test/issue9400/asm_arm.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_arm.s
diff --git a/libgo/misc/cgo/test/issue9400/asm_arm64.s b/libgo/misc/cgo/test/testdata/issue9400/asm_arm64.s
index 2ebbfcc..2ebbfcc 100644
--- a/libgo/misc/cgo/test/issue9400/asm_arm64.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_arm64.s
diff --git a/libgo/misc/cgo/test/issue9400/asm_mips64x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_mips64x.s
index 63dc906..63dc906 100644
--- a/libgo/misc/cgo/test/issue9400/asm_mips64x.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_mips64x.s
diff --git a/libgo/misc/cgo/test/issue9400/asm_mipsx.s b/libgo/misc/cgo/test/testdata/issue9400/asm_mipsx.s
index 7a92735..7a92735 100644
--- a/libgo/misc/cgo/test/issue9400/asm_mipsx.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_mipsx.s
diff --git a/libgo/misc/cgo/test/issue9400/asm_ppc64x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_ppc64x.s
index c88ec3b..c88ec3b 100644
--- a/libgo/misc/cgo/test/issue9400/asm_ppc64x.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_ppc64x.s
diff --git a/libgo/misc/cgo/test/issue9400/asm_s390x.s b/libgo/misc/cgo/test/testdata/issue9400/asm_s390x.s
index fc9ad72..fc9ad72 100644
--- a/libgo/misc/cgo/test/issue9400/asm_s390x.s
+++ b/libgo/misc/cgo/test/testdata/issue9400/asm_s390x.s
diff --git a/libgo/misc/cgo/test/issue9400/gccgo.go b/libgo/misc/cgo/test/testdata/issue9400/gccgo.go
index a9b62b0..a9b62b0 100644
--- a/libgo/misc/cgo/test/issue9400/gccgo.go
+++ b/libgo/misc/cgo/test/testdata/issue9400/gccgo.go
diff --git a/libgo/misc/cgo/test/issue9400/stubs.go b/libgo/misc/cgo/test/testdata/issue9400/stubs.go
index e431c5a..e431c5a 100644
--- a/libgo/misc/cgo/test/issue9400/stubs.go
+++ b/libgo/misc/cgo/test/testdata/issue9400/stubs.go
diff --git a/libgo/misc/cgo/test/issue9400_linux.go b/libgo/misc/cgo/test/testdata/issue9400_linux.go
index 7719535..e94a9bb 100644
--- a/libgo/misc/cgo/test/issue9400_linux.go
+++ b/libgo/misc/cgo/test/testdata/issue9400_linux.go
@@ -18,7 +18,7 @@ import (
"sync/atomic"
"testing"
- "./issue9400"
+ "cgotest/issue9400"
)
func test9400(t *testing.T) {
diff --git a/libgo/misc/cgo/test/issue9510.go b/libgo/misc/cgo/test/testdata/issue9510.go
index efd3f77..2c79fab 100644
--- a/libgo/misc/cgo/test/issue9510.go
+++ b/libgo/misc/cgo/test/testdata/issue9510.go
@@ -11,8 +11,8 @@ import (
"runtime"
"testing"
- "./issue9510a"
- "./issue9510b"
+ "cgotest/issue9510a"
+ "cgotest/issue9510b"
)
func test9510(t *testing.T) {
diff --git a/libgo/misc/cgo/test/issue9510a/a.go b/libgo/misc/cgo/test/testdata/issue9510a/a.go
index 1a5224b..1a5224b 100644
--- a/libgo/misc/cgo/test/issue9510a/a.go
+++ b/libgo/misc/cgo/test/testdata/issue9510a/a.go
diff --git a/libgo/misc/cgo/test/issue9510b/b.go b/libgo/misc/cgo/test/testdata/issue9510b/b.go
index 5016b39..5016b39 100644
--- a/libgo/misc/cgo/test/issue9510b/b.go
+++ b/libgo/misc/cgo/test/testdata/issue9510b/b.go
diff --git a/libgo/misc/cgo/test/test26213.go b/libgo/misc/cgo/test/testdata/test26213.go
index 176a7ec..c80032c 100644
--- a/libgo/misc/cgo/test/test26213.go
+++ b/libgo/misc/cgo/test/testdata/test26213.go
@@ -7,7 +7,7 @@ package cgotest
import (
"testing"
- "./issue26213"
+ "cgotest/issue26213"
)
func test26213(t *testing.T) {
diff --git a/libgo/misc/cgo/test/testx.go b/libgo/misc/cgo/test/testx.go
new file mode 100644
index 0000000..67def90
--- /dev/null
+++ b/libgo/misc/cgo/test/testx.go
@@ -0,0 +1,519 @@
+// Copyright 2011 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.
+
+// Test cases for cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains //export directives on Go functions
+// and so it must NOT contain C definitions (only declarations).
+// See test.go for C definitions.
+
+package cgotest
+
+import (
+ "runtime"
+ "runtime/debug"
+ "strings"
+ "sync"
+ "sync/atomic"
+ "testing"
+ "time"
+ "unsafe"
+)
+
+/*
+// threads
+extern void doAdd(int, int);
+
+// issue 1328
+extern void BackIntoGo(void);
+void IntoC(void);
+
+// issue 1560
+// mysleep returns the absolute start time in ms.
+long long mysleep(int seconds);
+
+// twoSleep returns the absolute start time of the first sleep
+// in ms.
+long long twoSleep(int);
+
+// issue 3775
+void lockOSThreadCallback(void);
+inline static void lockOSThreadC(void)
+{
+ lockOSThreadCallback();
+}
+int usleep(unsigned usec);
+
+// issue 4054 part 2 - part 1 in test.go
+typedef enum {
+ A = 0,
+ B,
+ C,
+ D,
+ E,
+ F,
+ G,
+ H,
+ II,
+ J,
+} issue4054b;
+
+// issue 5548
+
+extern int issue5548_in_c(void);
+
+// issue 6833
+
+extern unsigned long long issue6833Func(unsigned int, unsigned long long);
+
+// issue 6907
+
+extern int CheckIssue6907C(_GoString_);
+
+// issue 7665
+
+extern void f7665(void);
+
+// issue 7978
+// Stack tracing didn't work during cgo code after calling a Go
+// callback. Make sure GC works and the stack trace is correct.
+
+#include <stdint.h>
+
+void issue7978cb(void);
+
+// use ugly atomic variable sync since that doesn't require calling back into
+// Go code or OS dependencies
+static void issue7978c(uint32_t *sync) {
+ while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 0)
+ ;
+ __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
+ while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 2)
+ ;
+ issue7978cb();
+ __atomic_add_fetch(sync, 1, __ATOMIC_SEQ_CST);
+ while(__atomic_load_n(sync, __ATOMIC_SEQ_CST) != 6)
+ ;
+}
+
+// issue 8331 part 2 - part 1 in test.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice. No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 20910
+void callMulti(void);
+
+// issue 28772 part 2 - part 1 in issuex.go
+#define issue28772Constant2 2
+
+*/
+import "C"
+
+// exports
+
+//export ReturnIntLong
+func ReturnIntLong() (int, C.long) {
+ return 1, 2
+}
+
+//export gc
+func gc() {
+ runtime.GC()
+}
+
+// threads
+
+var sum struct {
+ sync.Mutex
+ i int
+}
+
+//export Add
+func Add(x int) {
+ defer func() {
+ recover()
+ }()
+ sum.Lock()
+ sum.i += x
+ sum.Unlock()
+ var p *int
+ *p = 2
+}
+
+func testCthread(t *testing.T) {
+ if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
+ t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
+ }
+ sum.i = 0
+ C.doAdd(10, 6)
+
+ want := 10 * (10 - 1) / 2 * 6
+ if sum.i != want {
+ t.Fatalf("sum=%d, want %d", sum.i, want)
+ }
+}
+
+// issue 1328
+
+//export BackIntoGo
+func BackIntoGo() {
+ x := 1
+
+ for i := 0; i < 10000; i++ {
+ xvariadic(x)
+ if x != 1 {
+ panic("x is not 1?")
+ }
+ }
+}
+
+func xvariadic(x ...interface{}) {
+}
+
+func test1328(t *testing.T) {
+ C.IntoC()
+}
+
+// issue 1560
+
+var sleepDone = make(chan int64)
+
+// parallelSleep returns the absolute difference between the start time
+// of the two sleeps.
+func parallelSleep(n int) int64 {
+ t := int64(C.twoSleep(C.int(n))) - <-sleepDone
+ if t < 0 {
+ return -t
+ }
+ return t
+}
+
+//export BackgroundSleep
+func BackgroundSleep(n int32) {
+ go func() {
+ sleepDone <- int64(C.mysleep(C.int(n)))
+ }()
+}
+
+func testParallelSleep(t *testing.T) {
+ sleepSec := 1
+ dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
+ t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
+ // bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
+ // we detect if the start times of those sleeps are > 0.5*sleepSec-second.
+ if dt >= time.Duration(sleepSec)*time.Second/2 {
+ t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
+ }
+}
+
+// issue 2462
+
+//export exportbyte
+func exportbyte() byte {
+ return 0
+}
+
+//export exportbool
+func exportbool() bool {
+ return false
+}
+
+//export exportrune
+func exportrune() rune {
+ return 0
+}
+
+//export exporterror
+func exporterror() error {
+ return nil
+}
+
+//export exportint
+func exportint() int {
+ return 0
+}
+
+//export exportuint
+func exportuint() uint {
+ return 0
+}
+
+//export exportuintptr
+func exportuintptr() uintptr {
+ return (uintptr)(0)
+}
+
+//export exportint8
+func exportint8() int8 {
+ return 0
+}
+
+//export exportuint8
+func exportuint8() uint8 {
+ return 0
+}
+
+//export exportint16
+func exportint16() int16 {
+ return 0
+}
+
+//export exportuint16
+func exportuint16() uint16 {
+ return 0
+}
+
+//export exportint32
+func exportint32() int32 {
+ return 0
+}
+
+//export exportuint32
+func exportuint32() uint32 {
+ return 0
+}
+
+//export exportint64
+func exportint64() int64 {
+ return 0
+}
+
+//export exportuint64
+func exportuint64() uint64 {
+ return 0
+}
+
+//export exportfloat32
+func exportfloat32() float32 {
+ return 0
+}
+
+//export exportfloat64
+func exportfloat64() float64 {
+ return 0
+}
+
+//export exportcomplex64
+func exportcomplex64() complex64 {
+ return 0
+}
+
+//export exportcomplex128
+func exportcomplex128() complex128 {
+ return 0
+}
+
+// issue 3741
+
+//export exportSliceIn
+func exportSliceIn(s []byte) bool {
+ return len(s) == cap(s)
+}
+
+//export exportSliceOut
+func exportSliceOut() []byte {
+ return []byte{1}
+}
+
+//export exportSliceInOut
+func exportSliceInOut(s []byte) []byte {
+ return s
+}
+
+// issue 3775
+
+func init() {
+ if runtime.GOOS == "android" {
+ return
+ }
+ // Same as test3775 but run during init so that
+ // there are two levels of internal runtime lock
+ // (1 for init, 1 for cgo).
+ // This would have been broken by CL 11663043.
+ C.lockOSThreadC()
+}
+
+func test3775(t *testing.T) {
+ if runtime.GOOS == "android" {
+ return
+ }
+ // Used to panic because of the UnlockOSThread below.
+ C.lockOSThreadC()
+}
+
+//export lockOSThreadCallback
+func lockOSThreadCallback() {
+ runtime.LockOSThread()
+ runtime.UnlockOSThread()
+ go C.usleep(10000)
+ runtime.Gosched()
+}
+
+// issue 4054 part 2 - part 1 in test.go
+
+var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.II, C.J}
+
+//export issue5548FromC
+func issue5548FromC(s string, i int) int {
+ if len(s) == 4 && s == "test" && i == 42 {
+ return 12345
+ }
+ println("got", len(s), i)
+ return 9876
+}
+
+func test5548(t *testing.T) {
+ if x := C.issue5548_in_c(); x != 12345 {
+ t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
+ }
+}
+
+// issue 6833
+
+//export GoIssue6833Func
+func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
+ return aui64 + uint64(aui)
+}
+
+func test6833(t *testing.T) {
+ ui := 7
+ ull := uint64(0x4000300020001000)
+ v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
+ exp := uint64(ui) + ull
+ if v != exp {
+ t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
+ }
+}
+
+// issue 6907
+
+const CString = "C string"
+
+//export CheckIssue6907Go
+func CheckIssue6907Go(s string) C.int {
+ if s == CString {
+ return 1
+ }
+ return 0
+}
+
+func test6907Go(t *testing.T) {
+ if got := C.CheckIssue6907C(CString); got != 1 {
+ t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
+ }
+}
+
+// issue 7665
+
+//export f7665
+func f7665() {}
+
+var bad7665 unsafe.Pointer = C.f7665
+var good7665 uintptr = uintptr(C.f7665)
+
+func test7665(t *testing.T) {
+ if bad7665 == nil || uintptr(bad7665) != good7665 {
+ t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
+ }
+}
+
+// issue 7978
+
+var issue7978sync uint32
+
+func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
+ runtime.GC()
+ buf := make([]byte, 65536)
+ trace := string(buf[:runtime.Stack(buf, true)])
+ for _, goroutine := range strings.Split(trace, "\n\n") {
+ if strings.Contains(goroutine, "test.issue7978go") {
+ trace := strings.Split(goroutine, "\n")
+ // look for the expected function in the stack
+ for i := 0; i < depth; i++ {
+ if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
+ t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
+ return
+ }
+ if strings.Contains(trace[1+2*i], wantFunc) {
+ return
+ }
+ }
+ t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
+ return
+ }
+ }
+ t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
+}
+
+func issue7978wait(store uint32, wait uint32) {
+ if store != 0 {
+ atomic.StoreUint32(&issue7978sync, store)
+ }
+ for atomic.LoadUint32(&issue7978sync) != wait {
+ runtime.Gosched()
+ }
+}
+
+//export issue7978cb
+func issue7978cb() {
+ // Force a stack growth from the callback to put extra
+ // pressure on the runtime. See issue #17785.
+ growStack(64)
+ issue7978wait(3, 4)
+}
+
+func growStack(n int) int {
+ var buf [128]int
+ if n == 0 {
+ return 0
+ }
+ return buf[growStack(n-1)]
+}
+
+func issue7978go() {
+ C.issue7978c((*C.uint32_t)(&issue7978sync))
+ issue7978wait(7, 8)
+}
+
+func test7978(t *testing.T) {
+ if runtime.Compiler == "gccgo" {
+ t.Skip("gccgo can not do stack traces of C code")
+ }
+ debug.SetTraceback("2")
+ issue7978sync = 0
+ go issue7978go()
+ // test in c code, before callback
+ issue7978wait(0, 1)
+ issue7978check(t, "_Cfunc_issue7978c(", "", 1)
+ // test in go code, during callback
+ issue7978wait(2, 3)
+ issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
+ // test in c code, after callback
+ issue7978wait(4, 5)
+ issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
+ // test in go code, after return from cgo
+ issue7978wait(6, 7)
+ issue7978check(t, "test.issue7978go(", "", 3)
+ atomic.StoreUint32(&issue7978sync, 8)
+}
+
+// issue 8331 part 2
+
+var issue8331Var C.issue8331
+
+// issue 20910
+
+//export multi
+func multi() (*C.char, C.int) {
+ return C.CString("multi"), 0
+}
+
+func test20910(t *testing.T) {
+ C.callMulti()
+}
+
+// issue 28772 part 2
+
+const issue28772Constant2 = C.issue28772Constant2
diff --git a/libgo/misc/cgo/test/twoargs.go b/libgo/misc/cgo/test/twoargs.go
deleted file mode 100644
index ca0534c..0000000
--- a/libgo/misc/cgo/test/twoargs.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 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.
-
-// Crash from call with two arguments that need pointer checking.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-static void twoargs1(void *p, int n) {}
-static void *twoargs2() { return 0; }
-static int twoargs3(void * p) { return 0; }
-*/
-import "C"
-
-import "unsafe"
-
-func twoargsF() {
- v := []string{}
- C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
-}
diff --git a/libgo/misc/cgo/testcarchive/carchive_test.go b/libgo/misc/cgo/testcarchive/carchive_test.go
index 457ac0d..7051670 100644
--- a/libgo/misc/cgo/testcarchive/carchive_test.go
+++ b/libgo/misc/cgo/testcarchive/carchive_test.go
@@ -8,8 +8,10 @@ import (
"bufio"
"bytes"
"debug/elf"
+ "flag"
"fmt"
"io/ioutil"
+ "log"
"os"
"os/exec"
"path/filepath"
@@ -28,16 +30,47 @@ var bin []string
// C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
var cc []string
-// An environment with GOPATH=$(pwd).
-var gopathEnv []string
-
// ".exe" on Windows.
var exeSuffix string
-var GOOS, GOARCH string
+var GOOS, GOARCH, GOPATH string
var libgodir string
-func init() {
+func TestMain(m *testing.M) {
+ flag.Parse()
+ if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+ fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
+ os.Exit(0)
+ }
+ log.SetFlags(log.Lshortfile)
+ os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+ // We need a writable GOPATH in which to run the tests.
+ // Construct one in a temporary directory.
+ var err error
+ GOPATH, err = ioutil.TempDir("", "carchive_test")
+ if err != nil {
+ log.Panic(err)
+ }
+ defer os.RemoveAll(GOPATH)
+ os.Setenv("GOPATH", GOPATH)
+
+ // Copy testdata into GOPATH/src/testarchive, along with a go.mod file
+ // declaring the same path.
+ modRoot := filepath.Join(GOPATH, "src", "testcarchive")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ log.Panic(err)
+ }
+ if err := os.Chdir(modRoot); err != nil {
+ log.Panic(err)
+ }
+ os.Setenv("PWD", modRoot)
+ if err := ioutil.WriteFile("go.mod", []byte("module testcarchive\n"), 0666); err != nil {
+ log.Panic(err)
+ }
+
GOOS = goEnv("GOOS")
GOARCH = goEnv("GOARCH")
bin = cmdToRun("./testp")
@@ -83,50 +116,41 @@ func init() {
// TODO(crawshaw): can we do better?
cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
}
- libgodir = GOOS + "_" + GOARCH
+ if GOOS == "aix" {
+ // -Wl,-bnoobjreorder is mandatory to keep the same layout
+ // in .text section.
+ cc = append(cc, "-Wl,-bnoobjreorder")
+ }
+ libbase := GOOS + "_" + GOARCH
if runtime.Compiler == "gccgo" {
- libgodir = "gccgo_" + libgodir + "_fPIC"
+ libbase = "gccgo_" + libbase + "_fPIC"
} else {
switch GOOS {
case "darwin":
if GOARCH == "arm" || GOARCH == "arm64" {
- libgodir += "_shared"
+ libbase += "_shared"
}
- case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
- libgodir += "_shared"
+ case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
+ libbase += "_shared"
}
}
- cc = append(cc, "-I", filepath.Join("pkg", libgodir))
-
- // Build an environment with GOPATH=$(pwd)
- env := os.Environ()
- var n []string
- for _, e := range env {
- if !strings.HasPrefix(e, "GOPATH=") {
- n = append(n, e)
- }
- }
- dir, err := os.Getwd()
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(2)
- }
- n = append(n, "GOPATH="+dir)
- gopathEnv = n
+ libgodir = filepath.Join(GOPATH, "pkg", libbase, "testcarchive")
+ cc = append(cc, "-I", libgodir)
if GOOS == "windows" {
exeSuffix = ".exe"
}
+
+ return m.Run()
}
func goEnv(key string) string {
out, err := exec.Command("go", "env", key).Output()
if err != nil {
- fmt.Fprintf(os.Stderr, "go env %s failed:\n%s\n", key, err)
if ee, ok := err.(*exec.ExitError); ok {
fmt.Fprintf(os.Stderr, "%s", ee.Stderr)
}
- os.Exit(2)
+ log.Panicf("go env %s failed:\n%s\n", key, err)
}
return strings.TrimSpace(string(out))
}
@@ -143,7 +167,6 @@ func cmdToRun(name string) []string {
func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) {
t.Helper()
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
- cmd.Env = gopathEnv
t.Log(buildcmd)
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
@@ -204,7 +227,7 @@ func checkLineComments(t *testing.T, hdrname string) {
}
func TestInstall(t *testing.T) {
- defer os.RemoveAll("pkg")
+ defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
libgoa := "libgo.a"
if runtime.Compiler == "gccgo" {
@@ -212,17 +235,17 @@ func TestInstall(t *testing.T) {
}
testInstall(t, "./testp1"+exeSuffix,
- filepath.Join("pkg", libgodir, libgoa),
- filepath.Join("pkg", libgodir, "libgo.h"),
- "go", "install", "-i", "-buildmode=c-archive", "libgo")
+ filepath.Join(libgodir, libgoa),
+ filepath.Join(libgodir, "libgo.h"),
+ "go", "install", "-i", "-buildmode=c-archive", "./libgo")
// Test building libgo other than installing it.
// Header files are now present.
testInstall(t, "./testp2"+exeSuffix, "libgo.a", "libgo.h",
- "go", "build", "-buildmode=c-archive", filepath.Join("src", "libgo", "libgo.go"))
+ "go", "build", "-buildmode=c-archive", filepath.Join(".", "libgo", "libgo.go"))
testInstall(t, "./testp3"+exeSuffix, "libgo.a", "libgo.h",
- "go", "build", "-buildmode=c-archive", "-o", "libgo.a", "libgo")
+ "go", "build", "-buildmode=c-archive", "-o", "libgo.a", "./libgo")
}
func TestEarlySignalHandler(t *testing.T) {
@@ -240,11 +263,10 @@ func TestEarlySignalHandler(t *testing.T) {
os.Remove("libgo2.a")
os.Remove("libgo2.h")
os.Remove("testp")
- os.RemoveAll("pkg")
+ os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -273,11 +295,10 @@ func TestSignalForwarding(t *testing.T) {
os.Remove("libgo2.a")
os.Remove("libgo2.h")
os.Remove("testp")
- os.RemoveAll("pkg")
+ os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -308,8 +329,10 @@ func TestSignalForwarding(t *testing.T) {
}
func TestSignalForwardingExternal(t *testing.T) {
- if GOOS == "freebsd" {
+ if GOOS == "freebsd" || GOOS == "aix" {
t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH)
+ } else if GOOS == "darwin" && GOARCH == "amd64" {
+ t.Skipf("skipping on %s/%s: runtime does not permit SI_USER SIGSEGV", GOOS, GOARCH)
}
checkSignalForwardingTest(t)
@@ -317,11 +340,10 @@ func TestSignalForwardingExternal(t *testing.T) {
os.Remove("libgo2.a")
os.Remove("libgo2.h")
os.Remove("testp")
- os.RemoveAll("pkg")
+ os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -433,11 +455,10 @@ func TestOsSignal(t *testing.T) {
os.Remove("libgo3.a")
os.Remove("libgo3.h")
os.Remove("testp")
- os.RemoveAll("pkg")
+ os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "libgo3")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "./libgo3")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -469,11 +490,10 @@ func TestSigaltstack(t *testing.T) {
os.Remove("libgo4.a")
os.Remove("libgo4.h")
os.Remove("testp")
- os.RemoveAll("pkg")
+ os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "libgo4")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "./libgo4")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -511,13 +531,16 @@ func TestExtar(t *testing.T) {
if runtime.Compiler == "gccgo" {
t.Skip("skipping -extar test when using gccgo")
}
+ if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
+ t.Skip("shell scripts are not executable on iOS hosts")
+ }
defer func() {
os.Remove("libgo4.a")
os.Remove("libgo4.h")
os.Remove("testar")
os.Remove("testar.ran")
- os.RemoveAll("pkg")
+ os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
os.Remove("testar")
@@ -530,8 +553,7 @@ func TestExtar(t *testing.T) {
t.Fatal(err)
}
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "libgo4")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "./libgo4")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -555,11 +577,10 @@ func TestPIE(t *testing.T) {
defer func() {
os.Remove("testp" + exeSuffix)
- os.RemoveAll("pkg")
+ os.RemoveAll(filepath.Join(GOPATH, "pkg"))
}()
- cmd := exec.Command("go", "install", "-i", "-buildmode=c-archive", "libgo")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "install", "-i", "-buildmode=c-archive", "./libgo")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -570,7 +591,7 @@ func TestPIE(t *testing.T) {
libgoa = "liblibgo.a"
}
- ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join("pkg", libgodir, libgoa))
+ ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join(libgodir, libgoa))
if runtime.Compiler == "gccgo" {
ccArgs = append(ccArgs, "-lgo")
}
@@ -589,13 +610,15 @@ func TestPIE(t *testing.T) {
t.Fatal(err)
}
- f, err := elf.Open("testp" + exeSuffix)
- if err != nil {
- t.Fatal("elf.Open failed: ", err)
- }
- defer f.Close()
- if hasDynTag(t, f, elf.DT_TEXTREL) {
- t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
+ if GOOS != "aix" {
+ f, err := elf.Open("testp" + exeSuffix)
+ if err != nil {
+ t.Fatal("elf.Open failed: ", err)
+ }
+ defer f.Close()
+ if hasDynTag(t, f, elf.DT_TEXTREL) {
+ t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix)
+ }
}
}
@@ -643,8 +666,7 @@ func TestSIGPROF(t *testing.T) {
os.Remove("libgo6.h")
}()
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "libgo6")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "./libgo6")
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
t.Fatal(err)
@@ -683,8 +705,7 @@ func TestCompileWithoutShared(t *testing.T) {
os.Remove("libgo2.h")
}()
- cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "libgo2")
- cmd.Env = gopathEnv
+ cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "./libgo2")
t.Log(cmd.Args)
out, err := cmd.CombinedOutput()
t.Logf("%s", out)
@@ -732,15 +753,14 @@ func TestCompileWithoutShared(t *testing.T) {
// Test that installing a second time recreates the header files.
func TestCachedInstall(t *testing.T) {
- defer os.RemoveAll("pkg")
+ defer os.RemoveAll(filepath.Join(GOPATH, "pkg"))
- h1 := filepath.Join("pkg", libgodir, "libgo.h")
- h2 := filepath.Join("pkg", libgodir, "p.h")
+ h1 := filepath.Join(libgodir, "libgo.h")
+ h2 := filepath.Join(libgodir, "p.h")
- buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "libgo"}
+ buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "./libgo"}
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
- cmd.Env = gopathEnv
t.Log(buildcmd)
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
@@ -762,7 +782,6 @@ func TestCachedInstall(t *testing.T) {
}
cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
- cmd.Env = gopathEnv
t.Log(buildcmd)
if out, err := cmd.CombinedOutput(); err != nil {
t.Logf("%s", out)
diff --git a/libgo/misc/cgo/testcarchive/overlaydir_test.go b/libgo/misc/cgo/testcarchive/overlaydir_test.go
new file mode 100644
index 0000000..68878e4
--- /dev/null
+++ b/libgo/misc/cgo/testcarchive/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package carchive_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/testcarchive/src/libgo/libgo.go b/libgo/misc/cgo/testcarchive/testdata/libgo/libgo.go
index 45958a5..37b30c1 100644
--- a/libgo/misc/cgo/testcarchive/src/libgo/libgo.go
+++ b/libgo/misc/cgo/testcarchive/testdata/libgo/libgo.go
@@ -10,7 +10,7 @@ import (
"syscall"
"time"
- _ "p"
+ _ "testcarchive/p"
)
import "C"
diff --git a/libgo/misc/cgo/testcarchive/src/libgo2/libgo2.go b/libgo/misc/cgo/testcarchive/testdata/libgo2/libgo2.go
index 19c8e1a..19c8e1a 100644
--- a/libgo/misc/cgo/testcarchive/src/libgo2/libgo2.go
+++ b/libgo/misc/cgo/testcarchive/testdata/libgo2/libgo2.go
diff --git a/libgo/misc/cgo/testcarchive/src/libgo3/libgo3.go b/libgo/misc/cgo/testcarchive/testdata/libgo3/libgo3.go
index 3725f7a..3725f7a 100644
--- a/libgo/misc/cgo/testcarchive/src/libgo3/libgo3.go
+++ b/libgo/misc/cgo/testcarchive/testdata/libgo3/libgo3.go
diff --git a/libgo/misc/cgo/testcarchive/src/libgo4/libgo4.go b/libgo/misc/cgo/testcarchive/testdata/libgo4/libgo4.go
index 8cc1895..8cc1895 100644
--- a/libgo/misc/cgo/testcarchive/src/libgo4/libgo4.go
+++ b/libgo/misc/cgo/testcarchive/testdata/libgo4/libgo4.go
diff --git a/libgo/misc/cgo/testcarchive/src/libgo6/sigprof.go b/libgo/misc/cgo/testcarchive/testdata/libgo6/sigprof.go
index 4cb05dc..4cb05dc 100644
--- a/libgo/misc/cgo/testcarchive/src/libgo6/sigprof.go
+++ b/libgo/misc/cgo/testcarchive/testdata/libgo6/sigprof.go
diff --git a/libgo/misc/cgo/testcarchive/main.c b/libgo/misc/cgo/testcarchive/testdata/main.c
index 163b539..163b539 100644
--- a/libgo/misc/cgo/testcarchive/main.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main.c
diff --git a/libgo/misc/cgo/testcarchive/main2.c b/libgo/misc/cgo/testcarchive/testdata/main2.c
index 769cd49..769cd49 100644
--- a/libgo/misc/cgo/testcarchive/main2.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main2.c
diff --git a/libgo/misc/cgo/testcarchive/main3.c b/libgo/misc/cgo/testcarchive/testdata/main3.c
index 60a16cf..60a16cf 100644
--- a/libgo/misc/cgo/testcarchive/main3.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main3.c
diff --git a/libgo/misc/cgo/testcarchive/main4.c b/libgo/misc/cgo/testcarchive/testdata/main4.c
index 4fd55e7..04f7740 100644
--- a/libgo/misc/cgo/testcarchive/main4.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main4.c
@@ -14,6 +14,13 @@
#include "libgo4.h"
+#ifdef _AIX
+// On AIX, CSIGSTKSZ is too small to handle Go sighandler.
+#define CSIGSTKSZ 0x4000
+#else
+#define CSIGSTKSZ SIGSTKSZ
+#endif
+
static void die(const char* msg) {
perror(msg);
exit(EXIT_FAILURE);
@@ -53,12 +60,12 @@ static void* thread1(void* arg __attribute__ ((unused))) {
// Set up an alternate signal stack for this thread.
memset(&ss, 0, sizeof ss);
- ss.ss_sp = malloc(SIGSTKSZ);
+ ss.ss_sp = malloc(CSIGSTKSZ);
if (ss.ss_sp == NULL) {
die("malloc");
}
ss.ss_flags = 0;
- ss.ss_size = SIGSTKSZ;
+ ss.ss_size = CSIGSTKSZ;
if (sigaltstack(&ss, NULL) < 0) {
die("sigaltstack");
}
@@ -93,7 +100,7 @@ static void* thread1(void* arg __attribute__ ((unused))) {
fprintf(stderr, "sigaltstack disabled on return from Go\n");
ok = 0;
} else if (nss.ss_sp != ss.ss_sp) {
- fprintf(stderr, "sigalstack changed on return from Go\n");
+ fprintf(stderr, "sigaltstack changed on return from Go\n");
ok = 0;
}
@@ -112,12 +119,12 @@ static void* thread2(void* arg __attribute__ ((unused))) {
// Set up an alternate signal stack for this thread.
memset(&ss, 0, sizeof ss);
- ss.ss_sp = malloc(SIGSTKSZ);
+ ss.ss_sp = malloc(CSIGSTKSZ);
if (ss.ss_sp == NULL) {
die("malloc");
}
ss.ss_flags = 0;
- ss.ss_size = SIGSTKSZ;
+ ss.ss_size = CSIGSTKSZ;
if (sigaltstack(&ss, NULL) < 0) {
die("sigaltstack");
}
@@ -150,7 +157,7 @@ static void* thread2(void* arg __attribute__ ((unused))) {
fprintf(stderr, "sigaltstack disabled on return from Go\n");
ok = 0;
} else if (nss.ss_sp != ss.ss_sp) {
- fprintf(stderr, "sigalstack changed on return from Go\n");
+ fprintf(stderr, "sigaltstack changed on return from Go\n");
ok = 0;
}
diff --git a/libgo/misc/cgo/testcarchive/main5.c b/libgo/misc/cgo/testcarchive/testdata/main5.c
index 897b70d..d431ce0 100644
--- a/libgo/misc/cgo/testcarchive/main5.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main5.c
@@ -14,6 +14,8 @@
#include "libgo2.h"
+int *nilp;
+
int main(int argc, char** argv) {
int verbose;
int test;
@@ -39,7 +41,7 @@ int main(int argc, char** argv) {
printf("attempting segfault\n");
}
- volatile int crash = *(int *) 0;
+ *nilp = 0;
break;
}
@@ -85,7 +87,7 @@ int main(int argc, char** argv) {
printf("write(2) unexpectedly succeeded\n");
return 0;
}
- printf("did not receieve SIGPIPE\n");
+ printf("did not receive SIGPIPE\n");
return 0;
}
default:
diff --git a/libgo/misc/cgo/testcarchive/main6.c b/libgo/misc/cgo/testcarchive/testdata/main6.c
index 2745eb9..2745eb9 100644
--- a/libgo/misc/cgo/testcarchive/main6.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main6.c
diff --git a/libgo/misc/cgo/testcarchive/main_unix.c b/libgo/misc/cgo/testcarchive/testdata/main_unix.c
index b23ac1c..b23ac1c 100644
--- a/libgo/misc/cgo/testcarchive/main_unix.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main_unix.c
diff --git a/libgo/misc/cgo/testcarchive/main_windows.c b/libgo/misc/cgo/testcarchive/testdata/main_windows.c
index eded8af..eded8af 100644
--- a/libgo/misc/cgo/testcarchive/main_windows.c
+++ b/libgo/misc/cgo/testcarchive/testdata/main_windows.c
diff --git a/libgo/misc/cgo/testcarchive/src/p/p.go b/libgo/misc/cgo/testcarchive/testdata/p/p.go
index 82b445c..82b445c 100644
--- a/libgo/misc/cgo/testcarchive/src/p/p.go
+++ b/libgo/misc/cgo/testcarchive/testdata/p/p.go
diff --git a/libgo/misc/cgo/testcshared/cshared_test.go b/libgo/misc/cgo/testcshared/cshared_test.go
index e5b90ff..daef3a9 100644
--- a/libgo/misc/cgo/testcshared/cshared_test.go
+++ b/libgo/misc/cgo/testcshared/cshared_test.go
@@ -5,14 +5,16 @@
package cshared_test
import (
+ "bytes"
"debug/elf"
+ "flag"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
- "path"
"path/filepath"
+ "runtime"
"strings"
"sync"
"testing"
@@ -22,9 +24,6 @@ import (
// C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)).
var cc []string
-// An environment with GOPATH=$(pwd).
-var gopathEnv []string
-
// ".exe" on Windows.
var exeSuffix string
@@ -33,6 +32,17 @@ var installdir, androiddir string
var libSuffix, libgoname string
func TestMain(m *testing.M) {
+ os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+ log.SetFlags(log.Lshortfile)
+ flag.Parse()
+ if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+ fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
+ os.Exit(0)
+ }
+
GOOS = goEnv("GOOS")
GOARCH = goEnv("GOARCH")
GOROOT = goEnv("GOROOT")
@@ -41,31 +51,17 @@ func TestMain(m *testing.M) {
log.Fatalf("Unable able to find GOROOT at '%s'", GOROOT)
}
- // Directory where cgo headers and outputs will be installed.
- // The installation directory format varies depending on the platform.
- installdir = path.Join("pkg", fmt.Sprintf("%s_%s_testcshared", GOOS, GOARCH))
- switch GOOS {
- case "darwin":
- libSuffix = "dylib"
- case "windows":
- libSuffix = "dll"
- default:
- libSuffix = "so"
- installdir = path.Join("pkg", fmt.Sprintf("%s_%s_testcshared_shared", GOOS, GOARCH))
- }
-
androiddir = fmt.Sprintf("/data/local/tmp/testcshared-%d", os.Getpid())
- if GOOS == "android" {
- args := append(adbCmd(), "shell", "mkdir", "-p", androiddir)
+ if runtime.GOOS != GOOS && GOOS == "android" {
+ args := append(adbCmd(), "exec-out", "mkdir", "-p", androiddir)
cmd := exec.Command(args[0], args[1:]...)
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("setupAndroid failed: %v\n%s\n", err, out)
}
+ defer cleanupAndroid()
}
- libgoname = "libgo." + libSuffix
-
cc = []string{goEnv("CC")}
out := goEnv("GOGCCFLAGS")
@@ -115,39 +111,62 @@ func TestMain(m *testing.M) {
if GOARCH == "arm" || GOARCH == "arm64" {
libgodir += "_shared"
}
- case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris":
+ case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris", "illumos":
libgodir += "_shared"
}
cc = append(cc, "-I", filepath.Join("pkg", libgodir))
- // Build an environment with GOPATH=$(pwd)
- dir, err := os.Getwd()
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(2)
- }
- gopathEnv = append(os.Environ(), "GOPATH="+dir)
-
if GOOS == "windows" {
exeSuffix = ".exe"
}
- st := m.Run()
+ // Copy testdata into GOPATH/src/testcshared, along with a go.mod file
+ // declaring the same path.
- os.Remove(libgoname)
- os.RemoveAll("pkg")
- cleanupHeaders()
- cleanupAndroid()
+ GOPATH, err := ioutil.TempDir("", "cshared_test")
+ if err != nil {
+ log.Panic(err)
+ }
+ defer os.RemoveAll(GOPATH)
+ os.Setenv("GOPATH", GOPATH)
- os.Exit(st)
+ // Copy testdata into GOPATH/src/testarchive, along with a go.mod file
+ // declaring the same path.
+ modRoot := filepath.Join(GOPATH, "src", "testcshared")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ log.Panic(err)
+ }
+ if err := os.Chdir(modRoot); err != nil {
+ log.Panic(err)
+ }
+ os.Setenv("PWD", modRoot)
+ if err := ioutil.WriteFile("go.mod", []byte("module testcshared\n"), 0666); err != nil {
+ log.Panic(err)
+ }
+
+ // Directory where cgo headers and outputs will be installed.
+ // The installation directory format varies depending on the platform.
+ output, err := exec.Command("go", "list",
+ "-buildmode=c-shared",
+ "-installsuffix", "testcshared",
+ "-f", "{{.Target}}",
+ "./libgo").CombinedOutput()
+ if err != nil {
+ log.Panicf("go list failed: %v\n%s", err, output)
+ }
+ target := string(bytes.TrimSpace(output))
+ libgoname = filepath.Base(target)
+ installdir = filepath.Dir(target)
+ libSuffix = strings.TrimPrefix(filepath.Ext(target), ".")
+
+ return m.Run()
}
func goEnv(key string) string {
out, err := exec.Command("go", "env", key).Output()
if err != nil {
- fmt.Fprintf(os.Stderr, "go env %s failed:\n%s", key, err)
- fmt.Fprintf(os.Stderr, "%s", err.(*exec.ExitError).Stderr)
- os.Exit(2)
+ log.Printf("go env %s failed:\n%s", key, err)
+ log.Panicf("%s", err.(*exec.ExitError).Stderr)
}
return strings.TrimSpace(string(out))
}
@@ -165,7 +184,7 @@ func adbCmd() []string {
}
func adbPush(t *testing.T, filename string) {
- if GOOS != "android" {
+ if runtime.GOOS == GOOS || GOOS != "android" {
return
}
args := append(adbCmd(), "push", filename, fmt.Sprintf("%s/%s", androiddir, filename))
@@ -179,7 +198,7 @@ func adbRun(t *testing.T, env []string, adbargs ...string) string {
if GOOS != "android" {
t.Fatalf("trying to run adb command when operating system is not android.")
}
- args := append(adbCmd(), "shell")
+ args := append(adbCmd(), "exec-out")
// Propagate LD_LIBRARY_PATH to the adb shell invocation.
for _, e := range env {
if strings.Index(e, "LD_LIBRARY_PATH=") != -1 {
@@ -197,10 +216,12 @@ func adbRun(t *testing.T, env []string, adbargs ...string) string {
return strings.Replace(string(out), "\r", "", -1)
}
-func run(t *testing.T, env []string, args ...string) string {
+func run(t *testing.T, extraEnv []string, args ...string) string {
t.Helper()
cmd := exec.Command(args[0], args[1:]...)
- cmd.Env = env
+ if len(extraEnv) > 0 {
+ cmd.Env = append(os.Environ(), extraEnv...)
+ }
if GOOS != "windows" {
// TestUnexportedSymbols relies on file descriptor 30
@@ -220,12 +241,12 @@ func run(t *testing.T, env []string, args ...string) string {
return string(out)
}
-func runExe(t *testing.T, env []string, args ...string) string {
+func runExe(t *testing.T, extraEnv []string, args ...string) string {
t.Helper()
- if GOOS == "android" {
- return adbRun(t, env, args...)
+ if runtime.GOOS != GOOS && GOOS == "android" {
+ return adbRun(t, append(os.Environ(), extraEnv...), args...)
}
- return run(t, env, args...)
+ return run(t, extraEnv, args...)
}
func runCC(t *testing.T, args ...string) string {
@@ -237,9 +258,8 @@ func runCC(t *testing.T, args ...string) string {
func createHeaders() error {
args := []string{"go", "install", "-i", "-buildmode=c-shared",
- "-installsuffix", "testcshared", "libgo"}
+ "-installsuffix", "testcshared", "./libgo"}
cmd := exec.Command(args[0], args[1:]...)
- cmd.Env = gopathEnv
out, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
@@ -248,15 +268,14 @@ func createHeaders() error {
args = []string{"go", "build", "-buildmode=c-shared",
"-installsuffix", "testcshared",
"-o", libgoname,
- filepath.Join("src", "libgo", "libgo.go")}
+ filepath.Join(".", "libgo", "libgo.go")}
cmd = exec.Command(args[0], args[1:]...)
- cmd.Env = gopathEnv
out, err = cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out)
}
- if GOOS == "android" {
+ if runtime.GOOS != GOOS && GOOS == "android" {
args = append(adbCmd(), "push", libgoname, fmt.Sprintf("%s/%s", androiddir, libgoname))
cmd = exec.Command(args[0], args[1:]...)
out, err = cmd.CombinedOutput()
@@ -282,19 +301,15 @@ func createHeadersOnce(t *testing.T) {
}
}
-func cleanupHeaders() {
- os.Remove("libgo.h")
-}
-
func cleanupAndroid() {
if GOOS != "android" {
return
}
- args := append(adbCmd(), "shell", "rm", "-rf", androiddir)
+ args := append(adbCmd(), "exec-out", "rm", "-rf", androiddir)
cmd := exec.Command(args[0], args[1:]...)
out, err := cmd.CombinedOutput()
if err != nil {
- log.Fatalf("cleanupAndroid failed: %v\n%s\n", err, out)
+ log.Panicf("cleanupAndroid failed: %v\n%s\n", err, out)
}
}
@@ -312,7 +327,7 @@ func TestExportedSymbols(t *testing.T) {
defer os.Remove(bin)
- out := runExe(t, append(gopathEnv, "LD_LIBRARY_PATH=."), bin)
+ out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
if strings.TrimSpace(out) != "PASS" {
t.Error(out)
}
@@ -361,11 +376,11 @@ func TestUnexportedSymbols(t *testing.T) {
libname := "libgo2." + libSuffix
run(t,
- gopathEnv,
+ nil,
"go", "build",
"-buildmode=c-shared",
"-installsuffix", "testcshared",
- "-o", libname, "libgo2",
+ "-o", libname, "./libgo2",
)
adbPush(t, libname)
@@ -380,7 +395,7 @@ func TestUnexportedSymbols(t *testing.T) {
defer os.Remove(libname)
defer os.Remove(bin)
- out := runExe(t, append(gopathEnv, "LD_LIBRARY_PATH=."), bin)
+ out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin)
if strings.TrimSpace(out) != "PASS" {
t.Error(out)
@@ -418,7 +433,7 @@ func TestMainExportedOnAndroid(t *testing.T) {
func testSignalHandlers(t *testing.T, pkgname, cfile, cmd string) {
libname := pkgname + "." + libSuffix
run(t,
- gopathEnv,
+ nil,
"go", "build",
"-buildmode=c-shared",
"-installsuffix", "testcshared",
@@ -451,7 +466,7 @@ func TestSignalHandlers(t *testing.T) {
t.Logf("Skipping on %s", GOOS)
return
}
- testSignalHandlers(t, "libgo4", "main4.c", "testp4")
+ testSignalHandlers(t, "./libgo4", "main4.c", "testp4")
}
// test5: test signal handlers with os/signal.Notify
@@ -461,7 +476,7 @@ func TestSignalHandlersWithNotify(t *testing.T) {
t.Logf("Skipping on %s", GOOS)
return
}
- testSignalHandlers(t, "libgo5", "main5.c", "testp5")
+ testSignalHandlers(t, "./libgo5", "main5.c", "testp5")
}
func TestPIE(t *testing.T) {
@@ -513,16 +528,18 @@ func TestCachedInstall(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- // defer os.RemoveAll(tmpdir)
+ defer os.RemoveAll(tmpdir)
- copyFile(t, filepath.Join(tmpdir, "src", "libgo", "libgo.go"), filepath.Join("src", "libgo", "libgo.go"))
- copyFile(t, filepath.Join(tmpdir, "src", "p", "p.go"), filepath.Join("src", "p", "p.go"))
+ copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "go.mod"), "go.mod")
+ copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go"))
+ copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go"))
- env := append(os.Environ(), "GOPATH="+tmpdir)
+ env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin"))
- buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "libgo"}
+ buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"}
cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+ cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
cmd.Env = env
t.Log(buildcmd)
out, err := cmd.CombinedOutput()
@@ -572,6 +589,7 @@ func TestCachedInstall(t *testing.T) {
}
cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+ cmd.Dir = filepath.Join(tmpdir, "src", "testcshared")
cmd.Env = env
t.Log(buildcmd)
out, err = cmd.CombinedOutput()
@@ -621,8 +639,8 @@ func TestGo2C2Go(t *testing.T) {
}
defer os.RemoveAll(tmpdir)
- shlib := filepath.Join(tmpdir, "libtestgo2c2go."+libSuffix)
- run(t, gopathEnv, "go", "build", "-buildmode=c-shared", "-o", shlib, "go2c2go/go")
+ lib := filepath.Join(tmpdir, "libtestgo2c2go."+libSuffix)
+ run(t, nil, "go", "build", "-buildmode=c-shared", "-o", lib, "./go2c2go/go")
cgoCflags := os.Getenv("CGO_CFLAGS")
if cgoCflags != "" {
@@ -636,7 +654,7 @@ func TestGo2C2Go(t *testing.T) {
}
cgoLdflags += "-L" + tmpdir + " -ltestgo2c2go"
- goenv := append(gopathEnv[:len(gopathEnv):len(gopathEnv)], "CGO_CFLAGS="+cgoCflags, "CGO_LDFLAGS="+cgoLdflags)
+ goenv := []string{"CGO_CFLAGS=" + cgoCflags, "CGO_LDFLAGS=" + cgoLdflags}
ldLibPath := os.Getenv("LD_LIBRARY_PATH")
if ldLibPath != "" {
@@ -644,13 +662,13 @@ func TestGo2C2Go(t *testing.T) {
}
ldLibPath += tmpdir
- runenv := append(gopathEnv[:len(gopathEnv):len(gopathEnv)], "LD_LIBRARY_PATH="+ldLibPath)
+ runenv := []string{"LD_LIBRARY_PATH=" + ldLibPath}
bin := filepath.Join(tmpdir, "m1") + exeSuffix
- run(t, goenv, "go", "build", "-o", bin, "go2c2go/m1")
+ run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m1")
runExe(t, runenv, bin)
bin = filepath.Join(tmpdir, "m2") + exeSuffix
- run(t, goenv, "go", "build", "-o", bin, "go2c2go/m2")
+ run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m2")
runExe(t, runenv, bin)
}
diff --git a/libgo/misc/cgo/testcshared/overlaydir_test.go b/libgo/misc/cgo/testcshared/overlaydir_test.go
new file mode 100644
index 0000000..1eaabf6
--- /dev/null
+++ b/libgo/misc/cgo/testcshared/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package cshared_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/go/shlib.go b/libgo/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go
index 76a5323..76a5323 100644
--- a/libgo/misc/cgo/testcshared/src/go2c2go/go/shlib.go
+++ b/libgo/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/m1/c.c b/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/c.c
index 0e8fac4..0e8fac4 100644
--- a/libgo/misc/cgo/testcshared/src/go2c2go/m1/c.c
+++ b/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/c.c
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/m1/main.go b/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/main.go
index 17ba1eb..17ba1eb 100644
--- a/libgo/misc/cgo/testcshared/src/go2c2go/m1/main.go
+++ b/libgo/misc/cgo/testcshared/testdata/go2c2go/m1/main.go
diff --git a/libgo/misc/cgo/testcshared/src/go2c2go/m2/main.go b/libgo/misc/cgo/testcshared/testdata/go2c2go/m2/main.go
index 91bf308..91bf308 100644
--- a/libgo/misc/cgo/testcshared/src/go2c2go/m2/main.go
+++ b/libgo/misc/cgo/testcshared/testdata/go2c2go/m2/main.go
diff --git a/libgo/misc/cgo/testcshared/src/libgo/libgo.go b/libgo/misc/cgo/testcshared/testdata/libgo/libgo.go
index 8a4bf79..0634417 100644
--- a/libgo/misc/cgo/testcshared/src/libgo/libgo.go
+++ b/libgo/misc/cgo/testcshared/testdata/libgo/libgo.go
@@ -5,8 +5,8 @@
package main
import (
- _ "p"
"syscall"
+ _ "testcshared/p"
"time"
)
diff --git a/libgo/misc/cgo/testcshared/src/libgo2/dup2.go b/libgo/misc/cgo/testcshared/testdata/libgo2/dup2.go
index d343aa5..d18f0b1 100644
--- a/libgo/misc/cgo/testcshared/src/libgo2/dup2.go
+++ b/libgo/misc/cgo/testcshared/testdata/libgo2/dup2.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd linux,!arm64,!riscv64 netbsd openbsd
+// +build darwin dragonfly freebsd linux,!arm64 netbsd openbsd
package main
diff --git a/libgo/misc/cgo/testcshared/src/libgo2/dup3.go b/libgo/misc/cgo/testcshared/testdata/libgo2/dup3.go
index 459f0dc..c9c65a6 100644
--- a/libgo/misc/cgo/testcshared/src/libgo2/dup3.go
+++ b/libgo/misc/cgo/testcshared/testdata/libgo2/dup3.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build linux,arm64 linux,riscv64
+// +build linux,arm64
package main
diff --git a/libgo/misc/cgo/testcshared/src/libgo2/libgo2.go b/libgo/misc/cgo/testcshared/testdata/libgo2/libgo2.go
index e57c93b..e57c93b 100644
--- a/libgo/misc/cgo/testcshared/src/libgo2/libgo2.go
+++ b/libgo/misc/cgo/testcshared/testdata/libgo2/libgo2.go
diff --git a/libgo/misc/cgo/testcshared/src/libgo4/libgo4.go b/libgo/misc/cgo/testcshared/testdata/libgo4/libgo4.go
index ab40b75..ab40b75 100644
--- a/libgo/misc/cgo/testcshared/src/libgo4/libgo4.go
+++ b/libgo/misc/cgo/testcshared/testdata/libgo4/libgo4.go
diff --git a/libgo/misc/cgo/testcshared/src/libgo5/libgo5.go b/libgo/misc/cgo/testcshared/testdata/libgo5/libgo5.go
index 94e5d21c..94e5d21c 100644
--- a/libgo/misc/cgo/testcshared/src/libgo5/libgo5.go
+++ b/libgo/misc/cgo/testcshared/testdata/libgo5/libgo5.go
diff --git a/libgo/misc/cgo/testcshared/main0.c b/libgo/misc/cgo/testcshared/testdata/main0.c
index 39ef7e3..39ef7e3 100644
--- a/libgo/misc/cgo/testcshared/main0.c
+++ b/libgo/misc/cgo/testcshared/testdata/main0.c
diff --git a/libgo/misc/cgo/testcshared/main1.c b/libgo/misc/cgo/testcshared/testdata/main1.c
index 420dd1e..420dd1e 100644
--- a/libgo/misc/cgo/testcshared/main1.c
+++ b/libgo/misc/cgo/testcshared/testdata/main1.c
diff --git a/libgo/misc/cgo/testcshared/main2.c b/libgo/misc/cgo/testcshared/testdata/main2.c
index f89bcca..f89bcca 100644
--- a/libgo/misc/cgo/testcshared/main2.c
+++ b/libgo/misc/cgo/testcshared/testdata/main2.c
diff --git a/libgo/misc/cgo/testcshared/main3.c b/libgo/misc/cgo/testcshared/testdata/main3.c
index 49cc055..49cc055 100644
--- a/libgo/misc/cgo/testcshared/main3.c
+++ b/libgo/misc/cgo/testcshared/testdata/main3.c
diff --git a/libgo/misc/cgo/testcshared/main4.c b/libgo/misc/cgo/testcshared/testdata/main4.c
index 355cdef..355cdef 100644
--- a/libgo/misc/cgo/testcshared/main4.c
+++ b/libgo/misc/cgo/testcshared/testdata/main4.c
diff --git a/libgo/misc/cgo/testcshared/main5.c b/libgo/misc/cgo/testcshared/testdata/main5.c
index 1bc9910..1bc9910 100644
--- a/libgo/misc/cgo/testcshared/main5.c
+++ b/libgo/misc/cgo/testcshared/testdata/main5.c
diff --git a/libgo/misc/cgo/testcshared/src/p/p.go b/libgo/misc/cgo/testcshared/testdata/p/p.go
index 0f02cf3..0f02cf3 100644
--- a/libgo/misc/cgo/testcshared/src/p/p.go
+++ b/libgo/misc/cgo/testcshared/testdata/p/p.go
diff --git a/libgo/misc/cgo/testgodefs/test.bash b/libgo/misc/cgo/testgodefs/test.bash
index 012d007..e4ce2ee 100644
--- a/libgo/misc/cgo/testgodefs/test.bash
+++ b/libgo/misc/cgo/testgodefs/test.bash
@@ -9,6 +9,8 @@
# import "C" block. Add more tests here.
FILE_PREFIXES="anonunion issue8478 fieldtypedef"
+cd testdata
+
RM=
for FP in $FILE_PREFIXES
do
@@ -16,7 +18,7 @@ do
RM="${RM} ${FP}_defs.go"
done
-go build . && ./testgodefs
+go build -o testgodefs . && ./testgodefs
EXIT=$?
rm -rf _obj testgodefs ${RM}
exit $EXIT
diff --git a/libgo/misc/cgo/testgodefs/anonunion.go b/libgo/misc/cgo/testgodefs/testdata/anonunion.go
index 18840f2..18840f2 100644
--- a/libgo/misc/cgo/testgodefs/anonunion.go
+++ b/libgo/misc/cgo/testgodefs/testdata/anonunion.go
diff --git a/libgo/misc/cgo/testgodefs/fieldtypedef.go b/libgo/misc/cgo/testgodefs/testdata/fieldtypedef.go
index 45c0bf8..45c0bf8 100644
--- a/libgo/misc/cgo/testgodefs/fieldtypedef.go
+++ b/libgo/misc/cgo/testgodefs/testdata/fieldtypedef.go
diff --git a/libgo/misc/cgo/testgodefs/issue8478.go b/libgo/misc/cgo/testgodefs/testdata/issue8478.go
index 2321446..2321446 100644
--- a/libgo/misc/cgo/testgodefs/issue8478.go
+++ b/libgo/misc/cgo/testgodefs/testdata/issue8478.go
diff --git a/libgo/misc/cgo/testgodefs/main.go b/libgo/misc/cgo/testgodefs/testdata/main.go
index 1ce0fd0..1ce0fd0 100644
--- a/libgo/misc/cgo/testgodefs/main.go
+++ b/libgo/misc/cgo/testgodefs/testdata/main.go
diff --git a/libgo/misc/cgo/testplugin/altpath/src/common/common.go b/libgo/misc/cgo/testplugin/altpath/testdata/common/common.go
index 505ba02..505ba02 100644
--- a/libgo/misc/cgo/testplugin/altpath/src/common/common.go
+++ b/libgo/misc/cgo/testplugin/altpath/testdata/common/common.go
diff --git a/libgo/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go b/libgo/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go
index 8aacafc..bfb4ba4 100644
--- a/libgo/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go
+++ b/libgo/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go
@@ -10,7 +10,7 @@ import "C"
// The common package imported here does not match the common package
// imported by plugin1. A program that attempts to load plugin1 and
// plugin-mismatch should produce an error.
-import "common"
+import "testplugin/common"
func ReadCommonX() int {
return common.X
diff --git a/libgo/misc/cgo/testplugin/overlaydir_test.go b/libgo/misc/cgo/testplugin/overlaydir_test.go
new file mode 100644
index 0000000..b68436a
--- /dev/null
+++ b/libgo/misc/cgo/testplugin/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package plugin_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/testplugin/plugin_test.go b/libgo/misc/cgo/testplugin/plugin_test.go
new file mode 100644
index 0000000..7e2b6eb
--- /dev/null
+++ b/libgo/misc/cgo/testplugin/plugin_test.go
@@ -0,0 +1,203 @@
+// Copyright 2019 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.
+
+package plugin_test
+
+import (
+ "bytes"
+ "context"
+ "flag"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+ "time"
+)
+
+var gcflags string = os.Getenv("GO_GCFLAGS")
+
+func TestMain(m *testing.M) {
+ flag.Parse()
+ if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+ fmt.Printf("SKIP - short mode and $GO_BUILDER_NAME not set\n")
+ os.Exit(0)
+ }
+ log.SetFlags(log.Lshortfile)
+ os.Exit(testMain(m))
+}
+
+func testMain(m *testing.M) int {
+ // Copy testdata into GOPATH/src/testarchive, along with a go.mod file
+ // declaring the same path.
+
+ GOPATH, err := ioutil.TempDir("", "plugin_test")
+ if err != nil {
+ log.Panic(err)
+ }
+ defer os.RemoveAll(GOPATH)
+
+ modRoot := filepath.Join(GOPATH, "src", "testplugin")
+ altRoot := filepath.Join(GOPATH, "alt", "src", "testplugin")
+ for srcRoot, dstRoot := range map[string]string{
+ "testdata": modRoot,
+ filepath.Join("altpath", "testdata"): altRoot,
+ } {
+ if err := overlayDir(dstRoot, srcRoot); err != nil {
+ log.Panic(err)
+ }
+ if err := ioutil.WriteFile(filepath.Join(dstRoot, "go.mod"), []byte("module testplugin\n"), 0666); err != nil {
+ log.Panic(err)
+ }
+ }
+
+ os.Setenv("GOPATH", filepath.Join(GOPATH, "alt"))
+ if err := os.Chdir(altRoot); err != nil {
+ log.Panic(err)
+ }
+ os.Setenv("PWD", altRoot)
+ goCmd(nil, "build", "-buildmode=plugin", "-o", filepath.Join(modRoot, "plugin-mismatch.so"), "./plugin-mismatch")
+
+ os.Setenv("GOPATH", GOPATH)
+ if err := os.Chdir(modRoot); err != nil {
+ log.Panic(err)
+ }
+ os.Setenv("PWD", modRoot)
+
+ os.Setenv("LD_LIBRARY_PATH", modRoot)
+
+ goCmd(nil, "build", "-i", "-buildmode=plugin", "./plugin1")
+ goCmd(nil, "build", "-buildmode=plugin", "./plugin2")
+ so, err := ioutil.ReadFile("plugin2.so")
+ if err != nil {
+ log.Panic(err)
+ }
+ if err := ioutil.WriteFile("plugin2-dup.so", so, 0444); err != nil {
+ log.Panic(err)
+ }
+
+ goCmd(nil, "build", "-buildmode=plugin", "-o=sub/plugin1.so", "./sub/plugin1")
+ goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed1.so", "./unnamed1/main.go")
+ goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed2.so", "./unnamed2/main.go")
+ goCmd(nil, "build", "-o", "host.exe", "./host")
+
+ return m.Run()
+}
+
+func goCmd(t *testing.T, op string, args ...string) {
+ if t != nil {
+ t.Helper()
+ }
+ run(t, "go", append([]string{op, "-gcflags", gcflags}, args...)...)
+}
+
+func run(t *testing.T, bin string, args ...string) string {
+ cmd := exec.Command(bin, args...)
+ cmd.Stderr = new(strings.Builder)
+ out, err := cmd.Output()
+ if err != nil {
+ if t == nil {
+ log.Panicf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+ } else {
+ t.Helper()
+ t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+ }
+ }
+
+ return string(bytes.TrimSpace(out))
+}
+
+func TestDWARFSections(t *testing.T) {
+ // test that DWARF sections are emitted for plugins and programs importing "plugin"
+ if runtime.GOOS != "darwin" {
+ // On macOS, for some reason, the linker doesn't add debug sections to .so,
+ // see issue #27502.
+ goCmd(t, "run", "./checkdwarf/main.go", "plugin2.so", "plugin2.UnexportedNameReuse")
+ }
+ goCmd(t, "run", "./checkdwarf/main.go", "./host.exe", "main.main")
+}
+
+func TestRunHost(t *testing.T) {
+ run(t, "./host.exe")
+}
+
+func TestUniqueTypesAndItabs(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "./iface_a")
+ goCmd(t, "build", "-buildmode=plugin", "./iface_b")
+ goCmd(t, "build", "-o", "iface.exe", "./iface")
+ run(t, "./iface.exe")
+}
+
+func TestIssue18676(t *testing.T) {
+ // make sure we don't add the same itab twice.
+ // The buggy code hangs forever, so use a timeout to check for that.
+ goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18676/plugin.go")
+ goCmd(t, "build", "-o", "issue18676.exe", "./issue18676/main.go")
+
+ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer cancel()
+ cmd := exec.CommandContext(ctx, "./issue18676.exe")
+ out, err := cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+}
+
+func TestIssue19534(t *testing.T) {
+ // Test that we can load a plugin built in a path with non-alpha characters.
+ goCmd(t, "build", "-buildmode=plugin", "-ldflags='-pluginpath=issue.19534'", "-o", "plugin.so", "./issue19534/plugin.go")
+ goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go")
+ run(t, "./issue19534.exe")
+}
+
+func TestIssue18584(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18584/plugin.go")
+ goCmd(t, "build", "-o", "issue18584.exe", "./issue18584/main.go")
+ run(t, "./issue18584.exe")
+}
+
+func TestIssue19418(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-ldflags=-X main.Val=linkstr", "-o", "plugin.so", "./issue19418/plugin.go")
+ goCmd(t, "build", "-o", "issue19418.exe", "./issue19418/main.go")
+ run(t, "./issue19418.exe")
+}
+
+func TestIssue19529(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue19529/plugin.go")
+}
+
+func TestIssue22175(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin1.so", "./issue22175/plugin1.go")
+ goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin2.so", "./issue22175/plugin2.go")
+ goCmd(t, "build", "-o", "issue22175.exe", "./issue22175/main.go")
+ run(t, "./issue22175.exe")
+}
+
+func TestIssue22295(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "issue.22295.so", "./issue22295.pkg")
+ goCmd(t, "build", "-o", "issue22295.exe", "./issue22295.pkg/main.go")
+ run(t, "./issue22295.exe")
+}
+
+func TestIssue24351(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "issue24351.so", "./issue24351/plugin.go")
+ goCmd(t, "build", "-o", "issue24351.exe", "./issue24351/main.go")
+ run(t, "./issue24351.exe")
+}
+
+func TestIssue25756(t *testing.T) {
+ goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin")
+ goCmd(t, "build", "-o", "issue25756.exe", "./issue25756/main.go")
+ // Fails intermittently, but 20 runs should cause the failure
+ for n := 20; n > 0; n-- {
+ t.Run(fmt.Sprint(n), func(t *testing.T) {
+ t.Parallel()
+ run(t, "./issue25756.exe")
+ })
+ }
+}
diff --git a/libgo/misc/cgo/testplugin/test.bash b/libgo/misc/cgo/testplugin/test.bash
deleted file mode 100644
index 1b94bc4..0000000
--- a/libgo/misc/cgo/testplugin/test.bash
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2016 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.
-
-set -e
-
-if [ ! -f src/host/host.go ]; then
- cwd=$(pwd)
- echo "misc/cgo/testplugin/test.bash is running in $cwd" 1>&2
- exit 1
-fi
-
-goos=$(go env GOOS)
-goarch=$(go env GOARCH)
-
-function cleanup() {
- rm -f plugin*.so unnamed*.so iface*.so life.so issue*
- rm -rf host pkg sub iface
-}
-trap cleanup EXIT
-
-rm -rf pkg sub
-mkdir sub
-
-GOPATH=$(pwd) go build -i -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin1
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin2
-cp plugin2.so plugin2-dup.so
-GOPATH=$(pwd)/altpath go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin-mismatch
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=sub/plugin1.so sub/plugin1
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed1.so unnamed1/main.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed2.so unnamed2/main.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" host
-
-# test that DWARF sections are emitted for plugins and programs importing "plugin"
-if [ $GOOS != "darwin" ]; then
- # On macOS, for some reason, the linker doesn't add debug sections to .so,
- # see issue #27502.
- go run src/checkdwarf/main.go plugin2.so plugin2.UnexportedNameReuse
-fi
-go run src/checkdwarf/main.go host main.main
-
-LD_LIBRARY_PATH=$(pwd) ./host
-
-# Test that types and itabs get properly uniqified.
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_a
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_b
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" iface
-LD_LIBRARY_PATH=$(pwd) ./iface
-
-function _timeout() (
- set -e
- $2 &
- p=$!
- (sleep $1; kill $p 2>/dev/null) &
- p2=$!
- wait $p 2>/dev/null
- kill -0 $p2 2>/dev/null
-)
-
-# Test for issue 18676 - make sure we don't add the same itab twice.
-# The buggy code hangs forever, so use a timeout to check for that.
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18676/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18676 src/issue18676/main.go
-_timeout 10s ./issue18676
-
-# Test for issue 19534 - that we can load a plugin built in a path with non-alpha
-# characters
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -ldflags='-pluginpath=issue.19534' -o plugin.so src/issue19534/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19534 src/issue19534/main.go
-./issue19534
-
-# Test for issue 18584
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18584/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18584 src/issue18584/main.go
-./issue18584
-
-# Test for issue 19418
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin "-ldflags=-X main.Val=linkstr" -o plugin.so src/issue19418/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19418 src/issue19418/main.go
-./issue19418
-
-# Test for issue 19529
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue19529/plugin.go
-
-# Test for issue 22175
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin1.so src/issue22175/plugin1.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin2.so src/issue22175/plugin2.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22175 src/issue22175/main.go
-./issue22175
-
-# Test for issue 22295
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue.22295.so issue22295.pkg
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22295 src/issue22295.pkg/main.go
-./issue22295
-
-# Test for issue 24351
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue24351.so src/issue24351/plugin.go
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue24351 src/issue24351/main.go
-./issue24351
-
-# Test for issue 25756
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o life.so issue25756/plugin
-GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue25756 src/issue25756/main.go
-# Fails intermittently, but 20 runs should cause the failure
-for i in `seq 1 20`;
-do
- ./issue25756 > /dev/null
-done
diff --git a/libgo/misc/cgo/testplugin/src/checkdwarf/main.go b/libgo/misc/cgo/testplugin/testdata/checkdwarf/main.go
index 7886c83..7886c83 100644
--- a/libgo/misc/cgo/testplugin/src/checkdwarf/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/checkdwarf/main.go
diff --git a/libgo/misc/cgo/testplugin/src/common/common.go b/libgo/misc/cgo/testplugin/testdata/common/common.go
index b064e6b..b064e6b 100644
--- a/libgo/misc/cgo/testplugin/src/common/common.go
+++ b/libgo/misc/cgo/testplugin/testdata/common/common.go
diff --git a/libgo/misc/cgo/testplugin/src/host/host.go b/libgo/misc/cgo/testplugin/testdata/host/host.go
index 0ca17da..a379932 100644
--- a/libgo/misc/cgo/testplugin/src/host/host.go
+++ b/libgo/misc/cgo/testplugin/testdata/host/host.go
@@ -11,7 +11,7 @@ import (
"plugin"
"strings"
- "common"
+ "testplugin/common"
)
func init() {
diff --git a/libgo/misc/cgo/testplugin/src/iface/main.go b/libgo/misc/cgo/testplugin/testdata/iface/main.go
index 5e7e4d8..c04f288 100644
--- a/libgo/misc/cgo/testplugin/src/iface/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/iface/main.go
@@ -5,9 +5,10 @@
package main
import (
- "iface_i"
"log"
"plugin"
+
+ "testplugin/iface_i"
)
func main() {
diff --git a/libgo/misc/cgo/testplugin/src/iface_a/a.go b/libgo/misc/cgo/testplugin/testdata/iface_a/a.go
index 29d2e27..357f7e8 100644
--- a/libgo/misc/cgo/testplugin/src/iface_a/a.go
+++ b/libgo/misc/cgo/testplugin/testdata/iface_a/a.go
@@ -4,7 +4,7 @@
package main
-import "iface_i"
+import "testplugin/iface_i"
//go:noinline
func F() interface{} {
diff --git a/libgo/misc/cgo/testplugin/src/iface_b/b.go b/libgo/misc/cgo/testplugin/testdata/iface_b/b.go
index 29d2e27..357f7e8 100644
--- a/libgo/misc/cgo/testplugin/src/iface_b/b.go
+++ b/libgo/misc/cgo/testplugin/testdata/iface_b/b.go
@@ -4,7 +4,7 @@
package main
-import "iface_i"
+import "testplugin/iface_i"
//go:noinline
func F() interface{} {
diff --git a/libgo/misc/cgo/testplugin/src/iface_i/i.go b/libgo/misc/cgo/testplugin/testdata/iface_i/i.go
index 31c8038..31c8038 100644
--- a/libgo/misc/cgo/testplugin/src/iface_i/i.go
+++ b/libgo/misc/cgo/testplugin/testdata/iface_i/i.go
diff --git a/libgo/misc/cgo/testplugin/src/issue18584/main.go b/libgo/misc/cgo/testplugin/testdata/issue18584/main.go
index c280fd4..c280fd4 100644
--- a/libgo/misc/cgo/testplugin/src/issue18584/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue18584/main.go
diff --git a/libgo/misc/cgo/testplugin/src/issue18584/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue18584/plugin.go
index be0868d..be0868d 100644
--- a/libgo/misc/cgo/testplugin/src/issue18584/plugin.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue18584/plugin.go
diff --git a/libgo/misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go b/libgo/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go
index 70fd054..70fd054 100644
--- a/libgo/misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go
diff --git a/libgo/misc/cgo/testplugin/src/issue18676/main.go b/libgo/misc/cgo/testplugin/testdata/issue18676/main.go
index c75409d..b1dadbe 100644
--- a/libgo/misc/cgo/testplugin/src/issue18676/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue18676/main.go
@@ -17,8 +17,8 @@ package main
import (
"encoding/json"
- "issue18676/dynamodbstreamsevt"
"plugin"
+ "testplugin/issue18676/dynamodbstreamsevt"
)
func main() {
diff --git a/libgo/misc/cgo/testplugin/src/issue18676/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue18676/plugin.go
index 8a3b85a..e7fc74f 100644
--- a/libgo/misc/cgo/testplugin/src/issue18676/plugin.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue18676/plugin.go
@@ -6,6 +6,6 @@ package main
import "C"
-import "issue18676/dynamodbstreamsevt"
+import "testplugin/issue18676/dynamodbstreamsevt"
func F(evt *dynamodbstreamsevt.Event) {}
diff --git a/libgo/misc/cgo/testplugin/src/issue19418/main.go b/libgo/misc/cgo/testplugin/testdata/issue19418/main.go
index 2ec9f9a..2ec9f9a 100644
--- a/libgo/misc/cgo/testplugin/src/issue19418/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue19418/main.go
diff --git a/libgo/misc/cgo/testplugin/src/issue19418/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue19418/plugin.go
index fe93b16..fe93b16 100644
--- a/libgo/misc/cgo/testplugin/src/issue19418/plugin.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue19418/plugin.go
diff --git a/libgo/misc/cgo/testplugin/src/issue19529/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue19529/plugin.go
index ad2df6c..ad2df6c 100644
--- a/libgo/misc/cgo/testplugin/src/issue19529/plugin.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue19529/plugin.go
diff --git a/libgo/misc/cgo/testplugin/src/issue19534/main.go b/libgo/misc/cgo/testplugin/testdata/issue19534/main.go
index de263b6..de263b6 100644
--- a/libgo/misc/cgo/testplugin/src/issue19534/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue19534/main.go
diff --git a/libgo/misc/cgo/testplugin/src/issue19534/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue19534/plugin.go
index 582d333..582d333 100644
--- a/libgo/misc/cgo/testplugin/src/issue19534/plugin.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue19534/plugin.go
diff --git a/libgo/misc/cgo/testplugin/src/issue22175/main.go b/libgo/misc/cgo/testplugin/testdata/issue22175/main.go
index 9be9bab..9be9bab 100644
--- a/libgo/misc/cgo/testplugin/src/issue22175/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue22175/main.go
diff --git a/libgo/misc/cgo/testplugin/src/issue22175/plugin1.go b/libgo/misc/cgo/testplugin/testdata/issue22175/plugin1.go
index 5ae6cb6..5ae6cb6 100644
--- a/libgo/misc/cgo/testplugin/src/issue22175/plugin1.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue22175/plugin1.go
diff --git a/libgo/misc/cgo/testplugin/src/issue22175/plugin2.go b/libgo/misc/cgo/testplugin/testdata/issue22175/plugin2.go
index f387a19..f387a19 100644
--- a/libgo/misc/cgo/testplugin/src/issue22175/plugin2.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue22175/plugin2.go
diff --git a/libgo/misc/cgo/testplugin/src/issue22295.pkg/main.go b/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/main.go
index 6cb186e..6cb186e 100644
--- a/libgo/misc/cgo/testplugin/src/issue22295.pkg/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/main.go
diff --git a/libgo/misc/cgo/testplugin/src/issue22295.pkg/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go
index 46b08a4..46b08a4 100644
--- a/libgo/misc/cgo/testplugin/src/issue22295.pkg/plugin.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go
diff --git a/libgo/misc/cgo/testplugin/src/issue24351/main.go b/libgo/misc/cgo/testplugin/testdata/issue24351/main.go
index 4107adf..4107adf 100644
--- a/libgo/misc/cgo/testplugin/src/issue24351/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue24351/main.go
diff --git a/libgo/misc/cgo/testplugin/src/issue24351/plugin.go b/libgo/misc/cgo/testplugin/testdata/issue24351/plugin.go
index db17e0a..db17e0a 100644
--- a/libgo/misc/cgo/testplugin/src/issue24351/plugin.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue24351/plugin.go
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/main.go b/libgo/misc/cgo/testplugin/testdata/issue25756/main.go
index 817daf4..817daf4 100644
--- a/libgo/misc/cgo/testplugin/src/issue25756/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue25756/main.go
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/plugin/c-life.c b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c
index f853163..f853163 100644
--- a/libgo/misc/cgo/testplugin/src/issue25756/plugin/c-life.c
+++ b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.go b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.go
index 675a192..675a192 100644
--- a/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.go
+++ b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.go
diff --git a/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.h b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.h
index 11d2b97..11d2b97 100644
--- a/libgo/misc/cgo/testplugin/src/issue25756/plugin/life.h
+++ b/libgo/misc/cgo/testplugin/testdata/issue25756/plugin/life.h
diff --git a/libgo/misc/cgo/testplugin/src/plugin1/plugin1.go b/libgo/misc/cgo/testplugin/testdata/plugin1/plugin1.go
index 0a9fa2f..d29d674 100644
--- a/libgo/misc/cgo/testplugin/src/plugin1/plugin1.go
+++ b/libgo/misc/cgo/testplugin/testdata/plugin1/plugin1.go
@@ -8,8 +8,9 @@ package main
import "C"
import (
- "common"
"reflect"
+
+ "testplugin/common"
)
func F() int {
diff --git a/libgo/misc/cgo/testplugin/src/plugin2/plugin2.go b/libgo/misc/cgo/testplugin/testdata/plugin2/plugin2.go
index a67f2de..31ed642 100644
--- a/libgo/misc/cgo/testplugin/src/plugin2/plugin2.go
+++ b/libgo/misc/cgo/testplugin/testdata/plugin2/plugin2.go
@@ -12,9 +12,10 @@ import "C"
// void cfunc() {} // uses cgo_topofstack
import (
- "common"
"reflect"
"strings"
+
+ "testplugin/common"
)
func init() {
diff --git a/libgo/misc/cgo/testplugin/src/sub/plugin1/plugin1.go b/libgo/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go
index cf9000c..5f891b0 100644
--- a/libgo/misc/cgo/testplugin/src/sub/plugin1/plugin1.go
+++ b/libgo/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go
@@ -7,7 +7,7 @@ package main
// // No C code required.
import "C"
-import "common"
+import "testplugin/common"
func F() int { return 17 }
diff --git a/libgo/misc/cgo/testplugin/unnamed1/main.go b/libgo/misc/cgo/testplugin/testdata/unnamed1/main.go
index caf09c9..dd1777b 100644
--- a/libgo/misc/cgo/testplugin/unnamed1/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/unnamed1/main.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build ignore
+
package main
// // No C code required.
diff --git a/libgo/misc/cgo/testplugin/unnamed2/main.go b/libgo/misc/cgo/testplugin/testdata/unnamed2/main.go
index 7ef6610..757436f 100644
--- a/libgo/misc/cgo/testplugin/unnamed2/main.go
+++ b/libgo/misc/cgo/testplugin/testdata/unnamed2/main.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build ignore
+
package main
// // No C code required.
diff --git a/libgo/misc/cgo/testsanitizers/cc_test.go b/libgo/misc/cgo/testsanitizers/cc_test.go
index 218e225..0192a66 100644
--- a/libgo/misc/cgo/testsanitizers/cc_test.go
+++ b/libgo/misc/cgo/testsanitizers/cc_test.go
@@ -394,7 +394,7 @@ func (c *config) checkRuntime() (skip bool, err error) {
// srcPath returns the path to the given file relative to this test's source tree.
func srcPath(path string) string {
- return filepath.Join("src", path)
+ return filepath.Join("testdata", path)
}
// A tempDir manages a temporary directory within a test.
diff --git a/libgo/misc/cgo/testsanitizers/src/msan.go b/libgo/misc/cgo/testsanitizers/testdata/msan.go
index 7915fa8..7915fa8 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan2.go b/libgo/misc/cgo/testsanitizers/testdata/msan2.go
index 6690cb0..6690cb0 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan2.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan2.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan2_cmsan.go b/libgo/misc/cgo/testsanitizers/testdata/msan2_cmsan.go
index 8fdaea9..8fdaea9 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan2_cmsan.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan2_cmsan.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan3.go b/libgo/misc/cgo/testsanitizers/testdata/msan3.go
index 61a9c29..61a9c29 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan3.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan3.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan4.go b/libgo/misc/cgo/testsanitizers/testdata/msan4.go
index 6c91ff5..6c91ff5 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan4.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan4.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan5.go b/libgo/misc/cgo/testsanitizers/testdata/msan5.go
index f1479eb..f1479eb 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan5.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan5.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan6.go b/libgo/misc/cgo/testsanitizers/testdata/msan6.go
index 003989c..003989c 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan6.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan6.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan_fail.go b/libgo/misc/cgo/testsanitizers/testdata/msan_fail.go
index 4c8dab3..4c8dab3 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan_fail.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan_fail.go
diff --git a/libgo/misc/cgo/testsanitizers/src/msan_shared.go b/libgo/misc/cgo/testsanitizers/testdata/msan_shared.go
index 966947c..966947c 100644
--- a/libgo/misc/cgo/testsanitizers/src/msan_shared.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/msan_shared.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan.go b/libgo/misc/cgo/testsanitizers/testdata/tsan.go
index 6c377a7..6c377a7 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan10.go b/libgo/misc/cgo/testsanitizers/testdata/tsan10.go
index a40f245..a40f245 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan10.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan10.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan11.go b/libgo/misc/cgo/testsanitizers/testdata/tsan11.go
index 70ac9c8..70ac9c8 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan11.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan11.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan12.go b/libgo/misc/cgo/testsanitizers/testdata/tsan12.go
index 3e767ee..3e767ee 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan12.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan12.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan2.go b/libgo/misc/cgo/testsanitizers/testdata/tsan2.go
index 5018a19..5018a19 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan2.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan2.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan3.go b/libgo/misc/cgo/testsanitizers/testdata/tsan3.go
index 87f6c80..87f6c80 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan3.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan3.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan4.go b/libgo/misc/cgo/testsanitizers/testdata/tsan4.go
index f0c76d8..f0c76d8 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan4.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan4.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan5.go b/libgo/misc/cgo/testsanitizers/testdata/tsan5.go
index 1214a77..1214a77 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan5.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan5.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan6.go b/libgo/misc/cgo/testsanitizers/testdata/tsan6.go
index c96f08d..c96f08d 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan6.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan6.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan7.go b/libgo/misc/cgo/testsanitizers/testdata/tsan7.go
index 2fb9e45..2fb9e45 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan7.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan7.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan8.go b/libgo/misc/cgo/testsanitizers/testdata/tsan8.go
index 88d82a6..88d82a6 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan8.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan8.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan9.go b/libgo/misc/cgo/testsanitizers/testdata/tsan9.go
index f166d8b..f166d8b 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan9.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan9.go
diff --git a/libgo/misc/cgo/testsanitizers/src/tsan_shared.go b/libgo/misc/cgo/testsanitizers/testdata/tsan_shared.go
index 55ff67e..55ff67e 100644
--- a/libgo/misc/cgo/testsanitizers/src/tsan_shared.go
+++ b/libgo/misc/cgo/testsanitizers/testdata/tsan_shared.go
diff --git a/libgo/misc/cgo/testsanitizers/tsan_test.go b/libgo/misc/cgo/testsanitizers/tsan_test.go
index 1d769a9..ec4e003 100644
--- a/libgo/misc/cgo/testsanitizers/tsan_test.go
+++ b/libgo/misc/cgo/testsanitizers/tsan_test.go
@@ -5,15 +5,11 @@
package sanitizers_test
import (
- "runtime"
"strings"
"testing"
)
func TestTSAN(t *testing.T) {
- if runtime.GOARCH == "arm64" {
- t.Skip("skipping test; see https://golang.org/issue/25682")
- }
t.Parallel()
requireOvercommit(t)
config := configure("thread")
diff --git a/libgo/misc/cgo/testshared/overlaydir_test.go b/libgo/misc/cgo/testshared/overlaydir_test.go
new file mode 100644
index 0000000..68be056
--- /dev/null
+++ b/libgo/misc/cgo/testshared/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package shared_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/testshared/shared_test.go b/libgo/misc/cgo/testshared/shared_test.go
index 41a24ef..ac1a1c7 100644
--- a/libgo/misc/cgo/testshared/shared_test.go
+++ b/libgo/misc/cgo/testshared/shared_test.go
@@ -44,31 +44,35 @@ func run(t *testing.T, msg string, args ...string) {
// goCmd invokes the go tool with the installsuffix set up by TestMain. It calls
// t.Fatalf if the command fails.
-func goCmd(t *testing.T, args ...string) {
+func goCmd(t *testing.T, args ...string) string {
newargs := []string{args[0], "-installsuffix=" + suffix}
if testing.Verbose() {
newargs = append(newargs, "-x")
}
newargs = append(newargs, args[1:]...)
c := exec.Command("go", newargs...)
+
+ stderr := new(strings.Builder)
var output []byte
var err error
if testing.Verbose() {
- fmt.Printf("+ go %s\n", strings.Join(newargs, " "))
- c.Stdout = os.Stdout
+ fmt.Printf("+ go %s\n", strings.Join(args, " "))
c.Stderr = os.Stderr
- err = c.Run()
- output = []byte("(output above)")
+ stderr.WriteString("(output above)")
} else {
- output, err = c.CombinedOutput()
+ c.Stderr = stderr
}
+ output, err = c.Output()
+
if err != nil {
if t != nil {
- t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, output)
+ t.Helper()
+ t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
} else {
- log.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, output)
+ log.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr)
}
}
+ return string(bytes.TrimSpace(output))
}
// TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit).
@@ -105,47 +109,33 @@ func testMain(m *testing.M) (int, error) {
// Some tests need to edit the source in GOPATH, so copy this directory to a
// temporary directory and chdir to that.
- scratchDir, err := ioutil.TempDir("", "testshared")
+ gopath, err := ioutil.TempDir("", "testshared")
if err != nil {
return 0, fmt.Errorf("TempDir failed: %v", err)
}
if testing.Verbose() {
- fmt.Printf("+ mkdir -p %s\n", scratchDir)
- }
- defer os.RemoveAll(scratchDir)
- err = filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
- scratchPath := filepath.Join(scratchDir, path)
- if info.IsDir() {
- if path == "." {
- return nil
- }
- if testing.Verbose() {
- fmt.Printf("+ mkdir -p %s\n", scratchPath)
- }
- return os.Mkdir(scratchPath, info.Mode())
- } else {
- fromBytes, err := ioutil.ReadFile(path)
- if err != nil {
- return err
- }
- if testing.Verbose() {
- fmt.Printf("+ cp %s %s\n", path, scratchPath)
- }
- return ioutil.WriteFile(scratchPath, fromBytes, info.Mode())
- }
- })
- if err != nil {
- return 0, fmt.Errorf("walk failed: %v", err)
+ fmt.Printf("+ mkdir -p %s\n", gopath)
+ }
+ defer os.RemoveAll(gopath)
+
+ modRoot := filepath.Join(gopath, "src", "testshared")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ return 0, err
}
- os.Setenv("GOPATH", scratchDir)
if testing.Verbose() {
- fmt.Printf("+ export GOPATH=%s\n", scratchDir)
+ fmt.Printf("+ cd %s\n", modRoot)
+ }
+ os.Chdir(modRoot)
+ os.Setenv("PWD", modRoot)
+ if err := ioutil.WriteFile("go.mod", []byte("module testshared\n"), 0666); err != nil {
+ return 0, err
}
- myContext.GOPATH = scratchDir
+
+ os.Setenv("GOPATH", gopath)
if testing.Verbose() {
- fmt.Printf("+ cd %s\n", scratchDir)
+ fmt.Printf("+ export GOPATH=%s\n", gopath)
}
- os.Chdir(scratchDir)
+ myContext.GOPATH = gopath
// All tests depend on runtime being built into a shared library. Because
// that takes a few seconds, do it here and have all tests use the version
@@ -154,15 +144,20 @@ func testMain(m *testing.M) (int, error) {
goCmd(nil, append([]string{"install", "-buildmode=shared"}, minpkgs...)...)
myContext.InstallSuffix = suffix + "_dynlink"
- depP, err := myContext.Import("depBase", ".", build.ImportComment)
+ depP, err := myContext.Import("./depBase", ".", build.ImportComment)
if err != nil {
return 0, fmt.Errorf("import failed: %v", err)
}
- gopathInstallDir = depP.PkgTargetRoot
+ if depP.PkgTargetRoot == "" {
+ gopathInstallDir = filepath.Dir(goCmd(nil, "list", "-buildmode=shared", "-f", "{{.Target}}", "./depBase"))
+ } else {
+ gopathInstallDir = filepath.Join(depP.PkgTargetRoot, "testshared")
+ }
return m.Run(), nil
}
func TestMain(m *testing.M) {
+ log.SetFlags(log.Lshortfile)
flag.Parse()
// Some of the tests install binaries into a custom GOPATH.
@@ -350,6 +345,7 @@ func readNotes(f *elf.File) ([]*note, error) {
}
func dynStrings(t *testing.T, path string, flag elf.DynTag) []string {
+ t.Helper()
f, err := elf.Open(path)
if err != nil {
t.Fatalf("elf.Open(%q) failed: %v", path, err)
@@ -363,6 +359,7 @@ func dynStrings(t *testing.T, path string, flag elf.DynTag) []string {
}
func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) {
+ t.Helper()
for _, dynstring := range dynStrings(t, path, elf.DT_NEEDED) {
if re.MatchString(dynstring) {
return
@@ -372,10 +369,12 @@ func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) {
}
func AssertIsLinkedTo(t *testing.T, path, lib string) {
+ t.Helper()
AssertIsLinkedToRegexp(t, path, regexp.MustCompile(regexp.QuoteMeta(lib)))
}
func AssertHasRPath(t *testing.T, path, dir string) {
+ t.Helper()
for _, tag := range []elf.DynTag{elf.DT_RPATH, elf.DT_RUNPATH} {
for _, dynstring := range dynStrings(t, path, tag) {
for _, rpath := range strings.Split(dynstring, ":") {
@@ -390,15 +389,15 @@ func AssertHasRPath(t *testing.T, path, dir string) {
// Build a trivial program that links against the shared runtime and check it runs.
func TestTrivialExecutable(t *testing.T) {
- goCmd(t, "install", "-linkshared", "trivial")
- run(t, "trivial executable", "./bin/trivial")
- AssertIsLinkedTo(t, "./bin/trivial", soname)
- AssertHasRPath(t, "./bin/trivial", gorootInstallDir)
+ goCmd(t, "install", "-linkshared", "./trivial")
+ run(t, "trivial executable", "../../bin/trivial")
+ AssertIsLinkedTo(t, "../../bin/trivial", soname)
+ AssertHasRPath(t, "../../bin/trivial", gorootInstallDir)
}
// Build a trivial program in PIE mode that links against the shared runtime and check it runs.
func TestTrivialExecutablePIE(t *testing.T) {
- goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "trivial")
+ goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "./trivial")
run(t, "trivial executable", "./trivial.pie")
AssertIsLinkedTo(t, "./trivial.pie", soname)
AssertHasRPath(t, "./trivial.pie", gorootInstallDir)
@@ -406,15 +405,15 @@ func TestTrivialExecutablePIE(t *testing.T) {
// Build a division test program and check it runs.
func TestDivisionExecutable(t *testing.T) {
- goCmd(t, "install", "-linkshared", "division")
- run(t, "division executable", "./bin/division")
+ goCmd(t, "install", "-linkshared", "./division")
+ run(t, "division executable", "../../bin/division")
}
// Build an executable that uses cgo linked against the shared runtime and check it
// runs.
func TestCgoExecutable(t *testing.T) {
- goCmd(t, "install", "-linkshared", "execgo")
- run(t, "cgo executable", "./bin/execgo")
+ goCmd(t, "install", "-linkshared", "./execgo")
+ run(t, "cgo executable", "../../bin/execgo")
}
func checkPIE(t *testing.T, name string) {
@@ -433,7 +432,7 @@ func checkPIE(t *testing.T, name string) {
func TestTrivialPIE(t *testing.T) {
name := "trivial_pie"
- goCmd(t, "build", "-buildmode=pie", "-o="+name, "trivial")
+ goCmd(t, "build", "-buildmode=pie", "-o="+name, "./trivial")
defer os.Remove(name)
run(t, name, "./"+name)
checkPIE(t, name)
@@ -441,7 +440,7 @@ func TestTrivialPIE(t *testing.T) {
func TestCgoPIE(t *testing.T) {
name := "cgo_pie"
- goCmd(t, "build", "-buildmode=pie", "-o="+name, "execgo")
+ goCmd(t, "build", "-buildmode=pie", "-o="+name, "./execgo")
defer os.Remove(name)
run(t, name, "./"+name)
checkPIE(t, name)
@@ -450,15 +449,16 @@ func TestCgoPIE(t *testing.T) {
// Build a GOPATH package into a shared library that links against the goroot runtime
// and an executable that links against both.
func TestGopathShlib(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- AssertIsLinkedTo(t, filepath.Join(gopathInstallDir, "libdepBase.so"), soname)
- goCmd(t, "install", "-linkshared", "exe")
- AssertIsLinkedTo(t, "./bin/exe", soname)
- AssertIsLinkedTo(t, "./bin/exe", "libdepBase.so")
- AssertHasRPath(t, "./bin/exe", gorootInstallDir)
- AssertHasRPath(t, "./bin/exe", gopathInstallDir)
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
+ AssertIsLinkedTo(t, shlib, soname)
+ goCmd(t, "install", "-linkshared", "./exe")
+ AssertIsLinkedTo(t, "../../bin/exe", soname)
+ AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
+ AssertHasRPath(t, "../../bin/exe", gorootInstallDir)
+ AssertHasRPath(t, "../../bin/exe", filepath.Dir(gopathInstallDir))
// And check it runs.
- run(t, "executable linked to GOPATH library", "./bin/exe")
+ run(t, "executable linked to GOPATH library", "../../bin/exe")
}
// The shared library contains a note listing the packages it contains in a section
@@ -470,8 +470,8 @@ func testPkgListNote(t *testing.T, f *elf.File, note *note) {
if isOffsetLoaded(f, note.section.Offset) {
t.Errorf("package list section contained in PT_LOAD segment")
}
- if note.desc != "depBase\n" {
- t.Errorf("incorrect package list %q, want %q", note.desc, "depBase\n")
+ if note.desc != "testshared/depBase\n" {
+ t.Errorf("incorrect package list %q, want %q", note.desc, "testshared/depBase\n")
}
}
@@ -528,8 +528,9 @@ func testDepsNote(t *testing.T, f *elf.File, note *note) {
// The shared library contains notes with defined contents; see above.
func TestNotes(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- f, err := elf.Open(filepath.Join(gopathInstallDir, "libdepBase.so"))
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase")
+ f, err := elf.Open(shlib)
if err != nil {
t.Fatal(err)
}
@@ -581,23 +582,24 @@ func TestNotes(t *testing.T) {
// runtime, another package (dep2) that links against the first, and an
// executable that links against dep2.
func TestTwoGopathShlibs(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep2")
- goCmd(t, "install", "-linkshared", "exe2")
- run(t, "executable linked to GOPATH library", "./bin/exe2")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
+ goCmd(t, "install", "-linkshared", "./exe2")
+ run(t, "executable linked to GOPATH library", "../../bin/exe2")
}
func TestThreeGopathShlibs(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep2")
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep3")
- goCmd(t, "install", "-linkshared", "exe3")
- run(t, "executable linked to GOPATH library", "./bin/exe3")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep3")
+ goCmd(t, "install", "-linkshared", "./exe3")
+ run(t, "executable linked to GOPATH library", "../../bin/exe3")
}
-// If gccgo is not available or not new enough call t.Skip. Otherwise,
-// return a build.Context that is set up for gccgo.
-func prepGccgo(t *testing.T) build.Context {
+// If gccgo is not available or not new enough, call t.Skip.
+func requireGccgo(t *testing.T) {
+ t.Helper()
+
gccgoName := os.Getenv("GCCGO")
if gccgoName == "" {
gccgoName = "gccgo"
@@ -614,61 +616,64 @@ func prepGccgo(t *testing.T) build.Context {
if string(output) < "5" {
t.Skipf("gccgo too old (%s)", strings.TrimSpace(string(output)))
}
- gccgoContext := build.Default
- gccgoContext.InstallSuffix = suffix + "_fPIC"
- gccgoContext.Compiler = "gccgo"
- gccgoContext.GOPATH = os.Getenv("GOPATH")
- return gccgoContext
+
+ gomod, err := exec.Command("go", "env", "GOMOD").Output()
+ if err != nil {
+ t.Fatalf("go env GOMOD: %v", err)
+ }
+ if len(bytes.TrimSpace(gomod)) > 0 {
+ t.Skipf("gccgo not supported in module mode; see golang.org/issue/30344")
+ }
}
// Build a GOPATH package into a shared library with gccgo and an executable that
// links against it.
func TestGoPathShlibGccgo(t *testing.T) {
- gccgoContext := prepGccgo(t)
+ requireGccgo(t)
libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
- depP, err := gccgoContext.Import("depBase", ".", build.ImportComment)
- if err != nil {
- t.Fatalf("import failed: %v", err)
- }
- gccgoInstallDir := filepath.Join(depP.PkgTargetRoot, "shlibs")
- goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "depBase")
- AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdepBase.so"), libgoRE)
- goCmd(t, "install", "-compiler=gccgo", "-linkshared", "exe")
- AssertIsLinkedToRegexp(t, "./bin/exe", libgoRE)
- AssertIsLinkedTo(t, "./bin/exe", "libdepBase.so")
- AssertHasRPath(t, "./bin/exe", gccgoInstallDir)
+ goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
+
+ // Run 'go list' after 'go install': with gccgo, we apparently don't know the
+ // shlib location until after we've installed it.
+ shlib := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
+
+ AssertIsLinkedToRegexp(t, shlib, libgoRE)
+ goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe")
+ AssertIsLinkedToRegexp(t, "../../bin/exe", libgoRE)
+ AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib))
+ AssertHasRPath(t, "../../bin/exe", filepath.Dir(shlib))
// And check it runs.
- run(t, "gccgo-built", "./bin/exe")
+ run(t, "gccgo-built", "../../bin/exe")
}
// The gccgo version of TestTwoGopathShlibs: build a GOPATH package into a shared
// library with gccgo, another GOPATH package that depends on the first and an
// executable that links the second library.
func TestTwoGopathShlibsGccgo(t *testing.T) {
- gccgoContext := prepGccgo(t)
+ requireGccgo(t)
libgoRE := regexp.MustCompile("libgo.so.[0-9]+")
- depP, err := gccgoContext.Import("depBase", ".", build.ImportComment)
- if err != nil {
- t.Fatalf("import failed: %v", err)
- }
- gccgoInstallDir := filepath.Join(depP.PkgTargetRoot, "shlibs")
- goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "depBase")
- goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "dep2")
- goCmd(t, "install", "-compiler=gccgo", "-linkshared", "exe2")
+ goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase")
+ goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./dep2")
+ goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe2")
+
+ // Run 'go list' after 'go install': with gccgo, we apparently don't know the
+ // shlib location until after we've installed it.
+ dep2 := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./dep2")
+ depBase := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase")
- AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdepBase.so"), libgoRE)
- AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdep2.so"), libgoRE)
- AssertIsLinkedTo(t, filepath.Join(gccgoInstallDir, "libdep2.so"), "libdepBase.so")
- AssertIsLinkedToRegexp(t, "./bin/exe2", libgoRE)
- AssertIsLinkedTo(t, "./bin/exe2", "libdep2")
- AssertIsLinkedTo(t, "./bin/exe2", "libdepBase.so")
+ AssertIsLinkedToRegexp(t, depBase, libgoRE)
+ AssertIsLinkedToRegexp(t, dep2, libgoRE)
+ AssertIsLinkedTo(t, dep2, filepath.Base(depBase))
+ AssertIsLinkedToRegexp(t, "../../bin/exe2", libgoRE)
+ AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(dep2))
+ AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(depBase))
// And check it runs.
- run(t, "gccgo-built", "./bin/exe2")
+ run(t, "gccgo-built", "../../bin/exe2")
}
// Testing rebuilding of shared libraries when they are stale is a bit more
@@ -694,9 +699,9 @@ func resetFileStamps() {
}
}
- reset("bin")
- reset("pkg")
- reset("src")
+ reset("../../bin")
+ reset("../../pkg")
+ reset("../../src")
reset(gorootInstallDir)
}
@@ -746,6 +751,7 @@ func touch(t *testing.T, path string) (cleanup func()) {
// isNew returns if the path is newer than the time stamp used by touch.
func isNew(t *testing.T, path string) bool {
+ t.Helper()
fi, err := os.Stat(path)
if err != nil {
t.Fatal(err)
@@ -771,40 +777,47 @@ func AssertNotRebuilt(t *testing.T, msg, path string) {
}
func TestRebuilding(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- goCmd(t, "install", "-linkshared", "exe")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ goCmd(t, "install", "-linkshared", "./exe")
+ info := strings.Fields(goCmd(t, "list", "-buildmode=shared", "-linkshared", "-f", "{{.Target}} {{.Shlib}}", "./depBase"))
+ if len(info) != 2 {
+ t.Fatalf("go list failed to report Target and/or Shlib")
+ }
+ target := info[0]
+ shlib := info[1]
// If the source is newer than both the .a file and the .so, both are rebuilt.
t.Run("newsource", func(t *testing.T) {
resetFileStamps()
- cleanup := touch(t, "src/depBase/dep.go")
+ cleanup := touch(t, "./depBase/dep.go")
defer func() {
cleanup()
- goCmd(t, "install", "-linkshared", "exe")
+ goCmd(t, "install", "-linkshared", "./exe")
}()
- goCmd(t, "install", "-linkshared", "exe")
- AssertRebuilt(t, "new source", filepath.Join(gopathInstallDir, "depBase.a"))
- AssertRebuilt(t, "new source", filepath.Join(gopathInstallDir, "libdepBase.so"))
+ goCmd(t, "install", "-linkshared", "./exe")
+ AssertRebuilt(t, "new source", target)
+ AssertRebuilt(t, "new source", shlib)
})
// If the .a file is newer than the .so, the .so is rebuilt (but not the .a)
t.Run("newarchive", func(t *testing.T) {
resetFileStamps()
- AssertNotRebuilt(t, "new .a file before build", filepath.Join(gopathInstallDir, "depBase.a"))
- goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "depBase")
- AssertNotRebuilt(t, "new .a file before build", filepath.Join(gopathInstallDir, "depBase.a"))
- cleanup := touch(t, filepath.Join(gopathInstallDir, "depBase.a"))
+ AssertNotRebuilt(t, "new .a file before build", target)
+ goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "./depBase")
+ AssertNotRebuilt(t, "new .a file before build", target)
+ cleanup := touch(t, target)
defer func() {
cleanup()
- goCmd(t, "install", "-v", "-linkshared", "exe")
+ goCmd(t, "install", "-v", "-linkshared", "./exe")
}()
- goCmd(t, "install", "-v", "-linkshared", "exe")
- AssertNotRebuilt(t, "new .a file", filepath.Join(gopathInstallDir, "depBase.a"))
- AssertRebuilt(t, "new .a file", filepath.Join(gopathInstallDir, "libdepBase.so"))
+ goCmd(t, "install", "-v", "-linkshared", "./exe")
+ AssertNotRebuilt(t, "new .a file", target)
+ AssertRebuilt(t, "new .a file", shlib)
})
}
func appendFile(t *testing.T, path, content string) {
+ t.Helper()
f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND, 0660)
if err != nil {
t.Fatalf("os.OpenFile failed: %v", err)
@@ -821,16 +834,24 @@ func appendFile(t *testing.T, path, content string) {
}
}
-func writeFile(t *testing.T, path, content string) {
- err := ioutil.WriteFile(path, []byte(content), 0644)
+func createFile(t *testing.T, path, content string) {
+ t.Helper()
+ f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644)
if err != nil {
- t.Fatalf("ioutil.WriteFile failed: %v", err)
+ t.Fatalf("os.OpenFile failed: %v", err)
+ }
+ _, err = f.WriteString(content)
+ if closeErr := f.Close(); err == nil {
+ err = closeErr
+ }
+ if err != nil {
+ t.Fatalf("WriteString failed: %v", err)
}
}
func TestABIChecking(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- goCmd(t, "install", "-linkshared", "exe")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ goCmd(t, "install", "-linkshared", "./exe")
// If we make an ABI-breaking change to depBase and rebuild libp.so but not exe,
// exe will abort with a complaint on startup.
@@ -838,18 +859,21 @@ func TestABIChecking(t *testing.T) {
// some senses but suffices for the narrow definition of ABI compatibility the
// toolchain uses today.
resetFileStamps()
- appendFile(t, "src/depBase/dep.go", "func ABIBreak() {}\n")
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- c := exec.Command("./bin/exe")
+
+ createFile(t, "./depBase/break.go", "package depBase\nfunc ABIBreak() {}\n")
+ defer os.Remove("./depBase/break.go")
+
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ c := exec.Command("../../bin/exe")
output, err := c.CombinedOutput()
if err == nil {
t.Fatal("executing exe did not fail after ABI break")
}
scanner := bufio.NewScanner(bytes.NewReader(output))
foundMsg := false
- const wantLine = "abi mismatch detected between the executable and libdepBase.so"
+ const wantPrefix = "abi mismatch detected between the executable and lib"
for scanner.Scan() {
- if scanner.Text() == wantLine {
+ if strings.HasPrefix(scanner.Text(), wantPrefix) {
foundMsg = true
break
}
@@ -858,20 +882,20 @@ func TestABIChecking(t *testing.T) {
t.Errorf("scanner encountered error: %v", err)
}
if !foundMsg {
- t.Fatalf("exe failed, but without line %q; got output:\n%s", wantLine, output)
+ t.Fatalf("exe failed, but without line %q; got output:\n%s", wantPrefix, output)
}
// Rebuilding exe makes it work again.
- goCmd(t, "install", "-linkshared", "exe")
- run(t, "rebuilt exe", "./bin/exe")
+ goCmd(t, "install", "-linkshared", "./exe")
+ run(t, "rebuilt exe", "../../bin/exe")
// If we make a change which does not break ABI (such as adding an unexported
// function) and rebuild libdepBase.so, exe still works, even if new function
// is in a file by itself.
resetFileStamps()
- writeFile(t, "src/depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n")
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase")
- run(t, "after non-ABI breaking change", "./bin/exe")
+ createFile(t, "./depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase")
+ run(t, "after non-ABI breaking change", "../../bin/exe")
}
// If a package 'explicit' imports a package 'implicit', building
@@ -881,29 +905,29 @@ func TestABIChecking(t *testing.T) {
// executable rather than fetching it from the shared library. The
// link still succeeds and the executable still runs though.
func TestImplicitInclusion(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "explicit")
- goCmd(t, "install", "-linkshared", "implicitcmd")
- run(t, "running executable linked against library that contains same package as it", "./bin/implicitcmd")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./explicit")
+ goCmd(t, "install", "-linkshared", "./implicitcmd")
+ run(t, "running executable linked against library that contains same package as it", "../../bin/implicitcmd")
}
// Tests to make sure that the type fields of empty interfaces and itab
// fields of nonempty interfaces are unique even across modules,
// so that interface equality works correctly.
func TestInterface(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "iface_a")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_a")
// Note: iface_i gets installed implicitly as a dependency of iface_a.
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "iface_b")
- goCmd(t, "install", "-linkshared", "iface")
- run(t, "running type/itab uniqueness tester", "./bin/iface")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_b")
+ goCmd(t, "install", "-linkshared", "./iface")
+ run(t, "running type/itab uniqueness tester", "../../bin/iface")
}
// Access a global variable from a library.
func TestGlobal(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "globallib")
- goCmd(t, "install", "-linkshared", "global")
- run(t, "global executable", "./bin/global")
- AssertIsLinkedTo(t, "./bin/global", soname)
- AssertHasRPath(t, "./bin/global", gorootInstallDir)
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./globallib")
+ goCmd(t, "install", "-linkshared", "./global")
+ run(t, "global executable", "../../bin/global")
+ AssertIsLinkedTo(t, "../../bin/global", soname)
+ AssertHasRPath(t, "../../bin/global", gorootInstallDir)
}
// Run a test using -linkshared of an installed shared package.
@@ -915,5 +939,5 @@ func TestTestInstalledShared(t *testing.T) {
// Test generated pointer method with -linkshared.
// Issue 25065.
func TestGeneratedMethod(t *testing.T) {
- goCmd(t, "install", "-buildmode=shared", "-linkshared", "issue25065")
+ goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue25065")
}
diff --git a/libgo/misc/cgo/testshared/src/dep2/dep2.go b/libgo/misc/cgo/testshared/testdata/dep2/dep2.go
index c2c812a..94f38cf 100644
--- a/libgo/misc/cgo/testshared/src/dep2/dep2.go
+++ b/libgo/misc/cgo/testshared/testdata/dep2/dep2.go
@@ -1,6 +1,6 @@
package dep2
-import "depBase"
+import "testshared/depBase"
var W int = 1
diff --git a/libgo/misc/cgo/testshared/src/dep3/dep3.go b/libgo/misc/cgo/testshared/testdata/dep3/dep3.go
index 7b7c9da..6b02ad2 100644
--- a/libgo/misc/cgo/testshared/src/dep3/dep3.go
+++ b/libgo/misc/cgo/testshared/testdata/dep3/dep3.go
@@ -7,8 +7,8 @@ package dep3
// the type data in this case and later crash.
import (
- "dep2"
- "depBase"
+ "testshared/dep2"
+ "testshared/depBase"
)
type Dep3 struct {
diff --git a/libgo/misc/cgo/testshared/src/depBase/asm.s b/libgo/misc/cgo/testshared/testdata/depBase/asm.s
index a8acf77f0..a8acf77f0 100644
--- a/libgo/misc/cgo/testshared/src/depBase/asm.s
+++ b/libgo/misc/cgo/testshared/testdata/depBase/asm.s
diff --git a/libgo/misc/cgo/testshared/src/depBase/dep.go b/libgo/misc/cgo/testshared/testdata/depBase/dep.go
index e7cc7c8..e7cc7c8 100644
--- a/libgo/misc/cgo/testshared/src/depBase/dep.go
+++ b/libgo/misc/cgo/testshared/testdata/depBase/dep.go
diff --git a/libgo/misc/cgo/testshared/src/depBase/gccgo.go b/libgo/misc/cgo/testshared/testdata/depBase/gccgo.go
index 2b02a1e..2b02a1e 100644
--- a/libgo/misc/cgo/testshared/src/depBase/gccgo.go
+++ b/libgo/misc/cgo/testshared/testdata/depBase/gccgo.go
diff --git a/libgo/misc/cgo/testshared/src/depBase/stubs.go b/libgo/misc/cgo/testshared/testdata/depBase/stubs.go
index 04534f3..04534f3 100644
--- a/libgo/misc/cgo/testshared/src/depBase/stubs.go
+++ b/libgo/misc/cgo/testshared/testdata/depBase/stubs.go
diff --git a/libgo/misc/cgo/testshared/src/division/division.go b/libgo/misc/cgo/testshared/testdata/division/division.go
index bb5fc98..bb5fc98 100644
--- a/libgo/misc/cgo/testshared/src/division/division.go
+++ b/libgo/misc/cgo/testshared/testdata/division/division.go
diff --git a/libgo/misc/cgo/testshared/src/exe/exe.go b/libgo/misc/cgo/testshared/testdata/exe/exe.go
index bd864d8..ee95f97 100644
--- a/libgo/misc/cgo/testshared/src/exe/exe.go
+++ b/libgo/misc/cgo/testshared/testdata/exe/exe.go
@@ -1,10 +1,11 @@
package main
import (
- "depBase"
"os"
"reflect"
"runtime"
+
+ "testshared/depBase"
)
// Having a function declared in the main package triggered
diff --git a/libgo/misc/cgo/testshared/src/exe2/exe2.go b/libgo/misc/cgo/testshared/testdata/exe2/exe2.go
index 675fd1f..433f331 100644
--- a/libgo/misc/cgo/testshared/src/exe2/exe2.go
+++ b/libgo/misc/cgo/testshared/testdata/exe2/exe2.go
@@ -1,6 +1,6 @@
package main
-import "dep2"
+import "testshared/dep2"
func main() {
d := &dep2.Dep2{}
diff --git a/libgo/misc/cgo/testshared/src/exe3/exe3.go b/libgo/misc/cgo/testshared/testdata/exe3/exe3.go
index 643f260..533e3a9e 100644
--- a/libgo/misc/cgo/testshared/src/exe3/exe3.go
+++ b/libgo/misc/cgo/testshared/testdata/exe3/exe3.go
@@ -1,6 +1,6 @@
package main
-import "dep3"
+import "testshared/dep3"
func main() {
dep3.D3()
diff --git a/libgo/misc/cgo/testshared/src/execgo/exe.go b/libgo/misc/cgo/testshared/testdata/execgo/exe.go
index 0427be8..0427be8 100644
--- a/libgo/misc/cgo/testshared/src/execgo/exe.go
+++ b/libgo/misc/cgo/testshared/testdata/execgo/exe.go
diff --git a/libgo/misc/cgo/testshared/src/explicit/explicit.go b/libgo/misc/cgo/testshared/testdata/explicit/explicit.go
index 6a4453f..af969fc 100644
--- a/libgo/misc/cgo/testshared/src/explicit/explicit.go
+++ b/libgo/misc/cgo/testshared/testdata/explicit/explicit.go
@@ -1,7 +1,7 @@
package explicit
import (
- "implicit"
+ "testshared/implicit"
)
func E() int {
diff --git a/libgo/misc/cgo/testshared/src/global/main.go b/libgo/misc/cgo/testshared/testdata/global/main.go
index 94e7f24..f43e7c3 100644
--- a/libgo/misc/cgo/testshared/src/global/main.go
+++ b/libgo/misc/cgo/testshared/testdata/global/main.go
@@ -5,7 +5,7 @@
package main
import (
- "globallib"
+ "testshared/globallib"
)
//go:noinline
diff --git a/libgo/misc/cgo/testshared/src/globallib/global.go b/libgo/misc/cgo/testshared/testdata/globallib/global.go
index b4372a2..b4372a2 100644
--- a/libgo/misc/cgo/testshared/src/globallib/global.go
+++ b/libgo/misc/cgo/testshared/testdata/globallib/global.go
diff --git a/libgo/misc/cgo/testshared/src/iface/main.go b/libgo/misc/cgo/testshared/testdata/iface/main.go
index 3d5b54e..d26ebbc 100644
--- a/libgo/misc/cgo/testshared/src/iface/main.go
+++ b/libgo/misc/cgo/testshared/testdata/iface/main.go
@@ -4,8 +4,8 @@
package main
-import "iface_a"
-import "iface_b"
+import "testshared/iface_a"
+import "testshared/iface_b"
func main() {
if iface_a.F() != iface_b.F() {
diff --git a/libgo/misc/cgo/testshared/src/iface_a/a.go b/libgo/misc/cgo/testshared/testdata/iface_a/a.go
index e11047c..e2cef1e 100644
--- a/libgo/misc/cgo/testshared/src/iface_a/a.go
+++ b/libgo/misc/cgo/testshared/testdata/iface_a/a.go
@@ -4,7 +4,7 @@
package iface_a
-import "iface_i"
+import "testshared/iface_i"
//go:noinline
func F() interface{} {
diff --git a/libgo/misc/cgo/testshared/src/iface_b/b.go b/libgo/misc/cgo/testshared/testdata/iface_b/b.go
index 47aee2e..dd3e027 100644
--- a/libgo/misc/cgo/testshared/src/iface_b/b.go
+++ b/libgo/misc/cgo/testshared/testdata/iface_b/b.go
@@ -4,7 +4,7 @@
package iface_b
-import "iface_i"
+import "testshared/iface_i"
//go:noinline
func F() interface{} {
diff --git a/libgo/misc/cgo/testshared/src/iface_i/i.go b/libgo/misc/cgo/testshared/testdata/iface_i/i.go
index 31c8038..31c8038 100644
--- a/libgo/misc/cgo/testshared/src/iface_i/i.go
+++ b/libgo/misc/cgo/testshared/testdata/iface_i/i.go
diff --git a/libgo/misc/cgo/testshared/src/implicit/implicit.go b/libgo/misc/cgo/testshared/testdata/implicit/implicit.go
index 5360188..5360188 100644
--- a/libgo/misc/cgo/testshared/src/implicit/implicit.go
+++ b/libgo/misc/cgo/testshared/testdata/implicit/implicit.go
diff --git a/libgo/misc/cgo/testshared/src/implicitcmd/implicitcmd.go b/libgo/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go
index f611293..4d42967 100644
--- a/libgo/misc/cgo/testshared/src/implicitcmd/implicitcmd.go
+++ b/libgo/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go
@@ -1,8 +1,8 @@
package main
import (
- "explicit"
- "implicit"
+ "testshared/explicit"
+ "testshared/implicit"
)
func main() {
diff --git a/libgo/misc/cgo/testshared/src/issue25065/a.go b/libgo/misc/cgo/testshared/testdata/issue25065/a.go
index 979350f..979350f 100644
--- a/libgo/misc/cgo/testshared/src/issue25065/a.go
+++ b/libgo/misc/cgo/testshared/testdata/issue25065/a.go
diff --git a/libgo/misc/cgo/testshared/src/trivial/trivial.go b/libgo/misc/cgo/testshared/testdata/trivial/trivial.go
index 6ade47c..6ade47c 100644
--- a/libgo/misc/cgo/testshared/src/trivial/trivial.go
+++ b/libgo/misc/cgo/testshared/testdata/trivial/trivial.go
diff --git a/libgo/misc/cgo/testso/noso_test.go b/libgo/misc/cgo/testso/noso_test.go
new file mode 100644
index 0000000..c88aebf
--- /dev/null
+++ b/libgo/misc/cgo/testso/noso_test.go
@@ -0,0 +1,9 @@
+// Copyright 2019 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.
+
+// +build !cgo
+
+package so_test
+
+// Nothing to test.
diff --git a/libgo/misc/cgo/testso/overlaydir_test.go b/libgo/misc/cgo/testso/overlaydir_test.go
new file mode 100644
index 0000000..10c874d
--- /dev/null
+++ b/libgo/misc/cgo/testso/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package so_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/testso/so_test.go b/libgo/misc/cgo/testso/so_test.go
new file mode 100644
index 0000000..9c7f272
--- /dev/null
+++ b/libgo/misc/cgo/testso/so_test.go
@@ -0,0 +1,140 @@
+// Copyright 2019 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.
+
+// +build cgo
+
+package so_test
+
+import (
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+)
+
+func requireTestSOSupported(t *testing.T) {
+ t.Helper()
+ switch runtime.GOARCH {
+ case "arm", "arm64":
+ if runtime.GOOS == "darwin" {
+ t.Skip("No exec facility on iOS.")
+ }
+ case "ppc64":
+ if runtime.GOOS == "linux" {
+ t.Skip("External linking not implemented on aix/ppc64 (issue #8912).")
+ }
+ case "mips64le", "mips64":
+ t.Skip("External linking not implemented on mips64.")
+ }
+ if runtime.GOOS == "android" {
+ t.Skip("No exec facility on Android.")
+ }
+}
+
+func TestSO(t *testing.T) {
+ requireTestSOSupported(t)
+
+ GOPATH, err := ioutil.TempDir("", "cgosotest")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer os.RemoveAll(GOPATH)
+
+ modRoot := filepath.Join(GOPATH, "src", "cgosotest")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ log.Panic(err)
+ }
+ if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
+ log.Panic(err)
+ }
+
+ cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
+ cmd.Dir = modRoot
+ cmd.Stderr = new(strings.Builder)
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ out, err := cmd.Output()
+ if err != nil {
+ t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+ }
+ lines := strings.Split(string(out), "\n")
+ if len(lines) != 3 || lines[2] != "" {
+ t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
+ }
+
+ cc := lines[0]
+ if cc == "" {
+ t.Fatal("CC environment variable (go env CC) cannot be empty")
+ }
+ gogccflags := strings.Split(lines[1], " ")
+
+ // build shared object
+ ext := "so"
+ args := append(gogccflags, "-shared")
+ switch runtime.GOOS {
+ case "darwin":
+ ext = "dylib"
+ args = append(args, "-undefined", "suppress", "-flat_namespace")
+ case "windows":
+ ext = "dll"
+ args = append(args, "-DEXPORT_DLL")
+ case "aix":
+ ext = "so.1"
+ }
+ sofname := "libcgosotest." + ext
+ args = append(args, "-o", sofname, "cgoso_c.c")
+
+ cmd = exec.Command(cc, args...)
+ cmd.Dir = modRoot
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+ if runtime.GOOS == "aix" {
+ // Shared object must be wrapped by an archive
+ cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
+ cmd.Dir = modRoot
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ }
+
+ cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
+ cmd.Dir = modRoot
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+ cmd = exec.Command("./main.exe")
+ cmd.Dir = modRoot
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ if runtime.GOOS != "windows" {
+ s := "LD_LIBRARY_PATH"
+ if runtime.GOOS == "darwin" {
+ s = "DYLD_LIBRARY_PATH"
+ }
+ cmd.Env = append(os.Environ(), s+"=.")
+
+ // On FreeBSD 64-bit architectures, the 32-bit linker looks for
+ // different environment variables.
+ if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
+ cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
+ }
+ }
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/testso/cgoso.c b/libgo/misc/cgo/testso/testdata/cgoso.c
index 917f472..612e5d3 100644
--- a/libgo/misc/cgo/testso/cgoso.c
+++ b/libgo/misc/cgo/testso/testdata/cgoso.c
@@ -4,7 +4,7 @@
#include "_cgo_export.h"
-#ifdef WIN32
+#if defined(WIN32) || defined(_AIX)
extern void setCallback(void *);
void init() {
setCallback(goCallback);
diff --git a/libgo/misc/cgo/testso/cgoso.go b/libgo/misc/cgo/testso/testdata/cgoso.go
index 29814fa..bba5de3 100644
--- a/libgo/misc/cgo/testso/cgoso.go
+++ b/libgo/misc/cgo/testso/testdata/cgoso.go
@@ -15,6 +15,7 @@ package cgosotest
#cgo netbsd LDFLAGS: -L. libcgosotest.so
#cgo darwin LDFLAGS: -L. libcgosotest.dylib
#cgo windows LDFLAGS: -L. libcgosotest.dll
+#cgo aix LDFLAGS: -L. -l cgosotest
void init(void);
void sofunc(void);
diff --git a/libgo/misc/cgo/testso/cgoso_c.c b/libgo/misc/cgo/testso/testdata/cgoso_c.c
index 7a38022..e5015ed 100644
--- a/libgo/misc/cgo/testso/cgoso_c.c
+++ b/libgo/misc/cgo/testso/testdata/cgoso_c.c
@@ -14,6 +14,15 @@ __declspec(dllexport) void setCallback(void *f)
goCallback = (void (*)())f;
}
__declspec(dllexport) void sofunc(void);
+#elif defined(_AIX)
+// AIX doesn't allow the creation of a shared object with an
+// undefined symbol. It's possible to bypass this problem by
+// using -Wl,-G and -Wl,-brtl option which allows run-time linking.
+// However, that's not how most of AIX shared object works.
+// Therefore, it's better to consider goCallback as a pointer and
+// to set up during an init function.
+void (*goCallback)(void);
+void setCallback(void *f) { goCallback = f; }
#else
extern void goCallback(void);
void setCallback(void *f) { (void)f; }
diff --git a/libgo/misc/cgo/testso/cgoso_unix.go b/libgo/misc/cgo/testso/testdata/cgoso_unix.go
index 49cdeaa..1860694 100644
--- a/libgo/misc/cgo/testso/cgoso_unix.go
+++ b/libgo/misc/cgo/testso/testdata/cgoso_unix.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build dragonfly freebsd linux netbsd solaris
+// +build aix dragonfly freebsd linux netbsd solaris
package cgosotest
diff --git a/libgo/misc/cgo/testso/main.go b/libgo/misc/cgo/testso/testdata/main.go
index 88aa432..963d451 100644
--- a/libgo/misc/cgo/testso/main.go
+++ b/libgo/misc/cgo/testso/testdata/main.go
@@ -6,7 +6,7 @@
package main
-import "."
+import "cgosotest"
func main() {
cgosotest.Test()
diff --git a/libgo/misc/cgo/testsovar/noso_test.go b/libgo/misc/cgo/testsovar/noso_test.go
new file mode 100644
index 0000000..c88aebf
--- /dev/null
+++ b/libgo/misc/cgo/testsovar/noso_test.go
@@ -0,0 +1,9 @@
+// Copyright 2019 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.
+
+// +build !cgo
+
+package so_test
+
+// Nothing to test.
diff --git a/libgo/misc/cgo/testsovar/overlaydir_test.go b/libgo/misc/cgo/testsovar/overlaydir_test.go
new file mode 100644
index 0000000..10c874d
--- /dev/null
+++ b/libgo/misc/cgo/testsovar/overlaydir_test.go
@@ -0,0 +1,81 @@
+// Copyright 2019 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.
+
+package so_test
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added.
+//
+// TODO: Once we no longer need to support the misc module in GOPATH mode,
+// factor this function out into a package to reduce duplication.
+func overlayDir(dstRoot, srcRoot string) error {
+ dstRoot = filepath.Clean(dstRoot)
+ if err := os.MkdirAll(dstRoot, 0777); err != nil {
+ return err
+ }
+
+ symBase, err := filepath.Rel(srcRoot, dstRoot)
+ if err != nil {
+ symBase, err = filepath.Abs(srcRoot)
+ if err != nil {
+ return err
+ }
+ }
+
+ return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error {
+ if err != nil || srcPath == srcRoot {
+ return err
+ }
+
+ suffix := strings.TrimPrefix(srcPath, srcRoot)
+ for len(suffix) > 0 && suffix[0] == filepath.Separator {
+ suffix = suffix[1:]
+ }
+ dstPath := filepath.Join(dstRoot, suffix)
+
+ perm := info.Mode() & os.ModePerm
+ if info.Mode()&os.ModeSymlink != 0 {
+ info, err = os.Stat(srcPath)
+ if err != nil {
+ return err
+ }
+ perm = info.Mode() & os.ModePerm
+ }
+
+ // Always copy directories (don't symlink them).
+ // If we add a file in the overlay, we don't want to add it in the original.
+ if info.IsDir() {
+ return os.Mkdir(dstPath, perm)
+ }
+
+ // If the OS supports symlinks, use them instead of copying bytes.
+ if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil {
+ return nil
+ }
+
+ // Otherwise, copy the bytes.
+ src, err := os.Open(srcPath)
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+ if err != nil {
+ return err
+ }
+
+ _, err = io.Copy(dst, src)
+ if closeErr := dst.Close(); err == nil {
+ err = closeErr
+ }
+ return err
+ })
+}
diff --git a/libgo/misc/cgo/testsovar/so_test.go b/libgo/misc/cgo/testsovar/so_test.go
new file mode 100644
index 0000000..9c7f272
--- /dev/null
+++ b/libgo/misc/cgo/testsovar/so_test.go
@@ -0,0 +1,140 @@
+// Copyright 2019 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.
+
+// +build cgo
+
+package so_test
+
+import (
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "testing"
+)
+
+func requireTestSOSupported(t *testing.T) {
+ t.Helper()
+ switch runtime.GOARCH {
+ case "arm", "arm64":
+ if runtime.GOOS == "darwin" {
+ t.Skip("No exec facility on iOS.")
+ }
+ case "ppc64":
+ if runtime.GOOS == "linux" {
+ t.Skip("External linking not implemented on aix/ppc64 (issue #8912).")
+ }
+ case "mips64le", "mips64":
+ t.Skip("External linking not implemented on mips64.")
+ }
+ if runtime.GOOS == "android" {
+ t.Skip("No exec facility on Android.")
+ }
+}
+
+func TestSO(t *testing.T) {
+ requireTestSOSupported(t)
+
+ GOPATH, err := ioutil.TempDir("", "cgosotest")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer os.RemoveAll(GOPATH)
+
+ modRoot := filepath.Join(GOPATH, "src", "cgosotest")
+ if err := overlayDir(modRoot, "testdata"); err != nil {
+ log.Panic(err)
+ }
+ if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil {
+ log.Panic(err)
+ }
+
+ cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS")
+ cmd.Dir = modRoot
+ cmd.Stderr = new(strings.Builder)
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ out, err := cmd.Output()
+ if err != nil {
+ t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+ }
+ lines := strings.Split(string(out), "\n")
+ if len(lines) != 3 || lines[2] != "" {
+ t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines)
+ }
+
+ cc := lines[0]
+ if cc == "" {
+ t.Fatal("CC environment variable (go env CC) cannot be empty")
+ }
+ gogccflags := strings.Split(lines[1], " ")
+
+ // build shared object
+ ext := "so"
+ args := append(gogccflags, "-shared")
+ switch runtime.GOOS {
+ case "darwin":
+ ext = "dylib"
+ args = append(args, "-undefined", "suppress", "-flat_namespace")
+ case "windows":
+ ext = "dll"
+ args = append(args, "-DEXPORT_DLL")
+ case "aix":
+ ext = "so.1"
+ }
+ sofname := "libcgosotest." + ext
+ args = append(args, "-o", sofname, "cgoso_c.c")
+
+ cmd = exec.Command(cc, args...)
+ cmd.Dir = modRoot
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+ if runtime.GOOS == "aix" {
+ // Shared object must be wrapped by an archive
+ cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1")
+ cmd.Dir = modRoot
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ }
+
+ cmd = exec.Command("go", "build", "-o", "main.exe", "main.go")
+ cmd.Dir = modRoot
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+
+ cmd = exec.Command("./main.exe")
+ cmd.Dir = modRoot
+ cmd.Env = append(os.Environ(), "GOPATH="+GOPATH)
+ if runtime.GOOS != "windows" {
+ s := "LD_LIBRARY_PATH"
+ if runtime.GOOS == "darwin" {
+ s = "DYLD_LIBRARY_PATH"
+ }
+ cmd.Env = append(os.Environ(), s+"=.")
+
+ // On FreeBSD 64-bit architectures, the 32-bit linker looks for
+ // different environment variables.
+ if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
+ cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.")
+ }
+ }
+ out, err = cmd.CombinedOutput()
+ if err != nil {
+ t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out)
+ }
+ t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out)
+}
diff --git a/libgo/misc/cgo/testsovar/cgoso.go b/libgo/misc/cgo/testsovar/testdata/cgoso.go
index 88d44c2..9c7f95e 100644
--- a/libgo/misc/cgo/testsovar/cgoso.go
+++ b/libgo/misc/cgo/testsovar/testdata/cgoso.go
@@ -19,6 +19,7 @@ package cgosotest
#cgo netbsd LDFLAGS: -L. libcgosotest.so
#cgo darwin LDFLAGS: -L. libcgosotest.dylib
#cgo windows LDFLAGS: -L. libcgosotest.dll
+#cgo aix LDFLAGS: -L. -l cgosotest
#include "cgoso_c.h"
diff --git a/libgo/misc/cgo/testsovar/cgoso_c.c b/libgo/misc/cgo/testsovar/testdata/cgoso_c.c
index a448c01..a448c01 100644
--- a/libgo/misc/cgo/testsovar/cgoso_c.c
+++ b/libgo/misc/cgo/testsovar/testdata/cgoso_c.c
diff --git a/libgo/misc/cgo/testsovar/cgoso_c.h b/libgo/misc/cgo/testsovar/testdata/cgoso_c.h
index 640db7b..640db7b 100644
--- a/libgo/misc/cgo/testsovar/cgoso_c.h
+++ b/libgo/misc/cgo/testsovar/testdata/cgoso_c.h
diff --git a/libgo/misc/cgo/testsovar/main.go b/libgo/misc/cgo/testsovar/testdata/main.go
index 9c8a1c4..87b52cef 100644
--- a/libgo/misc/cgo/testsovar/main.go
+++ b/libgo/misc/cgo/testsovar/testdata/main.go
@@ -6,7 +6,7 @@
package main
-import "."
+import "cgosotest"
func main() {
cgosotest.Test()