summaryrefslogtreecommitdiff
path: root/gcc/testsuite/go.test
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/go.test')
-rw-r--r--gcc/testsuite/go.test/go-test.exp526
-rw-r--r--gcc/testsuite/go.test/test/alias.go32
-rw-r--r--gcc/testsuite/go.test/test/alias1.go54
-rw-r--r--gcc/testsuite/go.test/test/append.go232
-rw-r--r--gcc/testsuite/go.test/test/arm-pass.txt488
-rw-r--r--gcc/testsuite/go.test/test/assign.go22
-rwxr-xr-xgcc/testsuite/go.test/test/bench/clean.bash4
-rw-r--r--gcc/testsuite/go.test/test/bench/garbage/Makefile (renamed from gcc/testsuite/go.test/test/garbage/Makefile)9
-rw-r--r--gcc/testsuite/go.test/test/bench/garbage/parser.go (renamed from gcc/testsuite/go.test/test/garbage/parser.go)111
-rw-r--r--gcc/testsuite/go.test/test/bench/garbage/peano.go (renamed from gcc/testsuite/go.test/test/garbage/peano.go)22
-rw-r--r--gcc/testsuite/go.test/test/bench/garbage/stats.go46
-rw-r--r--gcc/testsuite/go.test/test/bench/garbage/tree.go (renamed from gcc/testsuite/go.test/test/garbage/tree.go)10
-rw-r--r--gcc/testsuite/go.test/test/bench/garbage/tree2.go88
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/Makefile7
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/_testmain.go40
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/binarytree_test.go63
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/dummy.go3
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/fannkuch_test.go84
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/fasta_test.go164
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/gob_test.go95
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/gzip_test.go69
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/json_test.go84
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/jsondata_test.go1818
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/revcomp_test.go85
-rw-r--r--gcc/testsuite/go.test/test/bench/go1/template_test.go76
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/Makefile14
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/binary-tree-freelist.go (renamed from gcc/testsuite/go.test/test/bench/binary-tree-freelist.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/binary-tree-freelist.txt (renamed from gcc/testsuite/go.test/test/bench/binary-tree-freelist.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/binary-tree.c (renamed from gcc/testsuite/go.test/test/bench/binary-tree.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/binary-tree.go (renamed from gcc/testsuite/go.test/test/bench/binary-tree.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/binary-tree.txt (renamed from gcc/testsuite/go.test/test/bench/binary-tree.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/chameneosredux.c (renamed from gcc/testsuite/go.test/test/bench/chameneosredux.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/chameneosredux.go (renamed from gcc/testsuite/go.test/test/bench/chameneosredux.go)20
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/chameneosredux.txt (renamed from gcc/testsuite/go.test/test/bench/chameneosredux.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fannkuch-parallel.go (renamed from gcc/testsuite/go.test/test/bench/fannkuch-parallel.go)2
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fannkuch-parallel.txt (renamed from gcc/testsuite/go.test/test/bench/fannkuch-parallel.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fannkuch.c (renamed from gcc/testsuite/go.test/test/bench/fannkuch.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fannkuch.go (renamed from gcc/testsuite/go.test/test/bench/fannkuch.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fannkuch.txt (renamed from gcc/testsuite/go.test/test/bench/fannkuch.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fasta-1000.out (renamed from gcc/testsuite/go.test/test/bench/fasta-1000.out)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fasta.c (renamed from gcc/testsuite/go.test/test/bench/fasta.c)4
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fasta.go (renamed from gcc/testsuite/go.test/test/bench/fasta.go)50
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/fasta.txt (renamed from gcc/testsuite/go.test/test/bench/fasta.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/k-nucleotide-parallel.go (renamed from gcc/testsuite/go.test/test/bench/k-nucleotide-parallel.go)2
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/k-nucleotide-parallel.txt (renamed from gcc/testsuite/go.test/test/bench/k-nucleotide-parallel.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.c (renamed from gcc/testsuite/go.test/test/bench/k-nucleotide.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.go (renamed from gcc/testsuite/go.test/test/bench/k-nucleotide.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.txt (renamed from gcc/testsuite/go.test/test/bench/k-nucleotide.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/mandelbrot.c (renamed from gcc/testsuite/go.test/test/bench/mandelbrot.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/mandelbrot.go (renamed from gcc/testsuite/go.test/test/bench/mandelbrot.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/mandelbrot.txt (renamed from gcc/testsuite/go.test/test/bench/mandelbrot.txt)bin5011 -> 5011 bytes
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/meteor-contest.c (renamed from gcc/testsuite/go.test/test/bench/meteor-contest.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/meteor-contest.go (renamed from gcc/testsuite/go.test/test/bench/meteor-contest.go)9
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/meteor-contest.txt (renamed from gcc/testsuite/go.test/test/bench/meteor-contest.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/nbody.c (renamed from gcc/testsuite/go.test/test/bench/nbody.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/nbody.go (renamed from gcc/testsuite/go.test/test/bench/nbody.go)48
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/nbody.txt (renamed from gcc/testsuite/go.test/test/bench/nbody.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/pidigits.c (renamed from gcc/testsuite/go.test/test/bench/pidigits.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/pidigits.go (renamed from gcc/testsuite/go.test/test/bench/pidigits.go)10
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/pidigits.txt (renamed from gcc/testsuite/go.test/test/bench/pidigits.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/regex-dna-parallel.go (renamed from gcc/testsuite/go.test/test/bench/regex-dna-parallel.go)4
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/regex-dna-parallel.txt (renamed from gcc/testsuite/go.test/test/bench/regex-dna-parallel.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/regex-dna.c (renamed from gcc/testsuite/go.test/test/bench/regex-dna.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/regex-dna.go (renamed from gcc/testsuite/go.test/test/bench/regex-dna.go)2
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/regex-dna.txt (renamed from gcc/testsuite/go.test/test/bench/regex-dna.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/reverse-complement.c (renamed from gcc/testsuite/go.test/test/bench/reverse-complement.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/reverse-complement.go (renamed from gcc/testsuite/go.test/test/bench/reverse-complement.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/reverse-complement.txt (renamed from gcc/testsuite/go.test/test/bench/reverse-complement.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/spectral-norm-parallel.go (renamed from gcc/testsuite/go.test/test/bench/spectral-norm-parallel.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/spectral-norm.c (renamed from gcc/testsuite/go.test/test/bench/spectral-norm.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/spectral-norm.go (renamed from gcc/testsuite/go.test/test/bench/spectral-norm.go)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/spectral-norm.txt (renamed from gcc/testsuite/go.test/test/bench/spectral-norm.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/threadring.c (renamed from gcc/testsuite/go.test/test/bench/threadring.c)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/threadring.go (renamed from gcc/testsuite/go.test/test/bench/threadring.go)2
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/threadring.txt (renamed from gcc/testsuite/go.test/test/bench/threadring.txt)0
-rw-r--r--gcc/testsuite/go.test/test/bench/shootout/timing.log (renamed from gcc/testsuite/go.test/test/bench/timing.log)416
-rwxr-xr-xgcc/testsuite/go.test/test/bench/shootout/timing.sh (renamed from gcc/testsuite/go.test/test/bench/timing.sh)37
-rw-r--r--gcc/testsuite/go.test/test/blank.go41
-rw-r--r--gcc/testsuite/go.test/test/blank1.go1
-rw-r--r--gcc/testsuite/go.test/test/bugs/bug395.go22
-rw-r--r--gcc/testsuite/go.test/test/chan/doubleselect.go37
-rw-r--r--gcc/testsuite/go.test/test/chan/goroutines.go2
-rw-r--r--gcc/testsuite/go.test/test/chan/nonblock.go154
-rw-r--r--gcc/testsuite/go.test/test/chan/perm.go53
-rw-r--r--gcc/testsuite/go.test/test/chan/select2.go9
-rw-r--r--gcc/testsuite/go.test/test/chan/select3.go47
-rw-r--r--gcc/testsuite/go.test/test/chan/select4.go25
-rw-r--r--gcc/testsuite/go.test/test/chan/select5.go480
-rw-r--r--gcc/testsuite/go.test/test/chan/select6.go34
-rw-r--r--gcc/testsuite/go.test/test/chan/select7.go68
-rw-r--r--gcc/testsuite/go.test/test/chan/sendstmt.go37
-rw-r--r--gcc/testsuite/go.test/test/chan/sieve2.go38
-rw-r--r--gcc/testsuite/go.test/test/chan/zerosize.go16
-rw-r--r--gcc/testsuite/go.test/test/closedchan.go270
-rw-r--r--gcc/testsuite/go.test/test/closure.go35
-rw-r--r--gcc/testsuite/go.test/test/cmp.go400
-rw-r--r--gcc/testsuite/go.test/test/cmp1.go76
-rw-r--r--gcc/testsuite/go.test/test/cmp3.go15
-rw-r--r--gcc/testsuite/go.test/test/cmp4.go14
-rw-r--r--gcc/testsuite/go.test/test/cmp5.go14
-rw-r--r--gcc/testsuite/go.test/test/cmp6.go67
-rw-r--r--gcc/testsuite/go.test/test/cmplxdivide.c2
-rw-r--r--gcc/testsuite/go.test/test/cmplxdivide.go14
-rw-r--r--gcc/testsuite/go.test/test/complit.go16
-rw-r--r--gcc/testsuite/go.test/test/complit1.go39
-rw-r--r--gcc/testsuite/go.test/test/const1.go2
-rw-r--r--gcc/testsuite/go.test/test/const3.go6
-rw-r--r--gcc/testsuite/go.test/test/convert.go2
-rw-r--r--gcc/testsuite/go.test/test/convert1.go96
-rw-r--r--gcc/testsuite/go.test/test/convlit.go16
-rw-r--r--gcc/testsuite/go.test/test/copy.go61
-rw-r--r--gcc/testsuite/go.test/test/crlf.go52
-rw-r--r--gcc/testsuite/go.test/test/ddd1.go25
-rw-r--r--gcc/testsuite/go.test/test/declbad.go2
-rw-r--r--gcc/testsuite/go.test/test/defer.go2
-rw-r--r--gcc/testsuite/go.test/test/deferprint.go2
-rw-r--r--gcc/testsuite/go.test/test/deferprint.out2
-rw-r--r--gcc/testsuite/go.test/test/divide.go54
-rw-r--r--gcc/testsuite/go.test/test/dwarf/linedirectives.go83
-rw-r--r--gcc/testsuite/go.test/test/dwarf/main.go (renamed from gcc/testsuite/go.test/test/cmp2.go)28
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z1.go5
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z10.go6
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z11.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z12.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z13.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z14.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z15.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z16.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z17.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z18.go5
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z19.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z2.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z20.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z3.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z4.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z5.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z6.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z7.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z8.go4
-rw-r--r--gcc/testsuite/go.test/test/dwarf/z9.go4
-rw-r--r--gcc/testsuite/go.test/test/env.go25
-rw-r--r--gcc/testsuite/go.test/test/eof.go9
-rw-r--r--gcc/testsuite/go.test/test/eof1.go9
-rwxr-xr-xgcc/testsuite/go.test/test/errchk137
-rw-r--r--gcc/testsuite/go.test/test/escape2.go1064
-rw-r--r--gcc/testsuite/go.test/test/escape3.go36
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug014.go1
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug016.go6
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug027.go75
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug055.go29
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug067.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug069.go6
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug070.go37
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug076.go10
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug077.go5
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug081.go8
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug091.go11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug093.go1
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug107.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug108.go1
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug113.go18
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug120.go8
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug137.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug140.go13
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug141.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug148.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug1515.go20
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug175.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug177.go25
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug178.go18
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug179.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug195.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug200.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug204.go16
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug205.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug213.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug219.go12
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug220.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug226.dir/y.go31
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug228.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug229.go6
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug231.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug234.go1
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug238.go1
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug242.go4
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug243.go37
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug248.dir/bug2.go6
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug251.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug252.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug257.go5
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug260.go (renamed from gcc/testsuite/go.test/test/bugs/bug260.go)30
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug262.go11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug268.go53
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug273.go12
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug274.go4
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug285.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug286.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug297.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug298.go2
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug305.go24
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug306.dir/p1.go (renamed from gcc/testsuite/go.test/test/fixedbugs/bug226.dir/x.go)8
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug306.dir/p2.go8
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug306.go (renamed from gcc/testsuite/go.test/test/fixedbugs/bug226.go)4
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug307.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug308.go (renamed from gcc/testsuite/go.test/test/fixedbugs/bug270.go)14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug309.go21
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug311.go20
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug312.go22
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug313.dir/a.go11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug313.dir/b.go11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug313.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug314.go31
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug315.go18
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug316.go17
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug317.go16
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug318.go12
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug319.go22
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug320.go45
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug321.go30
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug322.dir/lib.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug322.dir/main.go40
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug322.go8
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug323.go20
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug324.dir/main.go53
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug324.dir/p.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug324.go8
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug325.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug326.go39
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug327.go24
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug328.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug328.out1
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug329.go46
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug330.go13
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug331.go36
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug332.go17
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug333.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug334.go31
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug335.dir/a.go9
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug335.dir/b.go11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug335.go10
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug336.go86
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug337.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug338.go22
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug339.go20
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug340.go17
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug341.go22
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug342.go24
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug343.go33
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug344.go24
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug345.dir/io.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug345.dir/main.go28
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug345.go7
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug346.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug347.go49
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug348.go46
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug349.go13
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug350.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug351.go13
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug352.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug353.go30
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug354.go22
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug355.go (renamed from gcc/testsuite/go.test/test/fixedbugs/bug001.go)11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug356.go41
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug357.go26
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug358.go26
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug361.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug362.go16
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug363.go21
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug364.go31
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug365.go22
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug366.go37
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug367.dir/main.go24
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug367.dir/p.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug367.go7
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug368.go26
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug369.dir/pkg.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug369.go59
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug370.go18
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug371.go24
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug372.go28
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug373.go32
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug374.go20
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug375.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug376.go11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug377.dir/one.go6
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug377.dir/two.go4
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug377.go9
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug378.go19
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug379.go18
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug380.go11
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug381.go20
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug382.dir/pkg.go7
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug382.go10
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug383.go13
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug384.go12
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug385_32.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug385_64.go15
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug386.go12
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug387.go30
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug388.go39
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug389.go12
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug390.go16
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug391.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug392.dir/one.go22
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug392.dir/two.go20
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug392.go7
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug393.go30
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug394.go10
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug396.dir/one.go9
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug396.dir/two.go14
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug396.go7
-rw-r--r--gcc/testsuite/go.test/test/fixedbugs/bug397.go13
-rw-r--r--gcc/testsuite/go.test/test/float_lit.go211
-rw-r--r--gcc/testsuite/go.test/test/func2.go3
-rw-r--r--gcc/testsuite/go.test/test/func4.go1
-rw-r--r--gcc/testsuite/go.test/test/func6.go14
-rw-r--r--gcc/testsuite/go.test/test/func7.go29
-rw-r--r--gcc/testsuite/go.test/test/gc2.go44
-rw-r--r--gcc/testsuite/go.test/test/golden-arm.out131
-rw-r--r--gcc/testsuite/go.test/test/golden.out168
-rw-r--r--gcc/testsuite/go.test/test/goprint.go14
-rw-r--r--gcc/testsuite/go.test/test/goprint.out1
-rw-r--r--gcc/testsuite/go.test/test/goto.go535
-rwxr-xr-xgcc/testsuite/go.test/test/hashmap.go12
-rw-r--r--gcc/testsuite/go.test/test/helloworld.go2
-rw-r--r--gcc/testsuite/go.test/test/helloworld.out1
-rw-r--r--gcc/testsuite/go.test/test/if.go26
-rw-r--r--gcc/testsuite/go.test/test/if1.go20
-rw-r--r--gcc/testsuite/go.test/test/import.go7
-rw-r--r--gcc/testsuite/go.test/test/import1.go4
-rw-r--r--gcc/testsuite/go.test/test/index.go4
-rw-r--r--gcc/testsuite/go.test/test/indirect1.go1
-rw-r--r--gcc/testsuite/go.test/test/init.go18
-rw-r--r--gcc/testsuite/go.test/test/init1.go44
-rw-r--r--gcc/testsuite/go.test/test/initializerr.go2
-rw-r--r--gcc/testsuite/go.test/test/initsyscall.go3
-rw-r--r--gcc/testsuite/go.test/test/interface/embed.go23
-rw-r--r--gcc/testsuite/go.test/test/interface/embed2.go70
-rw-r--r--gcc/testsuite/go.test/test/interface/explicit.go2
-rw-r--r--gcc/testsuite/go.test/test/interface/fail.go16
-rw-r--r--gcc/testsuite/go.test/test/interface/fake.go62
-rw-r--r--gcc/testsuite/go.test/test/interface/noeq.go39
-rw-r--r--gcc/testsuite/go.test/test/interface/pointer.go1
-rw-r--r--gcc/testsuite/go.test/test/interface/private.go32
-rw-r--r--gcc/testsuite/go.test/test/interface/private1.go18
-rw-r--r--gcc/testsuite/go.test/test/interface/recursive1.go15
-rw-r--r--gcc/testsuite/go.test/test/interface/recursive2.go22
-rw-r--r--gcc/testsuite/go.test/test/interface/returntype.go15
-rw-r--r--gcc/testsuite/go.test/test/ken/convert.go431
-rw-r--r--gcc/testsuite/go.test/test/ken/cplx0.go2
-rw-r--r--gcc/testsuite/go.test/test/ken/cplx0.out4
-rw-r--r--gcc/testsuite/go.test/test/ken/cplx2.go16
-rw-r--r--gcc/testsuite/go.test/test/ken/cplx3.go29
-rw-r--r--gcc/testsuite/go.test/test/ken/cplx4.go28
-rw-r--r--gcc/testsuite/go.test/test/ken/cplx5.go30
-rw-r--r--gcc/testsuite/go.test/test/ken/divconst.go2
-rw-r--r--gcc/testsuite/go.test/test/ken/intervar.go25
-rw-r--r--gcc/testsuite/go.test/test/ken/label.go26
-rw-r--r--gcc/testsuite/go.test/test/ken/modconst.go2
-rw-r--r--gcc/testsuite/go.test/test/ken/rob1.go57
-rw-r--r--gcc/testsuite/go.test/test/ken/rob2.go261
-rw-r--r--gcc/testsuite/go.test/test/ken/robif.go97
-rw-r--r--gcc/testsuite/go.test/test/ken/simpprint.go13
-rw-r--r--gcc/testsuite/go.test/test/ken/simpswitch.go24
-rw-r--r--gcc/testsuite/go.test/test/ken/string.go19
-rw-r--r--gcc/testsuite/go.test/test/ken/string.out1
-rw-r--r--gcc/testsuite/go.test/test/label.go60
-rw-r--r--gcc/testsuite/go.test/test/label1.go85
-rw-r--r--gcc/testsuite/go.test/test/malloc1.go24
-rw-r--r--gcc/testsuite/go.test/test/mallocfin.go10
-rw-r--r--gcc/testsuite/go.test/test/mallocrand.go91
-rw-r--r--gcc/testsuite/go.test/test/mallocrep.go66
-rw-r--r--gcc/testsuite/go.test/test/mallocrep1.go138
-rw-r--r--gcc/testsuite/go.test/test/map1.go41
-rw-r--r--gcc/testsuite/go.test/test/method.go24
-rw-r--r--gcc/testsuite/go.test/test/method2.go25
-rw-r--r--gcc/testsuite/go.test/test/named1.go19
-rw-r--r--gcc/testsuite/go.test/test/nil.go142
-rw-r--r--gcc/testsuite/go.test/test/nilptr.go129
-rw-r--r--gcc/testsuite/go.test/test/nilptr/arrayindex.go27
-rw-r--r--gcc/testsuite/go.test/test/nilptr/arrayindex1.go32
-rw-r--r--gcc/testsuite/go.test/test/nilptr/arraytoslice.go37
-rw-r--r--gcc/testsuite/go.test/test/nilptr/arraytoslice1.go34
-rw-r--r--gcc/testsuite/go.test/test/nilptr/arraytoslice2.go35
-rw-r--r--gcc/testsuite/go.test/test/nilptr/slicearray.go33
-rw-r--r--gcc/testsuite/go.test/test/nilptr/structfield.go35
-rw-r--r--gcc/testsuite/go.test/test/nilptr/structfield1.go38
-rw-r--r--gcc/testsuite/go.test/test/nilptr/structfield2.go37
-rw-r--r--gcc/testsuite/go.test/test/nilptr/structfieldaddr.go35
-rw-r--r--gcc/testsuite/go.test/test/nul1.go7
-rw-r--r--gcc/testsuite/go.test/test/peano.go22
-rw-r--r--gcc/testsuite/go.test/test/printbig.go2
-rw-r--r--gcc/testsuite/go.test/test/printbig.out2
-rw-r--r--gcc/testsuite/go.test/test/range.go4
-rw-r--r--gcc/testsuite/go.test/test/recover2.go8
-rw-r--r--gcc/testsuite/go.test/test/recover3.go19
-rw-r--r--gcc/testsuite/go.test/test/rename1.go2
-rw-r--r--gcc/testsuite/go.test/test/reorder.go121
-rwxr-xr-xgcc/testsuite/go.test/test/run56
-rwxr-xr-xgcc/testsuite/go.test/test/run-arm102
-rw-r--r--gcc/testsuite/go.test/test/rune.go44
-rw-r--r--gcc/testsuite/go.test/test/shift1.go36
-rw-r--r--gcc/testsuite/go.test/test/shift2.go42
-rw-r--r--gcc/testsuite/go.test/test/sigchld.go4
-rw-r--r--gcc/testsuite/go.test/test/sigchld.out1
-rw-r--r--gcc/testsuite/go.test/test/sinit.go219
-rw-r--r--gcc/testsuite/go.test/test/sizeof.go23
-rw-r--r--gcc/testsuite/go.test/test/solitaire.go7
-rw-r--r--gcc/testsuite/go.test/test/stack.go27
-rw-r--r--gcc/testsuite/go.test/test/string_lit.go22
-rw-r--r--gcc/testsuite/go.test/test/stringrange.go15
-rw-r--r--gcc/testsuite/go.test/test/struct0.go34
-rw-r--r--gcc/testsuite/go.test/test/switch.go281
-rw-r--r--gcc/testsuite/go.test/test/switch3.go58
-rw-r--r--gcc/testsuite/go.test/test/syntax/chan.go17
-rw-r--r--gcc/testsuite/go.test/test/syntax/chan1.go17
-rw-r--r--gcc/testsuite/go.test/test/syntax/else.go12
-rw-r--r--gcc/testsuite/go.test/test/syntax/if.go18
-rw-r--r--gcc/testsuite/go.test/test/syntax/typesw.go13
-rw-r--r--gcc/testsuite/go.test/test/times.out632
-rw-r--r--gcc/testsuite/go.test/test/turing.go53
-rw-r--r--gcc/testsuite/go.test/test/typeswitch.go5
-rw-r--r--gcc/testsuite/go.test/test/typeswitch2.go22
-rw-r--r--gcc/testsuite/go.test/test/typeswitch3.go20
-rw-r--r--gcc/testsuite/go.test/test/utf.go32
-rw-r--r--gcc/testsuite/go.test/test/vectors.go64
-rw-r--r--gcc/testsuite/go.test/test/zerodivide.go11
427 files changed, 14228 insertions, 3350 deletions
diff --git a/gcc/testsuite/go.test/go-test.exp b/gcc/testsuite/go.test/go-test.exp
index 19cc0dfc4d..943a7f1a1a 100644
--- a/gcc/testsuite/go.test/go-test.exp
+++ b/gcc/testsuite/go.test/go-test.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
# Written by Ian Lance Taylor <iant@google.com>.
# This program is free software; you can redistribute it and/or modify
@@ -33,9 +33,42 @@
load_lib go-dg.exp
load_lib go-torture.exp
+load_lib target-supports.exp
+
+# Compare two files
+proc filecmp { file1 file2 testname } {
+ set f1 [open $file1 r]
+ set f2 [open $file2 r]
+ set ok 1
+ while { [gets $f1 line1] >= 0 } {
+ if { [gets $f2 line2] < 0 } {
+ verbose -log "output mismatch: $file2 shorter than $file1"
+ set ok 0
+ break
+ }
+ if { $line1 != $line2 } {
+ verbose -log "output mismatch comparing $file1 and $file2"
+ verbose -log "expected \"$line1\""
+ verbose -log "got \"$line2\""
+ set ok 0
+ break
+ }
+ }
+ if { [gets $f2 line2] >= 0 } {
+ verbose -log "output mismatch: $file1 shorter than $file2"
+ set ok 0
+ }
+ close $f1
+ close $f2
+ if { ! $ok } {
+ fail $testname
+ } else {
+ pass $testname
+ }
+}
# Implement errchk
-proc errchk { test } {
+proc errchk { test opts } {
global dg-do-what-default
global DEFAULT_GOCFLAGS
global runtests
@@ -51,23 +84,49 @@ proc errchk { test } {
set fdout [open $filename w]
fconfigure $fdout -encoding binary
while { [gets $fdin copy_line] >= 0 } {
+ if [string match "*////*" $copy_line] {
+ puts $fdout $copy_line
+ continue
+ }
regsub "// \(GCCGO_\)?ERROR \"\(\[^\"\]*\)\".*$" $copy_line "// \{ dg-error \"\\2\" \}" out_line
+ if [string match "*dg-error*\\\[*" $out_line] {
+ set index [string first "dg-error" $out_line]
+ regsub -start $index -all "\\\\\\\[" $out_line "\\\\\\\\\\\[" out_line
+ }
+ if [string match "*dg-error*\\\]*" $out_line] {
+ set index [string first "dg-error" $out_line]
+ regsub -start $index -all "\\\\\\\]" $out_line "\\\\\\\\\\\]" out_line
+ }
if [string match "*dg-error*.\**" $out_line] {
# I worked out the right number of backslashes by
# experimentation, not analysis.
regsub -all "\\.\\*" $out_line "\\\\\[ -~\\\\\]*" out_line
}
+ if [string match "*dg-error*\\\[?\\\]*" $out_line] {
+ set index [string first "dg-error" $out_line]
+ regsub -all "\\\[\(.\)\\\]" $out_line "\\\\\[\\1\\\\\]" out_line
+ }
if [string match "*dg-error*\{*" $out_line] {
set index [string first "dg-error" $out_line]
- regsub -start $index -all "\{" $out_line "\\\\\[\\\{\\\\\]" out_line
+ regsub -start $index -all "\(\[^\\\\]\)\{" $out_line "\\1\\\\\[\\\{\\\\\]" out_line
}
if [string match "*dg-error*\}*\}" $out_line] {
set index [string first "dg-error" $out_line]
- regsub -start $index -all "\}\(.\)" $out_line "\\\\\[\\\}\\\\\]\\1" out_line
+ regsub -start $index -all "\(\[^\\\\]\)\}\(.\)" $out_line "\\1\\\\\[\\\}\\\\\]\\2" out_line
+ }
+ if [string match "*dg-error*\(*" $out_line] {
+ set index [string first "dg-error" $out_line]
+ regsub -start $index -all "\\\\\\\(" $out_line "\\\\\[\\\(\\\\\]" out_line
}
- if [string match "*dg-error*\[.\]*" $out_line] {
+ if [string match "*dg-error*\)*\}" $out_line] {
set index [string first "dg-error" $out_line]
- regsub -all "\\\[\\.\\\]" $out_line "\\\\\[.\\\\\]" out_line
+ regsub -start $index -all "\\\\\\\)\(.\)" $out_line "\\\\\[\\\)\\\\\]\\1" out_line
+ }
+ # Special case for bug332, in which the error message wants to
+ # match the file name, which is not what dg-error expects.
+ if [string match "*dg-error*bug332*" $out_line] {
+ set index [string first "dg-error" $out_line]
+ regsub -start $index "bug332" $out_line "undefined type" out_line
}
puts $fdout $out_line
}
@@ -76,7 +135,7 @@ proc errchk { test } {
set hold_runtests $runtests
set runtests "go-test.exp"
- go-dg-runtest $filename "-fno-show-column $DEFAULT_GOCFLAGS"
+ go-dg-runtest $filename "-fno-show-column $DEFAULT_GOCFLAGS $opts"
set runtests $hold_runtests
file delete $filename
@@ -111,6 +170,9 @@ proc go-set-goarch { } {
global target_triplet
switch -glob $target_triplet {
+ "alpha*-*-*" {
+ set goarch "alpha"
+ }
"arm*-*-*" -
"ep9312*-*-*" -
"strongarm*-*-*" -
@@ -119,17 +181,54 @@ proc go-set-goarch { } {
}
"i?86-*-*" -
"x86_64-*-*" {
- if [check_effective_target_ilp32] {
+ if [check_effective_target_ia32] {
set goarch "386"
} else {
set goarch "amd64"
}
}
+ "mips*-*-*" {
+ if [check_no_compiler_messages mipso32 assembly {
+ #if _MIPS_SIM != _ABIO32
+ #error FOO
+ #endif
+ }] {
+ set goarch "mipso32"
+ } elseif [check_no_compiler_messages mipsn32 assembly {
+ #if _MIPS_SIM != _ABIN32
+ #error FOO
+ #endif
+ }] {
+ set goarch "mipsn32"
+ } elseif [check_no_compiler_messages mipsn64 assembly {
+ #if _MIPS_SIM != _ABI64
+ #error FOO
+ #endif
+ }] {
+ set goarch "mipsn64"
+ } elseif [check_no_compiler_messages mipso64 assembly {
+ #if _MIPS_SIM != _ABIO64
+ #error FOO
+ #endif
+ }] {
+ set goarch "mipso64"
+ } else {
+ perror "$target_triplet: unrecognized MIPS ABI"
+ return ""
+ }
+ }
+ "powerpc*-*-*" {
+ if [check_effective_target_ilp32] {
+ set goarch "ppc"
+ } else {
+ set goarch "ppc64"
+ }
+ }
"sparc*-*-*" {
if [check_effective_target_ilp32] {
set goarch "sparc"
} else {
- set goarch "sparcv9"
+ set goarch "sparc64"
}
}
default {
@@ -148,6 +247,7 @@ proc go-gc-tests { } {
global TOOL_OPTIONS
global TORTURE_OPTIONS
global dg-do-what-default
+ global go_compile_args
global go_execute_args
global target_triplet
@@ -157,6 +257,9 @@ proc go-gc-tests { } {
set DEFAULT_GOCFLAGS " -pedantic-errors"
}
+ set options ""
+ lappend options "additional_flags=$DEFAULT_GOCFLAGS"
+
# Set GOARCH for tests that need it.
go-set-goarch
@@ -176,13 +279,10 @@ proc go-gc-tests { } {
continue
}
- # Skip the files in bench and garbage; they are not tests.
+ # Skip the files in bench; they are not tests.
if [string match "*go.test/test/bench/*" $test] {
continue
}
- if [string match "*go.test/test/garbage/*" $test] {
- continue
- }
# Skip files in sub-subdirectories: they are components of
# other tests.
@@ -194,25 +294,59 @@ proc go-gc-tests { } {
# Skip certain tests if target is RTEMS OS.
if [istarget "*-*-rtems*"] {
- if { [string match "*go.test/test/args.go" \
- $test] \
- || [string match "*go.test/test/env.go" \
- $test] } {
+ if { [string match "*go.test/test/args.go" $test] \
+ || [string match "*go.test/test/env.go" $test] } {
untested "$name: uses the command-line or environment variables"
continue
}
- if { [string match "*go.test/test/stack.go" \
- $test] \
- || [string match "*go.test/test/peano.go" \
- $test] \
- || [string match "*go.test/test/chan/goroutines.go" \
- $test] } {
+ if { [string match "*go.test/test/stack.go" $test] \
+ || [string match "*go.test/test/peano.go" $test] \
+ || [string match "*go.test/test/chan/goroutines.go" $test] } {
untested "$name: has very high memory requirement"
continue
}
}
+ # Handle certain tests in a target-dependant way.
+ if { [istarget "alpha*-*-*"] || [istarget "sparc*-*-solaris*"] || [istarget "powerpc*-*-*"] } {
+ if { [string match "*go.test/test/nilptr.go" $test] } {
+ untested $test
+ continue
+ }
+ }
+
+ if { [string match "*bug347*" $test] \
+ || [string match "*bug348*" $test] } {
+ # These bugs rely on runtime.Caller which currently fails.
+ untested $name
+ continue
+ }
+
+ if { [file tail $test] == "init1.go" } {
+ # This tests whether GC runs during init, which for gccgo
+ # it currently does not.
+ untested $name
+ continue
+ }
+
+ if { [file tail $test] == "closure.go" } {
+ # This tests whether function closures do any memory
+ # allocation, which for gccgo they currently do.
+ untested $name
+ continue
+ }
+
+ if { ( [file tail $test] == "select2.go" \
+ || [file tail $test] == "stack.go" ) \
+ && ! [check_effective_target_split_stack] } {
+ # chan/select2.go fails on targets without split stack,
+ # because they allocate a large stack segment that blows
+ # out the memory calculations.
+ untested $name
+ continue
+ }
+
set fd [open $test r]
set lines_ok 1
@@ -229,7 +363,8 @@ proc go-gc-tests { } {
if { [ string match "*nacl*exit 0*" $test_line ] \
|| [ string match "*exit 0*nacl*" $test_line ] \
|| [ string match "*Android*exit 0*" $test_line ] \
- || [ string match "*exit 0*Android*" $test_line ] } {
+ || [ string match "*exit 0*Android*" $test_line ] \
+ || [ string match "*\"\$GOOS\" == windows*" $test_line ] } {
continue
}
@@ -259,8 +394,9 @@ proc go-gc-tests { } {
close $fd
+ set go_compile_args ""
set go_execute_args ""
- if { [regexp ".*\\\$A.out (\[^|&>\].*)\$" $test_line match progargs] } {
+ if { [regexp ".*\\\$A.out (\[^|&>2\].*)\$" $test_line match progargs] } {
set go_execute_args $progargs
verbose -log "$test: go_execute_args is $go_execute_args"
set index [string last " $progargs" $test_line]
@@ -304,7 +440,12 @@ proc go-gc-tests { } {
} else {
pass "$name execution"
file delete $base-out.x
+ # Disable optimizations as this test takes a long time
+ # to compile.
+ set hold $TORTURE_OPTIONS
+ set TORTURE_OPTIONS [ list { -O0 -g }]
go-torture-execute "./$base-out.go"
+ set TORTURE_OPTIONS $hold
}
file delete $base-out.go
}
@@ -332,21 +473,55 @@ proc go-gc-tests { } {
# This is a vanilla execution test.
go-torture-execute $test
file delete core [glob -nocomplain core.*]
+ } elseif { $test_line == "// \$G \$D/\$F.go && \$L \$F.\$A && ./\$A.out 2>&1 | cmp - \$D/\$F.out" \
+ || $test_line == "// \$G \$F.go && \$L \$F.\$A && ./\$A.out 2>&1 | cmp - \$D/\$F.out" \
+ || $test_line == "// (\$G \$D/\$F.go && \$L \$F.\$A && ./\$A.out 2>&1 | cmp - \$D/\$F.out)" } {
+ # This is an execution test for which we need to check the
+ # program output.
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "link"
+ dg-test -keep-output $test "-O" "-w $DEFAULT_GOCFLAGS"
+ set output_file "./[file rootname [file tail $test]].exe"
+ set base "[file rootname [file tail $test]]"
+ if [isnative] {
+ verbose -log "$output_file >$base.p 2>&1"
+ if { [catch "exec $output_file 2>$base.p" catcherr] != 0 } {
+ verbose -log $catcherr
+ fail "$name execution"
+ untested "$name compare"
+ } else {
+ pass "$name execution"
+ regsub "\\.go$" $test ".out" expect
+ filecmp $expect $base.p "$name compare"
+ }
+ #file delete $base.p
+ } else {
+ untested "$name execution"
+ untested "$name compare"
+ }
+ set runtests $hold_runtests
} elseif { [string match \
"// \$G \$D/\$F.go && \$L \$F.\$A || echo BUG*" \
$test_line] \
|| [string match "// \$G \$F.go && \$L \$F.\$A #*" \
- $test_line] } {
+ $test_line]
+ || $test_line == "// \$G \$D/\$F.go && \$L \$F.\$A" } {
# This is a vanilla compile and link test.
set dg-do-what-default "link"
go-dg-runtest $test "-w $DEFAULT_GOCFLAGS"
} elseif { [string match "// \$G \$D/\$F.go" $test_line] \
|| [string match "// \$G \$D/\$F.go || echo BUG*" \
$test_line] \
+ || [string match "// \$G \$D/\$F.go || echo \"Bug*" \
+ $test_line] \
+ || [string match "// \$G \$D/\$F.go || echo \"Issue*" \
+ $test_line] \
|| [string match "// \$G \$F.go || echo BUG*" \
$test_line] \
|| [string match "// ! \$G \$D/\$F.go && echo BUG*" \
- $test_line] } {
+ $test_line] \
+ || $test_line == "// echo bug395 is broken # takes 90+ seconds to break" } {
# This is a vanilla compile test.
set dg-do-what-default "assemble"
go-dg-runtest $test "-w $DEFAULT_GOCFLAGS"
@@ -387,16 +562,30 @@ proc go-gc-tests { } {
$test_line] \
|| [string match "// errchk \$G \$D/\$F.go || echo BUG*" \
$test_line] } {
- errchk $test
+ errchk $test ""
} elseif { [string match \
"// \$G \$D/\$F.dir/bug0.go && \$G \$D/\$F.dir/bug1.go || echo BUG*" \
- $test_line] } {
+ $test_line] \
+ || [string match \
+ "// \$G \$D/\$F.dir/one.go && \$G \$D/\$F.dir/two.go" \
+ $test_line] } {
+ if { [string match \
+ "// \$G \$D/\$F.dir/bug0.go && \$G \$D/\$F.dir/bug1.go || echo BUG*" \
+ $test_line] } {
+ set name1 "bug0.go"
+ set name2 "bug1.go"
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/one.go && \$G \$D/\$F.dir/two.go" \
+ $test_line] } {
+ set name1 "one.go"
+ set name2 "two.go"
+ }
set hold_runtests $runtests
set runtests "go-test.exp"
set dg-do-what-default "assemble"
- regsub "\\.go$" $test ".dir/bug0.go" file1
+ regsub "\\.go$" $test ".dir/$name1" file1
dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
- regsub "\\.go$" $test ".dir/bug1.go" file2
+ regsub "\\.go$" $test ".dir/$name2" file2
dg-test $file2 "-O" "-w $DEFAULT_GOCFLAGS"
file delete "[file rootname [file tail $file1]].o"
set runtests $hold_runtests
@@ -405,15 +594,33 @@ proc go-gc-tests { } {
$test_line] \
|| [string match \
"// \$G \$D/\$F.dir/p1.go && \$G \$D/\$F.dir/p2.go" \
+ $test_line] \
+ || [string match \
+ "// \$G \$D/\$F.dir/b.go && \$G \$D/\$F.dir/a.go" \
+ $test_line] \
+ || [string match \
+ "// \$G \$D/\$F.dir/io.go && errchk \$G -e \$D/\$F.dir/main.go" \
$test_line] } {
if { [string match \
- "// \$G \$D/\$F.dir/p1.go && \$G \$D/\$F.dir/p2.go" \
+ "// \$G \$D/\$F.dir/bug0.go && errchk \$G \$D/\$F.dir/bug1.go" \
$test_line] } {
- set name1 "p1.go"
- set name2 "p2.go"
- } else {
set name1 "bug0.go"
set name2 "bug1.go"
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/p1.go && \$G \$D/\$F.dir/p2.go" \
+ $test_line] } {
+ set name1 "p1.go"
+ set name2 "p2.go"
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/b.go && \$G \$D/\$F.dir/a.go" \
+ $test_line] } {
+ set name1 "b.go"
+ set name2 "a.go"
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/io.go && errchk \$G -e \$D/\$F.dir/main.go" \
+ $test_line] } {
+ set name1 "io.go"
+ set name2 "main.go"
}
set hold_runtests $runtests
set runtests "go-test.exp"
@@ -421,7 +628,18 @@ proc go-gc-tests { } {
regsub "\\.go$" $test ".dir/$name1" file1
dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
regsub "\\.go$" $test ".dir/$name2" file2
- errchk $file2
+ errchk $file2 ""
+ file delete "[file rootname [file tail $file1]].o"
+ set runtests $hold_runtests
+ } elseif { [string match \
+ "// \$G \$D/\${F}1.go && errchk \$G \$D/\$F.go" \
+ $test_line ] } {
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "assemble"
+ regsub "\\.go$" $test "1.go" file1
+ dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
+ errchk $test ""
file delete "[file rootname [file tail $file1]].o"
set runtests $hold_runtests
} elseif { [string match \
@@ -464,26 +682,40 @@ proc go-gc-tests { } {
regsub "\\.go$" $test ".dir/bug1.go" file2
dg-test -keep-output $file2 "-O" "-w $DEFAULT_GOCFLAGS"
regsub "\\.go$" $test ".dir/bug2.go" file3
- errchk $file3
+ errchk $file3 ""
file delete "[file rootname [file tail $file1]].o"
file delete "[file rootname [file tail $file2]].o"
set runtests $hold_runtests
} elseif { [string match \
"// \$G \$D/bug160.dir/x.go && \$G \$D/bug160.dir/y.go && \$L y.\$A && ./\$A.out" \
- $test_line] } {
+ $test_line] \
+ || [string match \
+ "// \$G \$D/\$F.dir/p.go && \$G \$D/\$F.dir/main.go && \$L main.\$A && ./\$A.out" \
+ $test_line] } {
+ if { [string match \
+ "// \$G \$D/bug160.dir/x.go && \$G \$D/bug160.dir/y.go && \$L y.\$A && ./\$A.out" \
+ $test_line] } {
+ set name1 "x.go"
+ set name2 "y.go"
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/p.go && \$G \$D/\$F.dir/main.go && \$L main.\$A && ./\$A.out" \
+ $test_line] } {
+ set name1 "p.go"
+ set name2 "main.go"
+ }
set hold_runtests $runtests
set runtests "go-test.exp"
set dg-do-what-default "assemble"
- regsub "\\.go$" $test ".dir/x.go" file1
+ regsub "\\.go$" $test ".dir/$name1" file1
dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
set ofile1 "[file rootname [file tail $file1]].o"
- regsub "\\.go$" $test ".dir/y.go" file2
+ regsub "\\.go$" $test ".dir/$name2" file2
dg-test -keep-output $file2 "-O" "-w $DEFAULT_GOCFLAGS"
set ofile2 "[file rootname [file tail $file2]].o"
set dg-do-what-default "link"
set output_file "./[file rootname [file tail $test]].exe"
set comp_output [go_target_compile "$ofile1 $ofile2" \
- $output_file "executable" "$DEFAULT_GOCFLAGS"]
+ $output_file "executable" "$options"]
set comp_output [go-dg-prune $target_triplet $comp_output]
verbose -log $comp_output
set result [go_load "$output_file" "" ""]
@@ -508,7 +740,7 @@ proc go-gc-tests { } {
set dg-do-what-default "link"
set output_file "./[file rootname [file tail $test]].exe"
set comp_output [go_target_compile "$ofile1 $ofile2 $ofile3" \
- $output_file "executable" "$DEFAULT_GOCFLAGS"]
+ $output_file "executable" "$options"]
set comp_output [go-dg-prune $target_triplet $comp_output]
if [string match "" $comp_output] {
pass $name
@@ -531,7 +763,48 @@ proc go-gc-tests { } {
set ofile2 "[file rootname [file tail $test]].o"
set output_file "./[file rootname [file tail $test]].exe"
set comp_output [go_target_compile "$ofile1 $ofile2" \
- $output_file "executable" "$DEFAULT_GOCFLAGS"]
+ $output_file "executable" "$options"]
+ set comp_output [go-dg-prune $target_triplet $comp_output]
+ if [string match "" $comp_output] {
+ set result [go_load "$output_file" "" ""]
+ set status [lindex $result 0]
+ $status $name
+ } else {
+ verbose -log $comp_output
+ fail $name
+ }
+ file delete $ofile1 $ofile2 $output_file
+ set runtests $hold_runtests
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/lib.go && \$G \$D/\$F.dir/main.go && \$L main.\$A && ./\$A.out || echo BUG*" \
+ $test_line ] || \
+ [string match \
+ "// \$G \$D/\$F.dir/p.go && \$G \$D/\$F.dir/main.go && \$L main.\$A && ./\$A.out || echo BUG*" \
+ $test_line ] } {
+ if { [string match \
+ "// \$G \$D/\$F.dir/lib.go && \$G \$D/\$F.dir/main.go && \$L main.\$A && ./\$A.out || echo BUG*" \
+ $test_line ] } {
+ set name1 "lib.go"
+ set name2 "main.go"
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/p.go && \$G \$D/\$F.dir/main.go && \$L main.\$A && ./\$A.out || echo BUG*" \
+ $test_line ] } {
+ set name1 "p.go"
+ set name2 "main.go"
+ }
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "assemble"
+ regsub "\\.go$" $test ".dir/$name1" file1
+ dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
+ set ofile1 "[file rootname [file tail $file1]].o"
+ regsub "\\.go$" $test ".dir/$name2" file2
+ dg-test -keep-output $file2 "-O" "-w $DEFAULT_GOCFLAGS"
+ set ofile2 "[file rootname [file tail $file2]].o"
+ set dg-do-what-default "link"
+ set output_file "./[file rootname [file tail $file2]].exe"
+ set comp_output [go_target_compile "$ofile1 $ofile2" \
+ $output_file "executable" "$options"]
set comp_output [go-dg-prune $target_triplet $comp_output]
if [string match "" $comp_output] {
set result [go_load "$output_file" "" ""]
@@ -570,10 +843,10 @@ proc go-gc-tests { } {
regsub "\\.go$" $test ".dir/x.go" file1
dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
regsub "\\.go$" $test ".dir/y.go" file2
- errchk $file2
+ errchk $file2 ""
file delete "[file rootname [file tail $file1]].o"
set runtests $hold_runtests
- } elseif { [string match "// true*" $test_line] } {
+ } elseif { "$test_line" == "" || [string match "// true*" $test_line] } {
# Not a real test, just ignore.
} elseif { $test_line == "// \$G \$D/\$F.dir/bug0.go &&" \
&& $test_line2 == "// \$G \$D/\$F.dir/bug1.go &&" \
@@ -594,10 +867,10 @@ proc go-gc-tests { } {
dg-test -keep-output $file2 "-O" "-w $DEFAULT_GOCFLAGS"
set ofile2 "[file rootname [file tail $file2]].o"
regsub "\\.go$" $test ".dir/bug3.go" file3
- errchk $file3
+ errchk $file3 ""
set output_file "./[file rootname [file tail $test]].exe"
set comp_output [go_target_compile "$ofile0 $ofile1 $ofile2" \
- $output_file "executable" "$DEFAULT_GOCFLAGS"]
+ $output_file "executable" "$options"]
set comp-output [go-dg-prune $target_triplet $comp_output]
if [string match "" $comp_output] {
set result [go_load "$output_file" "" ""]
@@ -609,11 +882,17 @@ proc go-gc-tests { } {
}
file delete $ofile0 $ofile1 $ofile2 $output_file
set runtests $hold_runtests
- } elseif { $test_line == "// \$G \$D/import2.go && \$G \$D/\$F\.go" } {
+ } elseif { $test_line == "// \$G \$D/import2.go && \$G \$D/\$F\.go" \
+ || $test_line == "// \$G \$D/recursive1.go && \$G \$D/\$F.go" } {
+ if { $test_line == "// \$G \$D/import2.go && \$G \$D/\$F\.go" } {
+ set name1 "import2.go"
+ } elseif { $test_line == "// \$G \$D/recursive1.go && \$G \$D/\$F.go" } {
+ set name1 "recursive1.go"
+ }
set hold_runtests $runtests
set runtests "go-test.exp"
set dg-do-what-default "assemble"
- regsub "/\[^/\]*$" $test "/import2.go" file1
+ regsub "/\[^/\]*$" $test "/${name1}" file1
dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
set ofile1 "[file rootname [file tail $file1]].o"
dg-test $test "-O" "-w $DEFAULT_GOCFLAGS"
@@ -630,7 +909,7 @@ proc go-gc-tests { } {
set ofile2 "[file rootname [file tail $test]].o"
set output_file "./[file rootname [file tail $test]].exe"
set comp_output [go_target_compile "$ofile1 $ofile2" \
- $output_file "executable" "$DEFAULT_GOCFLAGS"]
+ $output_file "executable" "$options"]
set comp_output [go-dg-prune $target_triplet $comp_output]
if [string match "" $comp_output] {
set result [go_load "$output_file" "" ""]
@@ -646,7 +925,7 @@ proc go-gc-tests { } {
regsub "/\[^/\]*$" $test "/cmplxdivide1.go" test2
set output_file "./[file rootname [file tail $test]].o"
set comp_output [go_target_compile "$test $test2" \
- $output_file "executable" "$DEFAULT_GOCFLAGS"]
+ $output_file "executable" "$options"]
set comp_output [go-dg-prune $target_triplet $comp_output]
if [string match "" $comp_output] {
set result [go_load "$output_file" "" ""]
@@ -658,7 +937,7 @@ proc go-gc-tests { } {
}
file delete $output_file
} elseif { $test_line == "// \$G \$D/\$F.go && \$L \$F.\$A &&" \
- && $test_line2 == "// ./\$A.out -pass 0 >tmp.go && \$G tmp.go && \$L -o tmp1.\$A tmp.\$A && ./tmp1.\$A &&" \
+ && $test_line2 == "// ./\$A.out -pass 0 >tmp.go && \$G tmp.go && \$L -o \$A.out1 tmp.\$A && ./\$A.out1 &&" \
&& $test_line3 == "// ./\$A.out -pass 1 >tmp.go && errchk \$G -e tmp.go &&" \
&& $test_line4 == "// ./\$A.out -pass 2 >tmp.go && errchk \$G -e tmp.go" } {
set go_execute_args ""
@@ -673,19 +952,24 @@ proc go-gc-tests { } {
} else {
pass "$name execution 0"
file delete tmp.x
+ # Disable optimizations as this test takes a long time
+ # to compile.
+ set hold $TORTURE_OPTIONS
+ set TORTURE_OPTIONS [ list { -O0 -g }]
go-torture-execute "./tmp.go"
+ set TORTURE_OPTIONS $hold
}
if { [catch "exec $output_file -pass 1 >tmp.go"] != 0 } {
fail "$name execution 1"
} else {
pass "$name execution 1"
- errchk tmp.go
+ errchk tmp.go ""
}
if { [catch "exec $output_file -pass 2 >tmp.go"] != 0 } {
fail "$name execution 2"
} else {
pass "$name execution 2"
- errchk tmp.go
+ errchk tmp.go ""
}
file delete tmp.go
}
@@ -705,8 +989,129 @@ proc go-gc-tests { } {
} else {
pass "$name execution"
file delete tmp.x
- errchk tmp.go
+ errchk tmp.go ""
+ }
+ }
+ file delete $output_file
+ set runtests $hold_runtests
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/p.go && \$G \$D/\$F.dir/main.go && \$L main.\$A && ! ./\$A.out || echo BUG*" \
+ $test_line] } {
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "assemble"
+ regsub "\\.go$" $test ".dir/p.go" file1
+ dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
+ set ofile1 "[file rootname [file tail $file1]].o"
+ regsub "\\.go$" $test ".dir/main.go" file2
+ dg-test -keep-output $file2 "-O" "-w $DEFAULT_GOCFLAGS"
+ set ofile2 "[file rootname [file tail $file2]].o"
+ set output_file "./[file rootname [file tail $test]].exe"
+ set comp_output [go_target_compile "$ofile1 $ofile2" \
+ $output_file "executable" "$options"]
+ set comp_output [go-dg-prune $target_triplet $comp_output]
+ if [string match "" $comp_output] {
+ setup_xfail "*-*-*"
+ set result [go_load "$output_file" "" ""]
+ set status [lindex $result 0]
+ $status $name
+ } else {
+ verbose -log $comp_output
+ fail $name
+ }
+ file delete $ofile1 $ofile2 $output_file
+ set runtests $hold_runtests
+ } elseif { $test_line == "// \$G \$D/\$F.go && \$L \$F.\$A && ./\$A.out >tmp.go &&"
+ && $test_line2 == "// \$G tmp.go && \$L tmp.\$A && ./\$A.out || echo BUG: select5" } {
+ set go_execute_args ""
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "link"
+ dg-test -keep-output $test "-O" "-w $DEFAULT_GOCFLAGS"
+ set output_file "./[file rootname [file tail $test]].exe"
+ set base "[file rootname [file tail $test]]"
+ if [isnative] {
+ if { [catch "exec $output_file > $base-out.go"] != 0 } {
+ fail "$name execution"
+ } else {
+ pass "$name execution"
+ file delete $base-out.x
+ # Disable optimizations as this test takes a long time
+ # to compile.
+ set hold $TORTURE_OPTIONS
+ set TORTURE_OPTIONS [ list { -O0 -g }]
+ go-torture-execute "./$base-out.go"
+ set TORTURE_OPTIONS $hold
}
+ file delete $base-out.go
+ }
+ file delete $output_file
+ set runtests $hold_runtests
+ } elseif { $test_line == "// errchk \$G -e \$D/\$F.dir/\[ab\].go" } {
+ regsub "\\.go$" $test ".dir/a.go" file1
+ regsub "\\.go$" $test ".dir/b.go" file2
+ errchk "$file1" "$file2"
+ } elseif { $test_line == "// \$G \$D/\$F.go \$D/z*.go && \$L \$F.\$A && ./\$A.out" } {
+ set dir [file dirname $test]
+ set go_compile_args [glob $dir/z*.go]
+ go-torture-execute $test
+ } elseif { $test_line == "// \$G -N -o slow.\$A \$D/bug369.dir/pkg.go &&" \
+ && $test_line2 == "// \$G -o fast.\$A \$D/bug369.dir/pkg.go &&" \
+ && $test_line3 == "// \$G \$D/\$F.go && \$L \$F.\$A && ./\$A.out" } {
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "assemble"
+ regsub "\\.go$" $test ".dir/pkg.go" file1
+ dg-test -keep-output $file1 "" "-fgo-prefix=slow -w $DEFAULT_GOCFLAGS"
+ set ofile1 "[file rootname [file tail $file1]].o"
+ file rename -force $ofile1 slow.o
+ dg-test -keep-output $file1 "-O2" "-fgo-prefix=fast -w $DEFAULT_GOCFLAGS"
+ file rename -force $ofile1 fast.o
+ set ofile2 "[file rootname [file tail $test]].o"
+ dg-test -keep-output $test "-O" "-w $DEFAULT_GOCFLAGS"
+ set output_file "./[file rootname [file tail $test]].exe"
+ set comp_output [go_target_compile "$ofile2 slow.o fast.o" \
+ $output_file "executable" "$options"]
+ set comp_output [go-dg-prune $target_triplet $comp_output]
+ if [string match "" $comp_output] {
+ set result [go_load "$output_file" "" ""]
+ set status [lindex $result 0]
+ $status $name
+ } else {
+ verbose -log $comp_output
+ fail $name
+ }
+ file delete slow.o fast.o $ofile2 $output_file
+ set runtests $hold_runtests
+ } elseif { [string match \
+ "// \$G \$D/\$F.dir/pkg.go && \$G \$D/\$F.go || echo *" \
+ $test_line ] } {
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "assemble"
+ regsub "\\.go$" $test ".dir/pkg.go" file1
+ dg-test -keep-output $file1 "-O" "-w $DEFAULT_GOCFLAGS"
+ dg-test $test "-O" "-w $DEFAULT_GOCFLAGS"
+ file delete "[file rootname [file tail $file1]].o"
+ set runtests $hold_runtests
+ } elseif { $test_line == "// \$G \$D/\$F.go && \$L \$F.\$A && ./\$A.out >tmp.go &&"
+ && $test_line2 == "// \$G tmp.go && \$L tmp.\$A && ./\$A.out" } {
+ set go_execute_args ""
+ set hold_runtests $runtests
+ set runtests "go-test.exp"
+ set dg-do-what-default "link"
+ dg-test -keep-output $test "-O" "-w $DEFAULT_GOCFLAGS"
+ set output_file "./[file rootname [file tail $test]].exe"
+ set base "[file rootname [file tail $test]]"
+ if [isnative] {
+ if { [catch "exec $output_file >$base-out.go"] != 0 } {
+ fail "$name execution"
+ } else {
+ pass "$name execution"
+ file delete $base-out.x
+ go-torture-execute "./$base-out.go"
+ }
+ file delete $base-out.go
}
file delete $output_file
set runtests $hold_runtests
@@ -716,17 +1121,26 @@ proc go-gc-tests { } {
|| $test_line == "// \$G \$D/empty.go && errchk \$G \$D/\$F.go" } {
# These tests import the same package under two different
# names, which gccgo does not support.
- } elseif { $test_line == "// \$G -S \$D/\$F.go | egrep initdone >/dev/null && echo FAIL || true" } {
+ } elseif { $test_line == "// \$G -S \$D/\$F.go | egrep initdone >/dev/null && echo BUG sinit || true" } {
# This tests whether initializers are written out
# statically. gccgo does not provide a way to test that,
# as an initializer will be generated for any code which
# has global variables which need to be registered as GC
# roots.
+ } elseif { $test_line == "// errchk -0 \$G -m -l \$D/\$F.go" } {
+ # This tests debug output of the gc compiler, which is
+ # meaningless for gccgo.
+ } elseif { $test_line == "// \[ \$O == 6 \] || errchk \$G -e \$D/\$F.go" \
+ || $test_line == "// \[ \$O != 6 \] || errchk \$G -e \$D/\$F.go" } {
+ # This tests specific handling of the gc compiler on types
+ # that are too large. It is target specific in a way I
+ # haven't bothered to check for here.
} else {
clone_output "$name: unrecognized test line: $test_line"
unsupported $name
}
+ set go_compile_args ""
set go_execute_args ""
}
diff --git a/gcc/testsuite/go.test/test/alias.go b/gcc/testsuite/go.test/test/alias.go
new file mode 100644
index 0000000000..639a9cabbb
--- /dev/null
+++ b/gcc/testsuite/go.test/test/alias.go
@@ -0,0 +1,32 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+// Test that error messages say what the source file says
+// (uint8 vs byte, int32 vs. rune).
+
+import (
+ "fmt"
+ "unicode/utf8"
+)
+
+func f(byte) {}
+func g(uint8) {}
+
+func main() {
+ var x float64
+ f(x) // ERROR "byte"
+ g(x) // ERROR "uint8"
+
+ // Test across imports.
+
+ var ff fmt.Formatter
+ var fs fmt.State
+ ff.Format(fs, x) // ERROR "rune"
+
+ utf8.RuneStart(x) // ERROR "byte"
+}
diff --git a/gcc/testsuite/go.test/test/alias1.go b/gcc/testsuite/go.test/test/alias1.go
new file mode 100644
index 0000000000..e8ef8a23f9
--- /dev/null
+++ b/gcc/testsuite/go.test/test/alias1.go
@@ -0,0 +1,54 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+// Test that dynamic interface checks treat byte=uint8
+// and rune=int or rune=int32.
+
+func main() {
+ var x interface{}
+
+ x = byte(1)
+ switch x.(type) {
+ case uint8:
+ // ok
+ default:
+ println("byte != uint8")
+ }
+
+ x = uint8(2)
+ switch x.(type) {
+ case byte:
+ // ok
+ default:
+ println("uint8 != byte")
+ }
+
+ rune32 := false
+ x = rune(3)
+ switch x.(type) {
+ case int:
+ // ok
+ case int32:
+ // must be new code
+ rune32 = true
+ default:
+ println("rune != int and rune != int32")
+ }
+
+ if rune32 {
+ x = int32(4)
+ } else {
+ x = int(5)
+ }
+ switch x.(type) {
+ case rune:
+ // ok
+ default:
+ println("int (or int32) != rune")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/append.go b/gcc/testsuite/go.test/test/append.go
new file mode 100644
index 0000000000..e178f46990
--- /dev/null
+++ b/gcc/testsuite/go.test/test/append.go
@@ -0,0 +1,232 @@
+// $G $F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Semi-exhaustive test for append()
+
+package main
+
+import (
+ "fmt"
+ "reflect"
+)
+
+
+func verify(name string, result, expected interface{}) {
+ if !reflect.DeepEqual(result, expected) {
+ panic(name)
+ }
+}
+
+
+func main() {
+ for _, t := range tests {
+ verify(t.name, t.result, t.expected)
+ }
+ verifyStruct()
+ verifyInterface()
+}
+
+
+var tests = []struct {
+ name string
+ result, expected interface{}
+}{
+ {"bool a", append([]bool{}), []bool{}},
+ {"bool b", append([]bool{}, true), []bool{true}},
+ {"bool c", append([]bool{}, true, false, true, true), []bool{true, false, true, true}},
+
+ {"bool d", append([]bool{true, false, true}), []bool{true, false, true}},
+ {"bool e", append([]bool{true, false, true}, false), []bool{true, false, true, false}},
+ {"bool f", append([]bool{true, false, true}, false, false, false), []bool{true, false, true, false, false, false}},
+
+ {"bool g", append([]bool{}, []bool{true}...), []bool{true}},
+ {"bool h", append([]bool{}, []bool{true, false, true, false}...), []bool{true, false, true, false}},
+
+ {"bool i", append([]bool{true, false, true}, []bool{true}...), []bool{true, false, true, true}},
+ {"bool j", append([]bool{true, false, true}, []bool{true, true, true}...), []bool{true, false, true, true, true, true}},
+
+
+ {"byte a", append([]byte{}), []byte{}},
+ {"byte b", append([]byte{}, 0), []byte{0}},
+ {"byte c", append([]byte{}, 0, 1, 2, 3), []byte{0, 1, 2, 3}},
+
+ {"byte d", append([]byte{0, 1, 2}), []byte{0, 1, 2}},
+ {"byte e", append([]byte{0, 1, 2}, 3), []byte{0, 1, 2, 3}},
+ {"byte f", append([]byte{0, 1, 2}, 3, 4, 5), []byte{0, 1, 2, 3, 4, 5}},
+
+ {"byte g", append([]byte{}, []byte{0}...), []byte{0}},
+ {"byte h", append([]byte{}, []byte{0, 1, 2, 3}...), []byte{0, 1, 2, 3}},
+
+ {"byte i", append([]byte{0, 1, 2}, []byte{3}...), []byte{0, 1, 2, 3}},
+ {"byte j", append([]byte{0, 1, 2}, []byte{3, 4, 5}...), []byte{0, 1, 2, 3, 4, 5}},
+
+ {"bytestr a", append([]byte{}, "0"...), []byte("0")},
+ {"bytestr b", append([]byte{}, "0123"...), []byte("0123")},
+
+ {"bytestr c", append([]byte("012"), "3"...), []byte("0123")},
+ {"bytestr d", append([]byte("012"), "345"...), []byte("012345")},
+
+ {"int16 a", append([]int16{}), []int16{}},
+ {"int16 b", append([]int16{}, 0), []int16{0}},
+ {"int16 c", append([]int16{}, 0, 1, 2, 3), []int16{0, 1, 2, 3}},
+
+ {"int16 d", append([]int16{0, 1, 2}), []int16{0, 1, 2}},
+ {"int16 e", append([]int16{0, 1, 2}, 3), []int16{0, 1, 2, 3}},
+ {"int16 f", append([]int16{0, 1, 2}, 3, 4, 5), []int16{0, 1, 2, 3, 4, 5}},
+
+ {"int16 g", append([]int16{}, []int16{0}...), []int16{0}},
+ {"int16 h", append([]int16{}, []int16{0, 1, 2, 3}...), []int16{0, 1, 2, 3}},
+
+ {"int16 i", append([]int16{0, 1, 2}, []int16{3}...), []int16{0, 1, 2, 3}},
+ {"int16 j", append([]int16{0, 1, 2}, []int16{3, 4, 5}...), []int16{0, 1, 2, 3, 4, 5}},
+
+
+ {"uint32 a", append([]uint32{}), []uint32{}},
+ {"uint32 b", append([]uint32{}, 0), []uint32{0}},
+ {"uint32 c", append([]uint32{}, 0, 1, 2, 3), []uint32{0, 1, 2, 3}},
+
+ {"uint32 d", append([]uint32{0, 1, 2}), []uint32{0, 1, 2}},
+ {"uint32 e", append([]uint32{0, 1, 2}, 3), []uint32{0, 1, 2, 3}},
+ {"uint32 f", append([]uint32{0, 1, 2}, 3, 4, 5), []uint32{0, 1, 2, 3, 4, 5}},
+
+ {"uint32 g", append([]uint32{}, []uint32{0}...), []uint32{0}},
+ {"uint32 h", append([]uint32{}, []uint32{0, 1, 2, 3}...), []uint32{0, 1, 2, 3}},
+
+ {"uint32 i", append([]uint32{0, 1, 2}, []uint32{3}...), []uint32{0, 1, 2, 3}},
+ {"uint32 j", append([]uint32{0, 1, 2}, []uint32{3, 4, 5}...), []uint32{0, 1, 2, 3, 4, 5}},
+
+
+ {"float64 a", append([]float64{}), []float64{}},
+ {"float64 b", append([]float64{}, 0), []float64{0}},
+ {"float64 c", append([]float64{}, 0, 1, 2, 3), []float64{0, 1, 2, 3}},
+
+ {"float64 d", append([]float64{0, 1, 2}), []float64{0, 1, 2}},
+ {"float64 e", append([]float64{0, 1, 2}, 3), []float64{0, 1, 2, 3}},
+ {"float64 f", append([]float64{0, 1, 2}, 3, 4, 5), []float64{0, 1, 2, 3, 4, 5}},
+
+ {"float64 g", append([]float64{}, []float64{0}...), []float64{0}},
+ {"float64 h", append([]float64{}, []float64{0, 1, 2, 3}...), []float64{0, 1, 2, 3}},
+
+ {"float64 i", append([]float64{0, 1, 2}, []float64{3}...), []float64{0, 1, 2, 3}},
+ {"float64 j", append([]float64{0, 1, 2}, []float64{3, 4, 5}...), []float64{0, 1, 2, 3, 4, 5}},
+
+
+ {"complex128 a", append([]complex128{}), []complex128{}},
+ {"complex128 b", append([]complex128{}, 0), []complex128{0}},
+ {"complex128 c", append([]complex128{}, 0, 1, 2, 3), []complex128{0, 1, 2, 3}},
+
+ {"complex128 d", append([]complex128{0, 1, 2}), []complex128{0, 1, 2}},
+ {"complex128 e", append([]complex128{0, 1, 2}, 3), []complex128{0, 1, 2, 3}},
+ {"complex128 f", append([]complex128{0, 1, 2}, 3, 4, 5), []complex128{0, 1, 2, 3, 4, 5}},
+
+ {"complex128 g", append([]complex128{}, []complex128{0}...), []complex128{0}},
+ {"complex128 h", append([]complex128{}, []complex128{0, 1, 2, 3}...), []complex128{0, 1, 2, 3}},
+
+ {"complex128 i", append([]complex128{0, 1, 2}, []complex128{3}...), []complex128{0, 1, 2, 3}},
+ {"complex128 j", append([]complex128{0, 1, 2}, []complex128{3, 4, 5}...), []complex128{0, 1, 2, 3, 4, 5}},
+
+
+ {"string a", append([]string{}), []string{}},
+ {"string b", append([]string{}, "0"), []string{"0"}},
+ {"string c", append([]string{}, "0", "1", "2", "3"), []string{"0", "1", "2", "3"}},
+
+ {"string d", append([]string{"0", "1", "2"}), []string{"0", "1", "2"}},
+ {"string e", append([]string{"0", "1", "2"}, "3"), []string{"0", "1", "2", "3"}},
+ {"string f", append([]string{"0", "1", "2"}, "3", "4", "5"), []string{"0", "1", "2", "3", "4", "5"}},
+
+ {"string g", append([]string{}, []string{"0"}...), []string{"0"}},
+ {"string h", append([]string{}, []string{"0", "1", "2", "3"}...), []string{"0", "1", "2", "3"}},
+
+ {"string i", append([]string{"0", "1", "2"}, []string{"3"}...), []string{"0", "1", "2", "3"}},
+ {"string j", append([]string{"0", "1", "2"}, []string{"3", "4", "5"}...), []string{"0", "1", "2", "3", "4", "5"}},
+}
+
+
+func verifyStruct() {
+ type T struct {
+ a, b, c string
+ }
+ type S []T
+ e := make(S, 100)
+ for i := range e {
+ e[i] = T{"foo", fmt.Sprintf("%d", i), "bar"}
+ }
+
+ verify("struct a", append(S{}), S{})
+ verify("struct b", append(S{}, e[0]), e[0:1])
+ verify("struct c", append(S{}, e[0], e[1], e[2]), e[0:3])
+
+ verify("struct d", append(e[0:1]), e[0:1])
+ verify("struct e", append(e[0:1], e[1]), e[0:2])
+ verify("struct f", append(e[0:1], e[1], e[2], e[3]), e[0:4])
+
+ verify("struct g", append(e[0:3]), e[0:3])
+ verify("struct h", append(e[0:3], e[3]), e[0:4])
+ verify("struct i", append(e[0:3], e[3], e[4], e[5], e[6]), e[0:7])
+
+ for i := range e {
+ verify("struct j", append(S{}, e[0:i]...), e[0:i])
+ input := make(S, i)
+ copy(input, e[0:i])
+ verify("struct k", append(input, e[i:]...), e)
+ verify("struct k - input modified", input, e[0:i])
+ }
+
+ s := make(S, 10, 20)
+ r := make(S, len(s)+len(e))
+ for i, x := range e {
+ r[len(s)+i] = x
+ }
+ verify("struct l", append(s), s)
+ verify("struct m", append(s, e...), r)
+}
+
+
+func verifyInterface() {
+ type T interface{}
+ type S []T
+ e := make(S, 100)
+ for i := range e {
+ switch i % 4 {
+ case 0:
+ e[i] = i
+ case 1:
+ e[i] = "foo"
+ case 2:
+ e[i] = fmt.Sprintf("%d", i)
+ case 3:
+ e[i] = float64(i)
+ }
+ }
+
+ verify("interface a", append(S{}), S{})
+ verify("interface b", append(S{}, e[0]), e[0:1])
+ verify("interface c", append(S{}, e[0], e[1], e[2]), e[0:3])
+
+ verify("interface d", append(e[0:1]), e[0:1])
+ verify("interface e", append(e[0:1], e[1]), e[0:2])
+ verify("interface f", append(e[0:1], e[1], e[2], e[3]), e[0:4])
+
+ verify("interface g", append(e[0:3]), e[0:3])
+ verify("interface h", append(e[0:3], e[3]), e[0:4])
+ verify("interface i", append(e[0:3], e[3], e[4], e[5], e[6]), e[0:7])
+
+ for i := range e {
+ verify("interface j", append(S{}, e[0:i]...), e[0:i])
+ input := make(S, i)
+ copy(input, e[0:i])
+ verify("interface k", append(input, e[i:]...), e)
+ verify("interface k - input modified", input, e[0:i])
+ }
+
+ s := make(S, 10, 20)
+ r := make(S, len(s)+len(e))
+ for i, x := range e {
+ r[len(s)+i] = x
+ }
+ verify("interface l", append(s), s)
+ verify("interface m", append(s, e...), r)
+}
diff --git a/gcc/testsuite/go.test/test/arm-pass.txt b/gcc/testsuite/go.test/test/arm-pass.txt
deleted file mode 100644
index 2c7230f100..0000000000
--- a/gcc/testsuite/go.test/test/arm-pass.txt
+++ /dev/null
@@ -1,488 +0,0 @@
-./235.go
-# ./64bit.go # fail, flaky on android build
-./args.go
-./assign.go
-./assign1.go
-./bigalg.go
-./bigmap.go
-./blank.go
-./blank1.go
-./chancap.go
-./char_lit.go
-./char_lit1.go
-./closedchan.go
-./closure.go
-./cmp1.go
-./cmp2.go
-./cmp3.go
-./cmp4.go
-./cmp5.go
-./cmplx.go
-# ./cmplxdivide.go # fail, BUG
-./cmplxdivide1.go
-./complit.go
-./compos.go
-./const.go
-./const1.go
-./const2.go
-./const3.go
-./convert.go
-./convert3.go
-./convlit.go
-./convlit1.go
-./copy.go
-./ddd.go
-./ddd1.go
-./ddd2.go
-./ddd3.go
-./decl.go
-./declbad.go
-./defer.go
-./deferprint.go
-./empty.go
-./env.go
-./escape.go
-./float_lit.go
-./floatcmp.go
-./for.go
-./func.go
-./func1.go
-./func2.go
-./func3.go
-./func4.go
-./func5.go
-./gc.go
-./gc1.go
-./hashmap.go
-./helloworld.go
-./if.go
-./if1.go
-./import.go
-./import1.go
-./import2.go
-./import3.go
-./import4.go
-./indirect.go
-./indirect1.go
-./initcomma.go
-./initialize.go
-./initializerr.go
-./initsyscall.go
-./int_lit.go
-./intcvt.go
-./iota.go
-./literal.go
-./malloc1.go
-# ./mallocfin.go # fail
-./mallocrand.go
-./mallocrep.go
-./mallocrep1.go
-# ./map.go # fail
-./method.go
-./method1.go
-./method2.go
-./method3.go
-./named.go
-./named1.go
-./nil.go
-./nul1.go
-./parentype.go
-./peano.go
-./printbig.go
-./range.go
-./recover.go
-./recover1.go
-./recover2.go
-# ./recover3.go # fail
-./rename.go
-./rename1.go
-./runtime.go
-./sieve.go
-./sigchld.go
-./simassign.go
-./sinit.go
-./stack.go
-./string_lit.go
-./stringrange.go
-./switch.go
-./switch1.go
-./test0.go
-./turing.go
-./typeswitch.go
-./typeswitch1.go
-./typeswitch2.go
-./undef.go
-./utf.go
-./varerr.go
-./varinit.go
-./vectors.go
-./zerodivide.go
-ken/array.go
-ken/chan.go
-ken/chan1.go
-ken/complit.go
-# ken/cplx0.go # output fail
-# ken/cplx1.go # fail
-# ken/cplx2.go # fail
-# ken/cplx3.go # output fail
-# ken/cplx4.go # fail, BUG
-# ken/cplx5.go # output fail
-ken/divconst.go
-ken/divmod.go
-ken/embed.go
-ken/for.go
-ken/interbasic.go
-ken/interfun.go
-ken/intervar.go
-ken/label.go
-ken/litfun.go
-ken/mfunc.go
-ken/modconst.go
-ken/ptrfun.go
-ken/ptrvar.go
-ken/range.go
-ken/rob1.go
-ken/rob2.go
-ken/robfor.go
-ken/robfunc.go
-ken/robif.go
-ken/shift.go
-ken/simparray.go
-ken/simpbool.go
-ken/simpconv.go
-ken/simpfun.go
-ken/simpprint.go
-ken/simpswitch.go
-ken/simpvar.go
-ken/slicearray.go
-ken/sliceslice.go
-ken/string.go
-ken/strvar.go
-chan/doubleselect.go
-chan/fifo.go
-chan/goroutines.go
-chan/nonblock.go
-chan/perm.go
-chan/powser1.go
-chan/powser2.go
-chan/select.go
-chan/select2.go
-# chan/select3.go # fail
-chan/sieve1.go
-chan/sieve2.go
-interface/bigdata.go
-interface/convert.go
-interface/convert1.go
-interface/convert2.go
-interface/embed.go
-interface/embed0.go
-interface/embed1.go
-interface/explicit.go
-interface/fail.go
-interface/fake.go
-interface/pointer.go
-interface/receiver.go
-interface/receiver1.go
-interface/recursive.go
-interface/returntype.go
-interface/struct.go
-nilptr/arrayindex.go
-nilptr/arrayindex1.go
-nilptr/arraytoslice.go
-nilptr/arraytoslice1.go
-nilptr/arraytoslice2.go
-nilptr/slicearray.go
-nilptr/structfield.go
-nilptr/structfield1.go
-nilptr/structfield2.go
-nilptr/structfieldaddr.go
-syntax/forvar.go
-syntax/import.go
-syntax/interface.go
-syntax/semi1.go
-syntax/semi2.go
-syntax/semi3.go
-syntax/semi4.go
-syntax/semi5.go
-syntax/semi6.go
-syntax/semi7.go
-syntax/slice.go
-syntax/topexpr.go
-syntax/vareq.go
-syntax/vareq1.go
-fixedbugs/bug000.go
-fixedbugs/bug001.go
-fixedbugs/bug002.go
-fixedbugs/bug003.go
-fixedbugs/bug004.go
-fixedbugs/bug005.go
-fixedbugs/bug006.go
-fixedbugs/bug007.go
-fixedbugs/bug008.go
-fixedbugs/bug009.go
-fixedbugs/bug010.go
-fixedbugs/bug011.go
-fixedbugs/bug012.go
-fixedbugs/bug013.go
-fixedbugs/bug014.go
-fixedbugs/bug015.go
-fixedbugs/bug016.go
-fixedbugs/bug017.go
-fixedbugs/bug020.go
-fixedbugs/bug021.go
-fixedbugs/bug022.go
-fixedbugs/bug023.go
-fixedbugs/bug024.go
-fixedbugs/bug026.go
-fixedbugs/bug027.go
-fixedbugs/bug028.go
-fixedbugs/bug030.go
-fixedbugs/bug031.go
-fixedbugs/bug035.go
-fixedbugs/bug036.go
-fixedbugs/bug037.go
-fixedbugs/bug038.go
-fixedbugs/bug039.go
-fixedbugs/bug040.go
-fixedbugs/bug045.go
-fixedbugs/bug046.go
-fixedbugs/bug047.go
-fixedbugs/bug048.go
-fixedbugs/bug049.go
-fixedbugs/bug050.go
-fixedbugs/bug051.go
-fixedbugs/bug052.go
-fixedbugs/bug053.go
-fixedbugs/bug054.go
-fixedbugs/bug055.go
-fixedbugs/bug056.go
-fixedbugs/bug057.go
-fixedbugs/bug058.go
-fixedbugs/bug059.go
-fixedbugs/bug060.go
-fixedbugs/bug061.go
-fixedbugs/bug062.go
-fixedbugs/bug063.go
-fixedbugs/bug064.go
-fixedbugs/bug065.go
-fixedbugs/bug066.go
-fixedbugs/bug067.go
-fixedbugs/bug068.go
-fixedbugs/bug069.go
-fixedbugs/bug070.go
-fixedbugs/bug071.go
-fixedbugs/bug072.go
-fixedbugs/bug073.go
-fixedbugs/bug074.go
-fixedbugs/bug075.go
-fixedbugs/bug076.go
-fixedbugs/bug077.go
-fixedbugs/bug078.go
-fixedbugs/bug080.go
-fixedbugs/bug081.go
-fixedbugs/bug082.go
-fixedbugs/bug083.go
-fixedbugs/bug084.go
-fixedbugs/bug085.go
-fixedbugs/bug086.go
-fixedbugs/bug087.go
-fixedbugs/bug088.go
-fixedbugs/bug089.go
-fixedbugs/bug090.go
-fixedbugs/bug091.go
-fixedbugs/bug092.go
-fixedbugs/bug093.go
-fixedbugs/bug094.go
-fixedbugs/bug096.go
-fixedbugs/bug097.go
-fixedbugs/bug098.go
-fixedbugs/bug099.go
-fixedbugs/bug101.go
-fixedbugs/bug102.go
-fixedbugs/bug103.go
-fixedbugs/bug104.go
-fixedbugs/bug106.go
-fixedbugs/bug107.go
-fixedbugs/bug108.go
-fixedbugs/bug109.go
-fixedbugs/bug110.go
-fixedbugs/bug111.go
-fixedbugs/bug112.go
-fixedbugs/bug113.go
-fixedbugs/bug114.go
-fixedbugs/bug115.go
-fixedbugs/bug116.go
-fixedbugs/bug117.go
-fixedbugs/bug118.go
-fixedbugs/bug119.go
-fixedbugs/bug120.go
-fixedbugs/bug121.go
-fixedbugs/bug122.go
-fixedbugs/bug123.go
-fixedbugs/bug126.go
-fixedbugs/bug127.go
-fixedbugs/bug128.go
-fixedbugs/bug129.go
-fixedbugs/bug130.go
-fixedbugs/bug131.go
-fixedbugs/bug132.go
-fixedbugs/bug133.go
-fixedbugs/bug135.go
-fixedbugs/bug136.go
-fixedbugs/bug137.go
-fixedbugs/bug139.go
-fixedbugs/bug140.go
-fixedbugs/bug141.go
-fixedbugs/bug142.go
-fixedbugs/bug143.go
-fixedbugs/bug144.go
-fixedbugs/bug145.go
-fixedbugs/bug146.go
-fixedbugs/bug147.go
-fixedbugs/bug148.go
-fixedbugs/bug149.go
-fixedbugs/bug150.go
-fixedbugs/bug151.go
-fixedbugs/bug152.go
-fixedbugs/bug154.go
-fixedbugs/bug155.go
-fixedbugs/bug156.go
-fixedbugs/bug157.go
-fixedbugs/bug158.go
-fixedbugs/bug159.go
-fixedbugs/bug160.go
-fixedbugs/bug161.go
-fixedbugs/bug163.go
-fixedbugs/bug164.go
-fixedbugs/bug165.go
-fixedbugs/bug167.go
-fixedbugs/bug168.go
-fixedbugs/bug169.go
-fixedbugs/bug170.go
-fixedbugs/bug171.go
-fixedbugs/bug172.go
-fixedbugs/bug173.go
-fixedbugs/bug174.go
-fixedbugs/bug175.go
-fixedbugs/bug176.go
-fixedbugs/bug177.go
-fixedbugs/bug178.go
-fixedbugs/bug179.go
-fixedbugs/bug180.go
-fixedbugs/bug181.go
-fixedbugs/bug182.go
-fixedbugs/bug183.go
-fixedbugs/bug184.go
-fixedbugs/bug185.go
-fixedbugs/bug186.go
-fixedbugs/bug187.go
-fixedbugs/bug188.go
-fixedbugs/bug189.go
-fixedbugs/bug190.go
-fixedbugs/bug191.go
-fixedbugs/bug192.go
-fixedbugs/bug193.go
-fixedbugs/bug194.go
-fixedbugs/bug195.go
-fixedbugs/bug196.go
-fixedbugs/bug197.go
-fixedbugs/bug198.go
-fixedbugs/bug199.go
-fixedbugs/bug200.go
-fixedbugs/bug201.go
-fixedbugs/bug202.go
-fixedbugs/bug203.go
-fixedbugs/bug204.go
-fixedbugs/bug205.go
-fixedbugs/bug206.go
-fixedbugs/bug207.go
-fixedbugs/bug208.go
-fixedbugs/bug209.go
-fixedbugs/bug211.go
-fixedbugs/bug212.go
-fixedbugs/bug213.go
-fixedbugs/bug214.go
-fixedbugs/bug215.go
-fixedbugs/bug216.go
-fixedbugs/bug217.go
-fixedbugs/bug218.go
-fixedbugs/bug219.go
-fixedbugs/bug220.go
-fixedbugs/bug221.go
-fixedbugs/bug222.go
-fixedbugs/bug223.go
-fixedbugs/bug224.go
-fixedbugs/bug225.go
-fixedbugs/bug226.go
-fixedbugs/bug227.go
-fixedbugs/bug228.go
-fixedbugs/bug229.go
-fixedbugs/bug230.go
-fixedbugs/bug231.go
-fixedbugs/bug232.go
-fixedbugs/bug233.go
-fixedbugs/bug234.go
-fixedbugs/bug235.go
-fixedbugs/bug236.go
-fixedbugs/bug237.go
-fixedbugs/bug238.go
-fixedbugs/bug239.go
-fixedbugs/bug240.go
-fixedbugs/bug241.go
-fixedbugs/bug242.go
-# fixedbugs/bug243.go # fail, flaky on android build
-fixedbugs/bug244.go
-fixedbugs/bug245.go
-fixedbugs/bug246.go
-fixedbugs/bug247.go
-fixedbugs/bug248.go
-fixedbugs/bug249.go
-fixedbugs/bug250.go
-fixedbugs/bug251.go
-fixedbugs/bug252.go
-fixedbugs/bug253.go
-fixedbugs/bug254.go
-fixedbugs/bug255.go
-fixedbugs/bug256.go
-fixedbugs/bug257.go
-fixedbugs/bug258.go
-fixedbugs/bug259.go
-fixedbugs/bug261.go
-fixedbugs/bug262.go
-fixedbugs/bug263.go
-fixedbugs/bug264.go
-fixedbugs/bug265.go
-fixedbugs/bug266.go
-fixedbugs/bug267.go
-fixedbugs/bug268.go
-fixedbugs/bug269.go
-fixedbugs/bug270.go
-fixedbugs/bug271.go
-fixedbugs/bug272.go
-fixedbugs/bug273.go
-fixedbugs/bug274.go
-fixedbugs/bug275.go
-fixedbugs/bug276.go
-fixedbugs/bug277.go
-fixedbugs/bug278.go
-fixedbugs/bug279.go
-fixedbugs/bug280.go
-fixedbugs/bug281.go
-fixedbugs/bug282.go
-fixedbugs/bug283.go
-fixedbugs/bug284.go
-fixedbugs/bug285.go
-fixedbugs/bug286.go
-fixedbugs/bug287.go
-fixedbugs/bug288.go
-fixedbugs/bug289.go
-fixedbugs/bug290.go
-fixedbugs/bug291.go
-fixedbugs/bug292.go
-fixedbugs/bug293.go
-fixedbugs/bug294.go
-fixedbugs/bug295.go
-fixedbugs/bug296.go
-fixedbugs/bug297.go
-fixedbugs/bug298.go
-# bugs/bug260.go # fail, BUG
diff --git a/gcc/testsuite/go.test/test/assign.go b/gcc/testsuite/go.test/test/assign.go
index 59471388c0..2192f9ede0 100644
--- a/gcc/testsuite/go.test/test/assign.go
+++ b/gcc/testsuite/go.test/test/assign.go
@@ -16,38 +16,38 @@ type T struct {
func main() {
{
var x, y sync.Mutex
- x = y // ERROR "assignment.*Mutex"
+ x = y // ok
_ = x
}
{
var x, y T
- x = y // ERROR "assignment.*Mutex"
+ x = y // ok
_ = x
}
{
var x, y [2]sync.Mutex
- x = y // ERROR "assignment.*Mutex"
+ x = y // ok
_ = x
}
{
var x, y [2]T
- x = y // ERROR "assignment.*Mutex"
+ x = y // ok
_ = x
}
{
- x := sync.Mutex{0, 0} // ERROR "assignment.*Mutex"
+ x := sync.Mutex{0, 0} // ERROR "assignment.*Mutex"
_ = x
}
{
- x := sync.Mutex{key: 0} // ERROR "(unknown|assignment).*Mutex"
+ x := sync.Mutex{key: 0} // ERROR "(unknown|assignment).*Mutex"
_ = x
}
{
- x := &sync.Mutex{} // ok
- var y sync.Mutex // ok
- y = *x // ERROR "assignment.*Mutex"
- *x = y // ERROR "assignment.*Mutex"
+ x := &sync.Mutex{} // ok
+ var y sync.Mutex // ok
+ y = *x // ok
+ *x = y // ok
_ = x
_ = y
- }
+ }
}
diff --git a/gcc/testsuite/go.test/test/bench/clean.bash b/gcc/testsuite/go.test/test/bench/clean.bash
deleted file mode 100755
index d56c0e3940..0000000000
--- a/gcc/testsuite/go.test/test/bench/clean.bash
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-OS=568
-rm -f [$OS].out *.[$OS]
diff --git a/gcc/testsuite/go.test/test/garbage/Makefile b/gcc/testsuite/go.test/test/bench/garbage/Makefile
index ab29e0956c..8002a2017b 100644
--- a/gcc/testsuite/go.test/test/garbage/Makefile
+++ b/gcc/testsuite/go.test/test/bench/garbage/Makefile
@@ -2,23 +2,24 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
-include ../../src/Make.inc
+include ../../../src/Make.inc
ALL=\
parser\
peano\
tree\
+ tree2\
all: $(addsuffix .out, $(ALL))
-%.$O: %.go
- $(GC) $*.go
+%.$O: %.go stats.go
+ $(GC) $(GCFLAGS) $(GCIMPORTS) $*.go stats.go
%.out: %.$O
$(LD) -o $@ $*.$O
%.bench: %.out
- ./$*.out
+ time ./$*.out
bench: $(addsuffix .bench, $(ALL))
diff --git a/gcc/testsuite/go.test/test/garbage/parser.go b/gcc/testsuite/go.test/test/bench/garbage/parser.go
index cf68737fb2..9e15f6c0f4 100644
--- a/gcc/testsuite/go.test/test/garbage/parser.go
+++ b/gcc/testsuite/go.test/test/bench/garbage/parser.go
@@ -11,6 +11,10 @@ import (
"fmt"
"go/ast"
"go/parser"
+ "go/token"
+ "log"
+ "net/http"
+ _ "net/http/pprof"
"os"
"path"
"runtime"
@@ -18,19 +22,21 @@ import (
"time"
)
-func isGoFile(dir *os.FileInfo) bool {
- return dir.IsRegular() &&
- !strings.HasPrefix(dir.Name, ".") && // ignore .files
- path.Ext(dir.Name) == ".go"
+var serve = flag.String("serve", "", "serve http on this address at end")
+
+func isGoFile(dir os.FileInfo) bool {
+ return !dir.IsDir() &&
+ !strings.HasPrefix(dir.Name(), ".") && // ignore .files
+ path.Ext(dir.Name()) == ".go"
}
-func isPkgFile(dir *os.FileInfo) bool {
+func isPkgFile(dir os.FileInfo) bool {
return isGoFile(dir) &&
- !strings.HasSuffix(dir.Name, "_test.go") // ignore test files
+ !strings.HasSuffix(dir.Name(), "_test.go") // ignore test files
}
func pkgName(filename string) string {
- file, err := parser.ParseFile(filename, nil, parser.PackageClauseOnly)
+ file, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.PackageClauseOnly)
if err != nil || file == nil {
return ""
}
@@ -43,7 +49,7 @@ func parseDir(dirpath string) map[string]*ast.Package {
_, pkgname := path.Split(dirpath)
// filter function to select the desired .go files
- filter := func(d *os.FileInfo) bool {
+ filter := func(d os.FileInfo) bool {
if isPkgFile(d) {
// Some directories contain main packages: Only accept
// files that belong to the expected package so that
@@ -51,16 +57,16 @@ func parseDir(dirpath string) map[string]*ast.Package {
// found" errors.
// Additionally, accept the special package name
// fakePkgName if we are looking at cmd documentation.
- name := pkgName(dirpath + "/" + d.Name)
+ name := pkgName(dirpath + "/" + d.Name())
return name == pkgname
}
return false
}
// get package AST
- pkgs, err := parser.ParseDir(dirpath, filter, parser.ParseComments)
+ pkgs, err := parser.ParseDir(token.NewFileSet(), dirpath, filter, parser.ParseComments)
if err != nil {
- println("parse", dirpath, err.String())
+ println("parse", dirpath, err.Error())
panic("fail")
}
return pkgs
@@ -68,12 +74,15 @@ func parseDir(dirpath string) map[string]*ast.Package {
func main() {
st := &runtime.MemStats
+ packages = append(packages, packages...)
+ packages = append(packages, packages...)
n := flag.Int("n", 4, "iterations")
p := flag.Int("p", len(packages), "# of packages to keep in memory")
flag.BoolVar(&st.DebugGC, "d", st.DebugGC, "print GC debugging info (pause times)")
flag.Parse()
- var t0 int64
+ var lastParsed []map[string]*ast.Package
+ var t0 time.Time
pkgroot := runtime.GOROOT() + "/src/pkg/"
for pass := 0; pass < 2; pass++ {
// Once the heap is grown to full size, reset counters.
@@ -81,52 +90,58 @@ func main() {
// than the normal pauses and would otherwise make
// the average look much better than it actually is.
st.NumGC = 0
- st.PauseNs = 0
- t0 = time.Nanoseconds()
+ st.PauseTotalNs = 0
+ t0 = time.Now()
for i := 0; i < *n; i++ {
parsed := make([]map[string]*ast.Package, *p)
for j := range parsed {
parsed[j] = parseDir(pkgroot + packages[j%len(packages)])
}
+ if i+1 == *n && *serve != "" {
+ lastParsed = parsed
+ }
}
runtime.GC()
+ runtime.GC()
}
- t1 := time.Nanoseconds()
+ t1 := time.Now()
fmt.Printf("Alloc=%d/%d Heap=%d Mallocs=%d PauseTime=%.3f/%d = %.3f\n",
st.Alloc, st.TotalAlloc,
st.Sys,
- st.Mallocs, float64(st.PauseNs)/1e9,
- st.NumGC, float64(st.PauseNs)/1e9/float64(st.NumGC))
-
- fmt.Printf("%10s %10s %10s\n", "size", "#alloc", "#free")
- for _, s := range st.BySize {
- fmt.Printf("%10d %10d %10d\n", s.Size, s.Mallocs, s.Frees)
- }
+ st.Mallocs, float64(st.PauseTotalNs)/1e9,
+ st.NumGC, float64(st.PauseTotalNs)/1e9/float64(st.NumGC))
+ /*
+ fmt.Printf("%10s %10s %10s\n", "size", "#alloc", "#free")
+ for _, s := range st.BySize {
+ fmt.Printf("%10d %10d %10d\n", s.Size, s.Mallocs, s.Frees)
+ }
+ */
// Standard gotest benchmark output, collected by build dashboard.
- fmt.Printf("garbage.BenchmarkParser %d %d ns/op\n", *n, (t1-t0)/int64(*n))
- fmt.Printf("garbage.BenchmarkParserPause %d %d ns/op\n", st.NumGC, int64(st.PauseNs)/int64(st.NumGC))
-}
+ gcstats("BenchmarkParser", *n, t1.Sub(t0))
+ if *serve != "" {
+ log.Fatal(http.ListenAndServe(*serve, nil))
+ println(lastParsed)
+ }
+}
var packages = []string{
"archive/tar",
- "asn1",
- "big",
+ "encoding/asn1",
+ "math/big",
"bufio",
"bytes",
- "cmath",
+ "math/cmplx",
"compress/flate",
"compress/gzip",
"compress/zlib",
"container/heap",
"container/list",
"container/ring",
- "container/vector",
"crypto/aes",
- "crypto/block",
"crypto/blowfish",
"crypto/hmac",
"crypto/md4",
@@ -145,20 +160,14 @@ var packages = []string{
"debug/macho",
"debug/elf",
"debug/gosym",
- "debug/proc",
- "ebnf",
+ "exp/ebnf",
"encoding/ascii85",
"encoding/base64",
"encoding/binary",
"encoding/git85",
"encoding/hex",
"encoding/pem",
- "exec",
- "exp/datafmt",
- "exp/draw",
- "exp/eval",
- "exp/iterable",
- "expvar",
+ "os/exec",
"flag",
"fmt",
"go/ast",
@@ -167,49 +176,49 @@ var packages = []string{
"go/printer",
"go/scanner",
"go/token",
- "gob",
+ "encoding/gob",
"hash",
"hash/adler32",
"hash/crc32",
"hash/crc64",
- "http",
+ "net/http",
"image",
"image/jpeg",
"image/png",
"io",
"io/ioutil",
- "json",
+ "encoding/json",
"log",
"math",
"mime",
"net",
- "nntp",
"os",
"os/signal",
"patch",
"path",
- "rand",
+ "math/rand",
"reflect",
"regexp",
- "rpc",
+ "net/rpc",
"runtime",
- "scanner",
+ "text/scanner",
"sort",
+ "net/smtp",
"strconv",
"strings",
"sync",
"syscall",
- "syslog",
- "tabwriter",
- "template",
+ "log/syslog",
+ "text/tabwriter",
+ "text/template",
"testing",
"testing/iotest",
"testing/quick",
"testing/script",
"time",
"unicode",
- "utf8",
- "utf16",
+ "unicode/utf8",
+ "unicode/utf16",
"websocket",
- "xml",
+ "encoding/xml",
}
diff --git a/gcc/testsuite/go.test/test/garbage/peano.go b/gcc/testsuite/go.test/test/bench/garbage/peano.go
index b026354e8c..f1ad6ed699 100644
--- a/gcc/testsuite/go.test/test/garbage/peano.go
+++ b/gcc/testsuite/go.test/test/bench/garbage/peano.go
@@ -12,31 +12,25 @@ import (
"time"
)
-
type Number struct {
next *Number
}
-
// -------------------------------------
// Peano primitives
func zero() *Number { return nil }
-
func is_zero(x *Number) bool { return x == nil }
-
func add1(x *Number) *Number {
e := new(Number)
e.next = x
return e
}
-
func sub1(x *Number) *Number { return x.next }
-
func add(x, y *Number) *Number {
if is_zero(y) {
return x
@@ -45,7 +39,6 @@ func add(x, y *Number) *Number {
return add(add1(x), sub1(y))
}
-
func mul(x, y *Number) *Number {
if is_zero(x) || is_zero(y) {
return zero()
@@ -54,7 +47,6 @@ func mul(x, y *Number) *Number {
return add(mul(x, sub1(y)), x)
}
-
func fact(n *Number) *Number {
if is_zero(n) {
return add1(zero())
@@ -63,7 +55,6 @@ func fact(n *Number) *Number {
return mul(fact(sub1(n)), n)
}
-
// -------------------------------------
// Helpers to generate/count Peano integers
@@ -75,7 +66,6 @@ func gen(n int) *Number {
return zero()
}
-
func count(x *Number) int {
if is_zero(x) {
return 0
@@ -84,7 +74,6 @@ func count(x *Number) int {
return count(sub1(x)) + 1
}
-
func check(x *Number, expected int) {
var c = count(x)
if c != expected {
@@ -92,7 +81,6 @@ func check(x *Number, expected int) {
}
}
-
// -------------------------------------
// Test basic functionality
@@ -117,21 +105,17 @@ func verify() {
check(fact(gen(5)), 120)
}
-
// -------------------------------------
// Factorial
-
func main() {
- st := &runtime.MemStats
- t0 := time.Nanoseconds()
+ t0 := time.Now()
verify()
for i := 0; i <= 9; i++ {
print(i, "! = ", count(fact(gen(i))), "\n")
}
runtime.GC()
- t1 := time.Nanoseconds()
+ t1 := time.Now()
- fmt.Printf("garbage.BenchmarkPeano 1 %d ns/op\n", t1-t0)
- fmt.Printf("garbage.BenchmarkPeanoPause %d %d ns/op\n", st.NumGC, int64(st.PauseNs)/int64(st.NumGC))
+ gcstats("BenchmarkPeano", 1, t1.Sub(t0))
}
diff --git a/gcc/testsuite/go.test/test/bench/garbage/stats.go b/gcc/testsuite/go.test/test/bench/garbage/stats.go
new file mode 100644
index 0000000000..985e7eaf5d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/garbage/stats.go
@@ -0,0 +1,46 @@
+// 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 main
+
+import (
+ "fmt"
+ "runtime"
+ "sort"
+ "time"
+)
+
+func gcstats(name string, n int, t time.Duration) {
+ st := &runtime.MemStats
+ fmt.Printf("garbage.%sMem Alloc=%d/%d Heap=%d NextGC=%d Mallocs=%d\n", name, st.Alloc, st.TotalAlloc, st.Sys, st.NextGC, st.Mallocs)
+ fmt.Printf("garbage.%s %d %d ns/op\n", name, n, t.Nanoseconds()/int64(n))
+ fmt.Printf("garbage.%sLastPause 1 %d ns/op\n", name, st.PauseNs[(st.NumGC-1)%uint32(len(st.PauseNs))])
+ fmt.Printf("garbage.%sPause %d %d ns/op\n", name, st.NumGC, int64(st.PauseTotalNs)/int64(st.NumGC))
+ nn := int(st.NumGC)
+ if nn >= len(st.PauseNs) {
+ nn = len(st.PauseNs)
+ }
+ t1, t2, t3, t4, t5 := tukey5(st.PauseNs[0:nn])
+ fmt.Printf("garbage.%sPause5: %d %d %d %d %d\n", name, t1, t2, t3, t4, t5)
+
+ // fmt.Printf("garbage.%sScan: %v\n", name, st.ScanDist)
+}
+
+type T []uint64
+
+func (t T) Len() int { return len(t) }
+func (t T) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
+func (t T) Less(i, j int) bool { return t[i] < t[j] }
+
+func tukey5(raw []uint64) (lo, q1, q2, q3, hi uint64) {
+ x := make(T, len(raw))
+ copy(x, raw)
+ sort.Sort(T(x))
+ lo = x[0]
+ q1 = x[len(x)/4]
+ q2 = x[len(x)/2]
+ q3 = x[len(x)*3/4]
+ hi = x[len(x)-1]
+ return
+}
diff --git a/gcc/testsuite/go.test/test/garbage/tree.go b/gcc/testsuite/go.test/test/bench/garbage/tree.go
index 816693fbeb..0a3ec234db 100644
--- a/gcc/testsuite/go.test/test/garbage/tree.go
+++ b/gcc/testsuite/go.test/test/bench/garbage/tree.go
@@ -39,7 +39,6 @@ package main
import (
"flag"
"fmt"
- "runtime"
"time"
)
@@ -69,7 +68,7 @@ const minDepth = 4
func main() {
flag.Parse()
- t0 := time.Nanoseconds()
+ t0 := time.Now()
maxDepth := *n
if minDepth+2 > *n {
@@ -94,11 +93,8 @@ func main() {
}
fmt.Printf("long lived tree of depth %d\t check: %d\n", maxDepth, longLivedTree.itemCheck())
- t1 := time.Nanoseconds()
- st := &runtime.MemStats
+ t1 := time.Now()
// Standard gotest benchmark output, collected by build dashboard.
- fmt.Printf("garbage.BenchmarkTree %d %d ns/op\n", *n, (t1-t0)/int64(*n))
- fmt.Printf("garbage.BenchmarkTreePause %d %d ns/op\n", st.NumGC, int64(st.PauseNs)/int64(st.NumGC))
-
+ gcstats("BenchmarkTree", *n, t1.Sub(t0))
}
diff --git a/gcc/testsuite/go.test/test/bench/garbage/tree2.go b/gcc/testsuite/go.test/test/bench/garbage/tree2.go
new file mode 100644
index 0000000000..6d78f72c5b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/garbage/tree2.go
@@ -0,0 +1,88 @@
+// 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 main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "os"
+ "runtime"
+ "runtime/pprof"
+ "unsafe"
+)
+
+const BranchingFactor = 4
+
+type Object struct {
+ child [BranchingFactor]*Object
+}
+
+var (
+ cpus = flag.Int("cpus", 1, "number of cpus to use")
+ heapsize = flag.Int64("heapsize", 100*1024*1024, "size of the heap in bytes")
+ cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
+
+ lastPauseNs uint64 = 0
+ lastFree uint64 = 0
+ heap *Object
+ calls [20]int
+ numobjects int64
+)
+
+func buildHeap() {
+ objsize := int64(unsafe.Sizeof(Object{}))
+ heap, _ = buildTree(float64(objsize), float64(*heapsize), 0)
+ fmt.Printf("*** built heap: %.0f MB; (%d objects * %d bytes)\n",
+ float64(*heapsize)/1048576, numobjects, objsize)
+}
+
+func buildTree(objsize, size float64, depth int) (*Object, float64) {
+ calls[depth]++
+ x := &Object{}
+ numobjects++
+ subtreeSize := (size - objsize) / BranchingFactor
+ alloc := objsize
+ for i := 0; i < BranchingFactor && alloc < size; i++ {
+ c, n := buildTree(objsize, subtreeSize, depth+1)
+ x.child[i] = c
+ alloc += n
+ }
+ return x, alloc
+}
+
+func gc() {
+ runtime.GC()
+ runtime.UpdateMemStats()
+ pause := runtime.MemStats.PauseTotalNs
+ inuse := runtime.MemStats.Alloc
+ free := runtime.MemStats.TotalAlloc - inuse
+ fmt.Printf("gc pause: %8.3f ms; collect: %8.0f MB; heapsize: %8.0f MB\n",
+ float64(pause-lastPauseNs)/1e6,
+ float64(free-lastFree)/1048576,
+ float64(inuse)/1048576)
+ lastPauseNs = pause
+ lastFree = free
+}
+
+func main() {
+ flag.Parse()
+ buildHeap()
+ runtime.GOMAXPROCS(*cpus)
+ runtime.UpdateMemStats()
+ lastPauseNs = runtime.MemStats.PauseTotalNs
+ lastFree = runtime.MemStats.TotalAlloc - runtime.MemStats.Alloc
+ if *cpuprofile != "" {
+ f, err := os.Create(*cpuprofile)
+ if err != nil {
+ log.Fatal(err)
+ }
+ pprof.StartCPUProfile(f)
+ defer pprof.StopCPUProfile()
+ }
+ for i := 0; i < 10; i++ {
+ gc()
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/Makefile b/gcc/testsuite/go.test/test/bench/go1/Makefile
new file mode 100644
index 0000000000..94847438f9
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/Makefile
@@ -0,0 +1,7 @@
+include $(GOROOT)/src/Make.inc
+
+TARG=go1
+GOFILES=\
+ dummy.go\
+
+include $(GOROOT)/src/Make.pkg
diff --git a/gcc/testsuite/go.test/test/bench/go1/_testmain.go b/gcc/testsuite/go.test/test/bench/go1/_testmain.go
new file mode 100644
index 0000000000..bedc373a57
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/_testmain.go
@@ -0,0 +1,40 @@
+package main
+
+import target "go1"
+import "testing"
+import "regexp"
+
+var tests = []testing.InternalTest{
+}
+
+var benchmarks = []testing.InternalBenchmark{
+ {"go1.BenchmarkBinaryTree17", target.BenchmarkBinaryTree17},
+ {"go1.BenchmarkFannkuch11", target.BenchmarkFannkuch11},
+ {"go1.BenchmarkGobDecode", target.BenchmarkGobDecode},
+ {"go1.BenchmarkGobEncode", target.BenchmarkGobEncode},
+ {"go1.BenchmarkGzip", target.BenchmarkGzip},
+ {"go1.BenchmarkGunzip", target.BenchmarkGunzip},
+ {"go1.BenchmarkJSONEncode", target.BenchmarkJSONEncode},
+ {"go1.BenchmarkJSONDecode", target.BenchmarkJSONDecode},
+ {"go1.BenchmarkRevcomp25M", target.BenchmarkRevcomp25M},
+ {"go1.BenchmarkTemplate", target.BenchmarkTemplate},
+}
+var examples = []testing.InternalExample{}
+
+var matchPat string
+var matchRe *regexp.Regexp
+
+func matchString(pat, str string) (result bool, err error) {
+ if matchRe == nil || matchPat != pat {
+ matchPat = pat
+ matchRe, err = regexp.Compile(matchPat)
+ if err != nil {
+ return
+ }
+ }
+ return matchRe.MatchString(str), nil
+}
+
+func main() {
+ testing.Main(matchString, tests, benchmarks, examples)
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/binarytree_test.go b/gcc/testsuite/go.test/test/bench/go1/binarytree_test.go
new file mode 100644
index 0000000000..c64c4b8816
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/binarytree_test.go
@@ -0,0 +1,63 @@
+// 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.
+
+// This benchmark, taken from the shootout, tests garbage collector
+// performance by generating and discarding large binary trees.
+
+package go1
+
+import "testing"
+
+type binaryNode struct {
+ item int
+ left, right *binaryNode
+}
+
+func bottomUpTree(item, depth int) *binaryNode {
+ if depth <= 0 {
+ return &binaryNode{item: item}
+ }
+ return &binaryNode{item, bottomUpTree(2*item-1, depth-1), bottomUpTree(2*item, depth-1)}
+}
+
+func (n *binaryNode) itemCheck() int {
+ if n.left == nil {
+ return n.item
+ }
+ return n.item + n.left.itemCheck() - n.right.itemCheck()
+}
+
+const minDepth = 4
+
+func binarytree(n int) {
+ maxDepth := n
+ if minDepth+2 > n {
+ maxDepth = minDepth + 2
+ }
+ stretchDepth := maxDepth + 1
+
+ check := bottomUpTree(0, stretchDepth).itemCheck()
+ //fmt.Printf("stretch tree of depth %d\t check: %d\n", stretchDepth, check)
+
+ longLivedTree := bottomUpTree(0, maxDepth)
+
+ for depth := minDepth; depth <= maxDepth; depth += 2 {
+ iterations := 1 << uint(maxDepth-depth+minDepth)
+ check = 0
+
+ for i := 1; i <= iterations; i++ {
+ check += bottomUpTree(i, depth).itemCheck()
+ check += bottomUpTree(-i, depth).itemCheck()
+ }
+ //fmt.Printf("%d\t trees of depth %d\t check: %d\n", iterations*2, depth, check)
+ }
+ longLivedTree.itemCheck()
+ //fmt.Printf("long lived tree of depth %d\t check: %d\n", maxDepth, longLivedTree.itemCheck())
+}
+
+func BenchmarkBinaryTree17(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ binarytree(17)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/dummy.go b/gcc/testsuite/go.test/test/bench/go1/dummy.go
new file mode 100644
index 0000000000..4956bc7b79
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/dummy.go
@@ -0,0 +1,3 @@
+package go1
+
+// Nothing to see here: everything is in the _test files.
diff --git a/gcc/testsuite/go.test/test/bench/go1/fannkuch_test.go b/gcc/testsuite/go.test/test/bench/go1/fannkuch_test.go
new file mode 100644
index 0000000000..ae45bfd881
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/fannkuch_test.go
@@ -0,0 +1,84 @@
+// 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.
+
+// This benchmark, taken from the shootout, tests array indexing
+// and array bounds elimination performance.
+
+package go1
+
+import "testing"
+
+func fannkuch(n int) int {
+ if n < 1 {
+ return 0
+ }
+
+ n1 := n - 1
+ perm := make([]int, n)
+ perm1 := make([]int, n)
+ count := make([]int, n)
+
+ for i := 0; i < n; i++ {
+ perm1[i] = i // initial (trivial) permutation
+ }
+
+ r := n
+ didpr := 0
+ flipsMax := 0
+ for {
+ if didpr < 30 {
+ didpr++
+ }
+ for ; r != 1; r-- {
+ count[r-1] = r
+ }
+
+ if perm1[0] != 0 && perm1[n1] != n1 {
+ flips := 0
+ for i := 1; i < n; i++ { // perm = perm1
+ perm[i] = perm1[i]
+ }
+ k := perm1[0] // cache perm[0] in k
+ for { // k!=0 ==> k>0
+ for i, j := 1, k-1; i < j; i, j = i+1, j-1 {
+ perm[i], perm[j] = perm[j], perm[i]
+ }
+ flips++
+ // Now exchange k (caching perm[0]) and perm[k]... with care!
+ j := perm[k]
+ perm[k] = k
+ k = j
+ if k == 0 {
+ break
+ }
+ }
+ if flipsMax < flips {
+ flipsMax = flips
+ }
+ }
+
+ for ; r < n; r++ {
+ // rotate down perm[0..r] by one
+ perm0 := perm1[0]
+ for i := 0; i < r; i++ {
+ perm1[i] = perm1[i+1]
+ }
+ perm1[r] = perm0
+ count[r]--
+ if count[r] > 0 {
+ break
+ }
+ }
+ if r == n {
+ return flipsMax
+ }
+ }
+ return 0
+}
+
+func BenchmarkFannkuch11(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ fannkuch(11)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/fasta_test.go b/gcc/testsuite/go.test/test/bench/go1/fasta_test.go
new file mode 100644
index 0000000000..dcb2d1055d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/fasta_test.go
@@ -0,0 +1,164 @@
+// 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 go1
+
+// Not a benchmark; input for revcomp.
+
+var fasta25m = fasta(25e6)
+
+func fasta(n int) []byte {
+ out := make(fastaBuffer, 0, 11*n)
+
+ iub := []fastaAcid{
+ {prob: 0.27, sym: 'a'},
+ {prob: 0.12, sym: 'c'},
+ {prob: 0.12, sym: 'g'},
+ {prob: 0.27, sym: 't'},
+ {prob: 0.02, sym: 'B'},
+ {prob: 0.02, sym: 'D'},
+ {prob: 0.02, sym: 'H'},
+ {prob: 0.02, sym: 'K'},
+ {prob: 0.02, sym: 'M'},
+ {prob: 0.02, sym: 'N'},
+ {prob: 0.02, sym: 'R'},
+ {prob: 0.02, sym: 'S'},
+ {prob: 0.02, sym: 'V'},
+ {prob: 0.02, sym: 'W'},
+ {prob: 0.02, sym: 'Y'},
+ }
+
+ homosapiens := []fastaAcid{
+ {prob: 0.3029549426680, sym: 'a'},
+ {prob: 0.1979883004921, sym: 'c'},
+ {prob: 0.1975473066391, sym: 'g'},
+ {prob: 0.3015094502008, sym: 't'},
+ }
+
+ alu := []byte(
+ "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" +
+ "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" +
+ "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" +
+ "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" +
+ "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" +
+ "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" +
+ "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA")
+
+ out.WriteString(">ONE Homo sapiens alu\n")
+ fastaRepeat(&out, alu, 2*n)
+ out.WriteString(">TWO IUB ambiguity codes\n")
+ fastaRandom(&out, iub, 3*n)
+ out.WriteString(">THREE Homo sapiens frequency\n")
+ fastaRandom(&out, homosapiens, 5*n)
+ return out
+}
+
+type fastaBuffer []byte
+
+func (b *fastaBuffer) Flush() {
+ panic("flush")
+}
+
+func (b *fastaBuffer) WriteString(s string) {
+ p := b.NextWrite(len(s))
+ copy(p, s)
+}
+
+func (b *fastaBuffer) NextWrite(n int) []byte {
+ p := *b
+ if len(p)+n > cap(p) {
+ b.Flush()
+ p = *b
+ }
+ out := p[len(p) : len(p)+n]
+ *b = p[:len(p)+n]
+ return out
+}
+
+const fastaLine = 60
+
+func fastaRepeat(out *fastaBuffer, alu []byte, n int) {
+ buf := append(alu, alu...)
+ off := 0
+ for n > 0 {
+ m := n
+ if m > fastaLine {
+ m = fastaLine
+ }
+ buf1 := out.NextWrite(m + 1)
+ copy(buf1, buf[off:])
+ buf1[m] = '\n'
+ if off += m; off >= len(alu) {
+ off -= len(alu)
+ }
+ n -= m
+ }
+}
+
+const (
+ fastaLookupSize = 4096
+ fastaLookupScale float64 = fastaLookupSize - 1
+)
+
+var fastaRand uint32 = 42
+
+type fastaAcid struct {
+ sym byte
+ prob float64
+ cprob float64
+ next *fastaAcid
+}
+
+func fastaComputeLookup(acid []fastaAcid) *[fastaLookupSize]*fastaAcid {
+ var lookup [fastaLookupSize]*fastaAcid
+ var p float64
+ for i := range acid {
+ p += acid[i].prob
+ acid[i].cprob = p * fastaLookupScale
+ if i > 0 {
+ acid[i-1].next = &acid[i]
+ }
+ }
+ acid[len(acid)-1].cprob = 1.0 * fastaLookupScale
+
+ j := 0
+ for i := range lookup {
+ for acid[j].cprob < float64(i) {
+ j++
+ }
+ lookup[i] = &acid[j]
+ }
+
+ return &lookup
+}
+
+func fastaRandom(out *fastaBuffer, acid []fastaAcid, n int) {
+ const (
+ IM = 139968
+ IA = 3877
+ IC = 29573
+ )
+ lookup := fastaComputeLookup(acid)
+ for n > 0 {
+ m := n
+ if m > fastaLine {
+ m = fastaLine
+ }
+ buf := out.NextWrite(m + 1)
+ f := fastaLookupScale / IM
+ myrand := fastaRand
+ for i := 0; i < m; i++ {
+ myrand = (myrand*IA + IC) % IM
+ r := float64(int(myrand)) * f
+ a := lookup[int(r)]
+ for a.cprob < r {
+ a = a.next
+ }
+ buf[i] = a.sym
+ }
+ fastaRand = myrand
+ buf[m] = '\n'
+ n -= m
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/gob_test.go b/gcc/testsuite/go.test/test/bench/go1/gob_test.go
new file mode 100644
index 0000000000..00eeed57a5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/gob_test.go
@@ -0,0 +1,95 @@
+// 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.
+
+// This benchmark tests gob encoding and decoding performance.
+
+package go1
+
+import (
+ "bytes"
+ "encoding/gob"
+ "encoding/json"
+ "io/ioutil"
+ "log"
+ "reflect"
+ "testing"
+)
+
+var (
+ gobbytes []byte
+ gobdata *JSONResponse
+)
+
+func gobinit() {
+ // gobinit is called after json's init,
+ // because it uses jsondata.
+ gobdata = gobResponse(&jsondata)
+
+ var buf bytes.Buffer
+ if err := gob.NewEncoder(&buf).Encode(gobdata); err != nil {
+ panic(err)
+ }
+ gobbytes = buf.Bytes()
+
+ var r JSONResponse
+ if err := gob.NewDecoder(bytes.NewBuffer(gobbytes)).Decode(&r); err != nil {
+ panic(err)
+ }
+ if !reflect.DeepEqual(gobdata, &r) {
+ log.Printf("%v\n%v", jsondata, r)
+ b, _ := json.Marshal(&jsondata)
+ br, _ := json.Marshal(&r)
+ log.Printf("%s\n%s\n", b, br)
+ panic("gob: encode+decode lost data")
+ }
+}
+
+// gob turns [] into null, so make a copy of the data structure like that
+func gobResponse(r *JSONResponse) *JSONResponse {
+ return &JSONResponse{gobNode(r.Tree), r.Username}
+}
+
+func gobNode(n *JSONNode) *JSONNode {
+ n1 := new(JSONNode)
+ *n1 = *n
+ if len(n1.Kids) == 0 {
+ n1.Kids = nil
+ } else {
+ for i, k := range n1.Kids {
+ n1.Kids[i] = gobNode(k)
+ }
+ }
+ return n1
+}
+
+func gobdec() {
+ if gobbytes == nil {
+ panic("gobdata not initialized")
+ }
+ var r JSONResponse
+ if err := gob.NewDecoder(bytes.NewBuffer(gobbytes)).Decode(&r); err != nil {
+ panic(err)
+ }
+ _ = r
+}
+
+func gobenc() {
+ if err := gob.NewEncoder(ioutil.Discard).Encode(&gobdata); err != nil {
+ panic(err)
+ }
+}
+
+func BenchmarkGobDecode(b *testing.B) {
+ b.SetBytes(int64(len(gobbytes)))
+ for i := 0; i < b.N; i++ {
+ gobdec()
+ }
+}
+
+func BenchmarkGobEncode(b *testing.B) {
+ b.SetBytes(int64(len(gobbytes)))
+ for i := 0; i < b.N; i++ {
+ gobenc()
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/gzip_test.go b/gcc/testsuite/go.test/test/bench/go1/gzip_test.go
new file mode 100644
index 0000000000..c9eeb175f5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/gzip_test.go
@@ -0,0 +1,69 @@
+// 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.
+
+// This benchmark tests gzip and gunzip performance.
+
+package go1
+
+import (
+ "bytes"
+ gz "compress/gzip"
+ "io"
+ "io/ioutil"
+ "testing"
+)
+
+var (
+ jsongunz = bytes.Repeat(jsonbytes, 10)
+ jsongz []byte
+)
+
+func init() {
+ var buf bytes.Buffer
+ c, err := gz.NewWriter(&buf)
+ if err != nil {
+ panic(err)
+ }
+ c.Write(jsongunz)
+ c.Close()
+ jsongz = buf.Bytes()
+}
+
+func gzip() {
+ c, err := gz.NewWriter(ioutil.Discard)
+ if err != nil {
+ panic(err)
+ }
+ if _, err := c.Write(jsongunz); err != nil {
+ panic(err)
+ }
+ if err := c.Close(); err != nil {
+ panic(err)
+ }
+}
+
+func gunzip() {
+ r, err := gz.NewReader(bytes.NewBuffer(jsongz))
+ if err != nil {
+ panic(err)
+ }
+ if _, err := io.Copy(ioutil.Discard, r); err != nil {
+ panic(err)
+ }
+ r.Close()
+}
+
+func BenchmarkGzip(b *testing.B) {
+ b.SetBytes(int64(len(jsongunz)))
+ for i := 0; i < b.N; i++ {
+ gzip()
+ }
+}
+
+func BenchmarkGunzip(b *testing.B) {
+ b.SetBytes(int64(len(jsongunz)))
+ for i := 0; i < b.N; i++ {
+ gunzip()
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/json_test.go b/gcc/testsuite/go.test/test/bench/go1/json_test.go
new file mode 100644
index 0000000000..5a3012167b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/json_test.go
@@ -0,0 +1,84 @@
+// 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.
+
+// This benchmark tests JSON encoding and decoding performance.
+
+package go1
+
+import (
+ "compress/bzip2"
+ "encoding/base64"
+ "encoding/json"
+ "io"
+ "io/ioutil"
+ "strings"
+ "testing"
+)
+
+var (
+ jsonbytes []byte
+ jsondata JSONResponse
+)
+
+func init() {
+ var r io.Reader
+ r = strings.NewReader(jsonbz2_base64)
+ r = base64.NewDecoder(base64.StdEncoding, r)
+ r = bzip2.NewReader(r)
+ b, err := ioutil.ReadAll(r)
+ if err != nil {
+ panic(err)
+ }
+ jsonbytes = b
+
+ if err := json.Unmarshal(jsonbytes, &jsondata); err != nil {
+ panic(err)
+ }
+ gobinit()
+}
+
+type JSONResponse struct {
+ Tree *JSONNode `json:"tree"`
+ Username string `json:"username"`
+}
+
+type JSONNode struct {
+ Name string `json:"name"`
+ Kids []*JSONNode `json:"kids"`
+ CLWeight float64 `json:"cl_weight"`
+ Touches int `json:"touches"`
+ MinT int64 `json:"min_t"`
+ MaxT int64 `json:"max_t"`
+ MeanT int64 `json:"mean_t"`
+}
+
+func jsondec() {
+ var r JSONResponse
+ if err := json.Unmarshal(jsonbytes, &r); err != nil {
+ panic(err)
+ }
+ _ = r
+}
+
+func jsonenc() {
+ buf, err := json.Marshal(&jsondata)
+ if err != nil {
+ panic(err)
+ }
+ _ = buf
+}
+
+func BenchmarkJSONEncode(b *testing.B) {
+ b.SetBytes(int64(len(jsonbytes)))
+ for i := 0; i < b.N; i++ {
+ jsonenc()
+ }
+}
+
+func BenchmarkJSONDecode(b *testing.B) {
+ b.SetBytes(int64(len(jsonbytes)))
+ for i := 0; i < b.N; i++ {
+ jsondec()
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/jsondata_test.go b/gcc/testsuite/go.test/test/bench/go1/jsondata_test.go
new file mode 100644
index 0000000000..7d42c96657
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/jsondata_test.go
@@ -0,0 +1,1818 @@
+// 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.
+
+// Input for JSON and other benchmarks.
+// This was generated by starting with a 2MB JSON file with actual data
+// about open source revision history, then compressing with bzip2 -9,
+// then encoding to base64 with openssl enc -e -base64.
+// The result is 125kB of source instead of 2MB.
+// We compile the data into the binary so that the benchmark is
+// a stand-alone binary that can be copied easily from machine to
+// machine. json_test.go decodes this during init.
+
+package go1
+
+var jsonbz2_base64 = "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" +
+ "4Oy2vMLFphr2skmltbAj2yHto+/C1qRSHQI0oYJy4xPAK0hBhkBkzKGIDKfqR5fu" +
+ "9Rb6jriPwFfrT57/BORRUS2uxaWe/23vw/VDRJUNDKbcoql9hR1STaoUKFJAhAE0" +
+ "AZZLjCTR5qxIgYLhyUQktqwQ0LakMUoDZaYvf1dL7/UTZGZSt/h0bF8bOrkShINm" +
+ "UC5JVQoULQdWFmExZOwxx6b/nrJEIzcATXe9RX4uAjQuZbT7+8dvCcTe970nE51j" +
+ "cmac2WktrRIBr8KKqmFiShChQWsTPnID4M0CSyZe7rltE0/bIvrM+YcPthAH85JJ" +
+ "219mY5mjPQZhiZDYZA1DzBlAjUcjXvLL8BABMGVQh/A/vPwUfqX/5kl6UGGJn8FC" +
+ "P2GG+QceVRTNvxzts75paBK7NzM7TzVVUzlIqqif8NJKRImR08cg2cHrQWxKYcNh" +
+ "OjnHzz+YPyaL9PWNrPR37fFaHr23fpcy+YYGWlsuQf4q7bXFjzjZ66t5DEnZsqLU" +
+ "ixYlKiy0ibZsjalZamaizKs1laSpmk2ratltZbWSta0bazUrFJs0ttalazaQUhKg" +
+ "lSUAqyQoWSKtotVYtSmoyW220arUsoo1tpLaNtMsmtaaYsVTbS2UtJgram22rCkS" +
+ "qQSxISyQS0FSSyM1KaS2laa0lhNFGhYWigRULZFiyykqoCxFBKRFSItCrIUWLKak" +
+ "ppY2WbY2tps1pm2ymqbabbLNiZojaZkrFMKZrKzaWVptZtppijZNM2SzKmmxsRab" +
+ "LZs2K1NVqWqEzMlJtmqVRjVNZWllSVLM0LNNZpalZokSlltLasJRUqopUpZIElIE" +
+ "lkqrYjVi0aSNqWmLKpslJtFRBbSbbMy1KoplRspaNlNUrNUaaak2mpVFTZVGxk2a" +
+ "GTSWmzaCpKbNJW2WqWqKMmNk1GkKUtk2ysrLNs2WwyrMqKpqZmmmKxtmqayKZlUk" +
+ "qNltKlRSm2StUtbLWxTNUqlspo1ZtltNKRIqGm0tlRtNmmalNGZYybMozNNKkxpI" +
+ "2i2ULJqUrGyyxJslNGpZmtNSsrNWZY222yttmrVNTbWZZMms2lllbKstpmrNMUmp" +
+ "KqUtptKyaplKbRSbJbLNplZtqM1KKbabU1ZSUAmUaxpZjUkhUmyZmxbRSltNsrMq" +
+ "qVbNtslSptEzVrMqaazNpmkqZsxExpJSk1itlWqay1KppYopMUkkkmbLNlMymsxS" +
+ "0TKlNjKbA1TLLLU0lTWalTNMilKmys2ZY2mqViUVKSyksmapVNqSJRqxZSyylMlS" +
+ "yLFSWRUliWKLJPR487tzxPbvpf6y887/zT6h9UmfSx2PLPXLE2t67TNb+d8616jt" +
+ "tPkeNmjOnd2bULjnN/5x19I3dES+7KaAHB8sg9OaIHogcFmowcPkd56v4UKiqJhg" +
+ "oAU9AHxYiJSboAuO2tYkauzYowUsXVGVlc0nYOpihEKtGCELstXcQR40ZwxcKms+" +
+ "7pFjCoGnlWDFSsNDI2M37zbDfLv3avdlnZZ+BC52UzTjZKLth+XpejoaOcVlvLIp" +
+ "Bt0bICZGx12W3MemDI+BEABpXP87P4rJiq/on3ucmKl3H2qkVoDOXeBVIHThRlRW" +
+ "oIeneSsFb5P81QBgJOLBARAX3nH8/r/f8w3ilqIGYIs2ETpWjUrVBz3ap+abPKWH" +
+ "pLM3ltPx/+N/Wbt1NbzHN6yn49NkVXLjHsi0YsxWYxt0mpP5liJ0D/BK861JPxVJ" +
+ "KrrKd1DEsjkf2fd+E1sqc+0G02nKaZP3/wWYV/JKhVSKU/9f2kP+Es6z7k/gUksW" +
+ "JYe1an/921pBsrUdXyfSH+6h3N4k/jE5ItS1VTkajSXnZgf5UtgpKk2jaxZibyd4" +
+ "83LeR6x6+RPw/T0lWWVLOy4k54wllqVWtTTUvHd5G6VXZwcLVpZCyOySqT/VUqI2" +
+ "a3OjB+BJ/c5vJ17xaYezrA2WTu8JipWJ34en5WSThOGGFkqslgxWw1Riyit2TjUk" +
+ "4m2SJs+3WFSYNQcR9lN+j4j1noP93VyHCfI7cNMSZzH2ZNRThulseIk/yU5KdXt9" +
+ "v7zmbk+gjtO690cSQSoFfmmeBxfI+vqGsirzNH5C+xTw2WGGHE0X+u176U0uLoPT" +
+ "OEn+qsbDvaA4s+lX8EqpJzPrH0sloeXR1c9OiqmXer0zgSe5ZrT6ScTDZPxHCbPN" +
+ "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" +
+ "1YsdOxwxj98iTq3teHw5yT2NnV6Ms+s+NR8b24bKw/NWKKqqZhiqnM8QftpfQb+C" +
+ "Vs3lZLSSASqcfM7yVxGYledbnrN50XJBATYaCsBtFYJlZR2SKwb21+jqRiNFI0Sa" +
+ "rSjgiATZnWelW7O0mbziCfju7ylzo7WSqylsYp0JpjJU0qaMlJUUVhGilWTZudCx" +
+ "M+kc+l5uTSG84qLYv2ZJMli2qrILI2Tqln4cMqNhAj4gogAncslWOiwaV+BwnPnE" +
+ "jdp7E6UlqPtYJYV9Tg3WI95FkO6beZO8nlbeyYVc7od2tLylZPKLTp1I35t2iLsk" +
+ "ipSBQqtbUX19H2kWD8z2PyVPmh9rLUcrDSKQsTJIfukqY7Hl5DzdPLdUqq1+LJp5" +
+ "emzvHWPLN9YtWeh+2WzylkbFNlTCyVWKZpKyQ4YwqnWq3kKzCwje4lWdzTuDbTZx" +
+ "x4bJ8tzHGu7m3prWSakaVZncMwY02dcu7kznctvM5MknBXCmwVtKfU0xWphkowpi" +
+ "VsxiVW7I2rWqtRhwpcXDoaZN1MN6tYlKrh3GpWUlJLvXd43OuslSWQ0fVcxqeL+B" +
+ "Xv1rpQyBqdm7e1Ra8loulyubVzbXOGoNVpN1/mjcbxaAiUP6xnhT7z2IJaTCQVgt" +
+ "DpQcGFJgWSBTA5batqKV5l3ruu7XC3NyZRFeT486vWm68lRqMyRNpSzSpsi1KyzL" +
+ "GmTS2azSVMZqtq2bay1a0raVmmyq2yqikIVCwBSIqSpJJKsVBYgSKsBLSopRkS2t" +
+ "tKmrVKmA1rSpZU2JTWWSGtUtmsrMWKVLLVRCkSkEqQS0GpKlKZllNtK0WFGTNpZY" +
+ "2lmmZKZLbWbabW0ttZTSTFMklmzbbTaajUNZaVNKzWaipYqKmU2mMk2lilaVplhZ" +
+ "MykpmlSwamzZsrUtUJCNs2xE2zWbLJpmmmlSyzaYzNqWpssspZTaqtm1VbJlmm01" +
+ "kzUtDKks1LIK020pKUpNRlKTSlmUprKzRSmk1NTZZJrNhJIZMlSpNJDMktbNVDEs" +
+ "mpKFKVJtllm0ps2WzabGsbM2aQtmsJaMkNaVJmssNbZtbMprNYqWVKlaTUapJmGz" +
+ "RClCZhpmEmZpEympqWZmWbRs0SaY0lNTU2lqbLNtts1tsrNtKqSWmGWWW0tZrNiG" +
+ "Uy2ylLU2jJWUySmlNmpspWFKJrTVkE1lJmakWTZmUtpS0rKyqpVsilmsNrWWbLMq" +
+ "aVLFlNmazabZtNppoZJEkxlJIlplYbNUMaaVKhIUylmxaWkEslm2WoAZmYGmm02k" +
+ "mZ9vNcym/zYZ1m/E+UySfg39LUVVWb+0CAnu+IVnzkTYexs7ufDm0VjDZ7mmLPDC" +
+ "jvRkCK4NH4KYIPfTEsxAJVJTCY4MNNqKqTgrJkmjRkVkyN9MMuNskxW0mmjTSlSs" +
+ "RiUzxDKZmvWVXm9Y8a6VLqbbWXtSMLsZGTNoSqYkyYjI2VEskoLRRUbRRsbWkqSt" +
+ "Sau0WgopMsq6V0SZehQ82kyxbJsqq2k6xbaqqpy8chxElkKVybMPBqa1jIGLJqNa" +
+ "WSNnw5w5rJRVJ8pXQahwWUzyp0wnz/U0hIEiEYfzEVFZGtr8GqLFqNUUa0pVZVFV" +
+ "lLVsEy7VF1qILVeGEk2aS+WJki7F2pqD7InRyG/WjNbxTzY7E029eTdr/1ZJlhzx" +
+ "xZEk7TYxZI2Vk4yI8WLZEUcfOpyzjm2I50sicpFjzHRZKelYLMxipnrpolbK2wP3" +
+ "Gj5QrZ3mE7dW70dJN3aTWPvGzFnLOYscQkecNk/KdSbVattW/g8tatRJ9BbaVmTU" +
+ "cNkbE5NiRgCjqJjBFYYMQEpXT39BIxlLWwvLhFGpGWUqKViqxkcZkznhqQLSNrGQ" +
+ "hBUdGYxN2kbWNpAzdTVXSs46S3TNK5yd26mxXO7tXNdm0m6bRbSTJvK6rpKW2TFt" +
+ "vPLvJbNaSixoxKyEmNk0kWK0SdjZs2NohYnAsejhFowruXCQlUVFqVGpE0UGZIZE" +
+ "c3lktTo03a6N+EiflSdFScJJ0xKRxN5+ZDlCLZB9FWySZUtkhL9OWNS5Kx7HmGk3" +
+ "Zm+vn/kuSquatyCwYtGGhIxpQKVBh9sws7qnJ2thu+NtlbJbljpdXFmFp6I0cN3V" +
+ "hW7RqTNacWNJ80k/pbIVr82CR/iVzKp1fJPyjz7u0PGnOl53LbDvYakR0ZJD8qm5" +
+ "9mWLpEWRzhu+1n9OUKT1kn8VOh3p4lv5ZjCqf3P82pWjKmxUzVvxpOH8eDZPhDwf" +
+ "ii4JZZPcJ67Ts94+JJ8JN6n2RXJ/iPpDEN5uehqR3Yxju2bXbGDrRv6T0R5vdxJO" +
+ "R2mD+4dUjVjZFQf6RFZJ8rFskqu7VMy3EjDuzE2K5wH1nnG971lZjE1GMMpMLzVo" +
+ "tmMJoN2gv8yApnCpgihcVoiUFH+c9nnbz+momOTD2WTT5sRko0skZYttki1bLSVY" +
+ "mmMY0wqhWnGhdSllSSW9z4amEW8VfPq+6qyaeu2jZNvXtEl6ptryvUoxwqtXN1Fm" +
+ "Yqyc7Jqlsb2TXkulki/galjcAwqxIxJEkIZjxWvohjDLbjDg3VHCdKtlCUmTvHq1" +
+ "g1bKsb1nufaqpD0uQWNon9Cdrrb3LTMlSbUTSbK0ohajIvgjH+99Bt8p3n6qleSV" +
+ "ZE6o9h2eHZRzpwc3OYmK009E9R328jxMbJvFH6StQnM1NNmLDBWdD/DwdQc+bD7v" +
+ "Uoz8D4pQaY3jgmo4UpCiqrGzZpNbC5h/TXGpNqn1Vaok4ZPk4KphiwyWJy5ZHRwf" +
+ "oiZC34h6SrVlWif7FRHs1+Nuh+L5Hs6k7WWyNKyald2mpMaNp8+jr5z3H5HpDpU/" +
+ "yqPXPAk91O6UFo2PK2u5jy7lWy35Kw+iPIqfOySOpNDJ1k4nqsilXhkeZbW8c56z" +
+ "Rx1kbkR1nBpJ1VUPWotkR0rdsQsexSuL+5pk+Mk2l/i7Oi6XGwkvE5JyD6Ifc0l8" +
+ "iIBO6c0DixXt8Wk0H6+6WxFliWWWhO5P1UUsfx/o/JZJ9iprtPkmjEsfWdqnbtat" +
+ "q24OckqqqnQw+6k7EfBZHMentbUafUcOiqVVVYFUlFKKqejEY6Y+lfo+ubdLJdCu" +
+ "RFXLgVQwrGW3GIYJWGCYwwtWWlUskYxZ+emKaZHyQfWMWTUkP9FV7wTx+WRVUrZI" +
+ "0/KPlYWlUqaINRpIxmMlMfoeftr+7+JP2H69M/jD8xaKRKgSrdibLHI0VxjbdHGN" +
+ "jQd0aMDA0QIQWEpTRDGZrq3R00OH8GFjuAD9iwhU2MP6wiGD+jp0Ymd06Ksv5piO" +
+ "Uq1rMkwZkiw2SmZIUHD5pP5P1qcNmkgD9vum0hi+X4S/PJ3/mfi9rbspyye2Fk1Y" +
+ "tSqo+5O33q0nAeTHbg7lc2zBxS2K2xjL/dLmkWZGHQNxp9NkyrGxuvp9akHp3+A3" +
+ "ROSdXUb1air5yyvdI8km6PrIgEskaR1ceOmv5q4dpNp4dofKup3NzUTxsvxlZbZ/" +
+ "V7KshwsVcSqwxapT6487uYnOE9IdPT5DshyR8GTg8yZIxO7D2Xoe8wbPD2vkrki1" +
+ "J6oe6xXDYppjTbDezUkdjZXVjE75bVWXRUdldu05D4OvVbD8SxVZLZ009nJEkSTN" +
+ "7Y8kpPWH5pUvT49iIMA9AfIDJEZQpYI0oY5HlZOHxMMSe9WuihVMpamSnEH4RE9Z" +
+ "aWlkKsWrVSPdFT2zJGJOHBVlVUrpTJRywuMlV0T9myzARkClqiJX70kgpcYzsakR" +
+ "kiRXw/k/H9sfrouz/j/oVDN7/u1hxCRIRZULOfq+KvHsxm1M2jkhY7WeUc1j/ARD" +
+ "X9g55b0y0OAkCC5cP+IWkuBkJyInN3reK6uz5oJ3cmh5kk5SOROSWbV3cz6GtQbZ" +
+ "KFKWuNFtiyrDpfLMzGSYWFVpVVZYebEEsBqBXBsjMbarG2x/fZQ+jLYbHHqNwzdK" +
+ "EarMZjYxuuOPbI9sySN6HDIRKMbSRBlKUoJjSMbaV15eryvBqvJXDYi8l107GrKu" +
+ "rrePql/G999PfuvQQNubc1orFGJnz9/3e/n38NvhXHdrlX0hVyULe2vF4tSELMby" +
+ "nXaVdIyzVzptzbpG0kYyrYmUstRUilMV6qhiUaXUqU2t22sqVUgIrrtLQ1QdExSK" +
+ "lSKNIKNDYBCEhONtcvec081daISsVrnNwhsmVFh9UnkeSpU/Ucu0cHJG1Tws6MbG" +
+ "5/FVq2qhSlIpMbqkdPrfnJsRP5LJP3kl8j+YotqNDkj+2rYWxbJPER5OzzamSJYm" +
+ "ofxdXtOqPt84dU9J+/4gPBe8BUHiJMP6uXrNpwqwttVSaxGF+jEifCpFfxSkr9mc" +
+ "32c3S3Szbd2ZoiFIb5ZGYtnEkdJ+Try/CPL9Mi5mMdh+Ug/lZFsslk+ZJ6Es33Tm" +
+ "ZHKzR+qo+jHqk0bPR7vVXJrn+XaeaslpRZLB6fWTy0fm4NJO9fzVkjpKW2+cmMea" +
+ "KKivw3yNm0nsxo0qY/JPx9o926TeJg2Itr4mV3UibG6zyzGVVRZRZzUmJYrYjeJP" +
+ "tG57vdmClZ7rv1y8228aKmVl6+qvZfKRcLOG6ldOqd/Vu6vnzdTvHSaWdJCUkjhk" +
+ "kn7Gk+eiZHzRJjshqSwqyDyZ80X6SPqx722PQanWebyOhb9n7djstjZ4dY2OQxL8" +
+ "hdS7hgfQ+5CDkj7o7K4g5yNpyOpPqRywlpQRSDKSubGQjFYyaHIAwiqRam0sMSLC" +
+ "sJviL0yJ2OkeKEslhZYLLIdXuqTrJIqKaZP1acJCcH4eh1+kfB93b1WTnIpa+SDt" +
+ "JnSUSfEhNliaKTnK6bk2NUtOpwxwxVUbNmx5x8lIqppySP7fkeJPkfA/GZNlaB85" +
+ "U/xOGz7nG7VxLbFvOJRc267dY5TS32y82q967Sok5Aw3FStphVLMYoq5nJ05S7XG" +
+ "3bTWXLtislaIjwcKpUlVZ5bNl3MjhW/1ibOUVX6bGO9ltr3qNM4ZOuTmdlJHaTrd" +
+ "opbJmZI0WRqsr4Q/tfrZ3oi2RVBaIqi1MzEkmVJ0pnG2r43k6qGCL9Kkpczv4SeP" +
+ "sFeTIEBc3DtAZcH6XxGW7Yaw+DznoSqyrouIMcMHbjD/FBny/X179rvtjikQCcgQ" +
+ "E4HS222zVI+KD/aP1IS0pJSBYzn2USdPSTTu868arlGQodZ/tyxVyU5RrlBdEqjR" +
+ "+4KCHQDi6aQjlScf+T5kjee1Xoxo/SOOyTCd1xDlX+YN/MVvtOj2tXZXckMqqZHZ" +
+ "EKEQlkdnL7Jdydlgmev89uU78j5cSJ/l8dkmE7rhzD8qadHMH4jZj3nDGPdwajh7" +
+ "sMdnVu5ujXXl+T1/u4LOHgw0+z8FGBY2M89iIokYQvh0gpDsMgXC5N6MMVWqIDKF" +
+ "k7Bhi7LCa12ZnoYVi5gcGP9X5TyVn5jjpmK38e0H0yNy9sy6krJx2NyXEkufYjPY" +
+ "35HJdzHaIWeWpGch1C2GpaeIIyAyJiVK/Gotmvs6vH4XixysdNfO67ZuafPse3Xt" +
+ "czmeH1mHV6i2qvNHrsuyeFJj1OGjd4Zq4YLjGTExlUsVV/xcbG0nNuxlxTLllUUB" +
+ "hE0vYrX0AxuvoyLWYktLUDBX8H5cYsLkOfeXyz9A4QbZ7J00FTnG94VNve5NkYen" +
+ "LptnR61av5SHOPZVdEI2fk5/k3VxOX5PckzZv1ec8TchyRzOOqs5zOUkm0wWPJVW" +
+ "TC1sxMVVTWOfpWxnsx/JmyBRsFWNsiIqoVUFReZrK80s5jqpOqvOS43zEuyOx1cp" +
+ "0Y8OhOW7ME8lk6LCeFLjEsFSqpSyelXJhXAcdpsp0Y6/OqpWhUMVm2xjyTgU6nrw" +
+ "6yszFUttktLZVtnXi3kuDRtDz/sJ5OxXV22LVZKMYxihA2Q/Dq/NjZ+535t7PF0a" +
+ "3E6sM0t90PBzJHT5SRrz+MtSHquWXGSMc07ChTvJ7sjSm49U8JK0NlKrXIMbnnPC" +
+ "0qUqjU5Jxyt7ynN5e/kM7y2YxjGrVeTE5xqbVT8LiY6bpo+ZdRG82/fr1m22xZSB" +
+ "38PxIyNMShQiH6G9hXLOZK6w3N5+X72HFAxu5NSfRpW6afRXqo8VJGH9x5ObPuVJ" +
+ "QLAiFlH6/u/FbMJ3EnnDq7T0En449m8JHNPxcyzXSV7BCP9JENSIjTahAiKfMpQX" +
+ "fhvwg6xjTyfA09UakjGjZSMkcm0k69uDQkz5aTWCW2iz7hlcSciTjD3IoFZBYmNt" +
+ "odoFMMIkDWQjASGk0NA76DcIySAGLYwAZPQkVbS9raOCXx0N4NPJAcpTE24YEIYy" +
+ "g7CfLWmi2E1TDcjdkTMXE0qKsqvYI1Rc1zUWKjBt3dZMYLSc1V8teNrSwW867u67" +
+ "u3XWz3uiTDJ7uup6aktGEa9d1hTNubvV2q883d3IoqVnZHRyRZT547K2nlbs57pm" +
+ "7cLQoYwF2iZPBBH+5LQ7dYkkhI6u5sNK9nPxux2bnayrYrkTq+u7erJbBUNziMaP" +
+ "rppVcY3SxyySyySfFXkjZSuA61FVMKi5jFHB+UxNKWOqcRzfOSQki42nkQs97JyK" +
+ "5amm58SFk3LVSU0uj7SQfqwEfho1r92H6uG22K2lVz+Uf5sqP0dLN/GejmK0sxrP" +
+ "xz1m2/05yx4ONjCbJH9A+8QkhIqoJKiRIQWkkRKAK20HGfR9lFGh2vmzMyyCig/w" +
+ "mlAinByNccszHu826vNs08OjdXU3GzSpwG2/sZ6SHoyTSVw0slcGjSBnq4UMw08I" +
+ "tvw4uHqDA/w6OSCRnyIh/MH46rxmTFxdHacVc+uD3HvflqHvL7RI7e5edJqb4ZU4" +
+ "09uYztwe+W/IpAaOoyLcwQVPk3k69Fffn6zXZ3kION0cYOXDuS+3vzTOm/K7Mq6H" +
+ "OlZUd7Pxxdl9t69NorsK6eU6442+am88vu73UsgRoV5Z211tTDr33RPyM6/XfL5U" +
+ "EDhtlOMGIOhqVFDMLDExeDQGHON0fZdtpnTpZ6cD6JBkGJpUx0Y0WuppUjCvDGzH" +
+ "Jsmjd0VyNNnRZ1Y1MNHaMbOGzcp3VttssZwsk0gsTGWj6gLXG8FJpoGGjp6NmZZI" +
+ "mQYvcYoaIEFW2vkM2ui4SWaSMLtv6RnW2Q1A4FIHgMRpRK4eNjfwZ5oqGaaSMo5b" +
+ "dknhw4SbOELPGyXLyqGoGSSqSomY1HBBVkQqys9MCWL1YjTEvrT/lW/HvnSpG2HG" +
+ "W0YwPtoufZQEsPWkFdi4q6Bs3tkoppX5Eiaqo5JX1UtH2/gzrxnmXNzE5gfF8iGh" +
+ "wMagId9OeGfjPxGKTtKHVVJ7vT6eMIaVB+wH3n3+jxV4Svh6l0hS2vo/Hxp46W8T" +
+ "mStcsHMrio8lNypolKYqrT5AyFDChtZGHuINKBspBGKg7kJt6Bo8fNBswFHISJJt" +
+ "PcLdHk1+NWshZCgqnMZITrDX2VnDFGhCe+9um2kaWy3BLFDrBte5ISqMa3whRNX2" +
+ "hdsSnCgdmnJiwaaFmqxgEhoSkmS4W5nnc2pOkjMCi0Pn4WGjUumeTCfLJJ1jYrHx" +
+ "jaFRrCj5qXWxkTinm7fk9Hu2JvELPk8MMVKpWKtKq1iVVKKUxXlx31G9Tw/vO6Mb" +
+ "E80lYmSJp0FRrDJyLJ51U9ZI6GiLTUsTlnZqBqxHcOldSSip2iosJI2Ehx0kHxDZ" +
+ "/AZNzYUGDTXrMplachkVuS1tsiYIYyt2mzZDErJJWTTEalrQplZC7YM+li2SUoxV" +
+ "VZY0yZkycNIiDcCJMaGNe5kXBpN+8HIUgoKqYnY1JISR6tshCE6JhknVjg6cMhWn" +
+ "JNlbSdppsotV9zG202HYjiEnmTz+E7xXhSrLv5ZtdazVbW2hjEYNKDGEBkJ9/vy+" +
+ "vnrFURs1YvpvLuyE245w0VLL1kr7cOg/Ba/Qf0QM8JPxZLLOStL5KZ+faXr7LE9j" +
+ "17oH4+OiR8orIu4h/RAagtxGICYpOWtBCN8eXMu7rl485VKQmKi+aU6rwbyfLXpr" +
+ "161+qbettfqWN0pL88tJbgpKWur4a8ki2arIszGhZJVK03h6o84nieE+RSDA2EJn" +
+ "ygppzrRHjjDHHjQ3oAGNIa0QIJjBiGd8s3glSnsMZSEY1I4BqCBOrFtgXZ7YoGff" +
+ "5SOeYkWToVOR6a7/Dmyl7pPebOTUlLEYebR5Ikzr5O+azEJXRy731dGOXtcW5mTx" +
+ "HG7GnHVxIbSbnuyUslYdMltVhpO7tytjo3Cx2IyGZDKmmWOxCaYRisSq0VhSVpit" +
+ "JWkrS3VY0DcaigxKkRFVBNRkkg1UhOMurldw8knJjznZobpJOCnNMtmM9JI/gses" +
+ "Dl0es/T0c4b+aSO5yy8it57PtER7yQ49svq6K2KoqVhjFUqmm02P9rP+enbyTaJy" +
+ "k7zyB5VdEyRHyqE2jlT/N+4jPJHNVfOPajFtvo+bRIhxDIiAREIBEBHmAseJvCKp" +
+ "aWSr3OREAnaST8LJp9TClbcGN022eOxs0mObY5x+f0+u0ck5RKKUopJrgB87bebv" +
+ "yv5u7W3q/fvzQ+JGypskPUreRLIrmybatMsX0a/RksaxtIKIX8sn739qsebzOZiG" +
+ "by7s3vdaJR6Dj2macG0WSRT7SDN9KC4xmGSRgRYwaf7MbwGIOPrP6Rb8N/DY1I1H" +
+ "JIkrMaQbxJHdIbifDkh15l2d27BHRHVPKch+6RBzeUnBMtctc4pKUyuu2upJrlrq" +
+ "667pW6+1t+6Vk20JkkpYV59A5unxbofu3vn21Ey/s+HYx9zasPu1JNm5an1x85Hp" +
+ "GG1LFk0RAJ1kfSK+E9UPntJMsjrKWnc/YuFg5pe8Oyx5qIpZEbwKh7e7yTBhymws" +
+ "JtGzb8PDzkfvPfLZJ5yR/o9pH2H9KqdtVVX7VbbWI2Nmr22lllliKehVTXVI09Cd" +
+ "Z/Ou/e1aKs8lfvPiSD3/Bks8PeYcuVmGgTKW2WyVY/isZRxJN2T4vyfP0vRyfZZK" +
+ "rbaZNZsTidKX8ofEcnunxzNEJWu9xbuQ3w1er3T4Y3g7/gteJ4WVbTtmn85O7lJ/" +
+ "VEnkTJ9atqsYYYeujDUxIwoxR56sknNj7SbuGneRs8nq4fJO2cpuiWKioslVKlRS" +
+ "pJZ/ULtdlKi0b+Z81+yixKtJIPDdvJ+LvDu0SyY/h7/w/FiNs+mias1cSpOznIPK" +
+ "yrHt1CY942YTzH+yrZIoqhOEiZIT845d3T6Pps/6Ofl4bEm9vIZB/UJBbEtgRgyB" +
+ "QrgTP96/o80lj8FrpZ3WuiX6brraSSqxRuxjTFUbWarrGGKMDbBcSioFSqf3ZLaC" +
+ "XBlKqfB9CZLWcmutdlVXXxEzqHZVo2a5uZjrbE5X5CvSKi2WpbDaOR0OqaV2Vjxq" +
+ "myEND13YGGgTBqRBqAkgipVktsk1bJm28lu2ll5dkUpklpVLKkqjThs7SaJqeWRG" +
+ "VasWSxZLZu4aIgE5GtmzUkyWRexTG+WO1qi40I7X+GXLi6g1d5IU5Kydn5ZoeE4k" +
+ "iNK7HJJHZ32hk/RzVTRzKwrOelrcXxZCb6V8ambb6i+3z7g8vV7o2qRK3bNfx+d9" +
+ "az5ZypWyvNOJkq2zTDGW3I2kxsrRVg0qaU6NmxvJVssZPf5Ch3jJZiNskkJC5thW" +
+ "jziKca5yYTlK0RAJy2l5f1mHrY2Dc6OkI2TTTy2TGVsRATPxGssjZRlnpIg3iSRi" +
+ "xI5OR2SOZJPl5/ncvR8vln1Y/uaaeTGFSl5VO11Z1vnvja5W9Kw09ahkgtDDYyAY" +
+ "Qw/WRKMp5aFVusKrZpjSKdZ3v58tazxmJb6NXQlD2AabBtG1MLD6P6xKQChW0XsB" +
+ "77Y5z/JBkkMXpKgXiWquYcP3Pv6+I4oBI7HediIrxI/Ei95EsFOQPxkk78pP8rbI" +
+ "tJ+v+lu6eiHk6+Kqz+L5PSR4npITj7fgsgl+q1VWGLPweJJjUnC/Grtc/J2G01ZT" +
+ "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" +
+ "GRBBBBBEkFZVQUUkTHdrccRvm2/fthj1pS2KWAbKGFox0dOmXvOlr51nWKGJum43" +
+ "BBBIJBq/KsYn0ippp9W01W5ZRjbTSfDNkM7isVOp5Wk82WrJNLTsbRZZzsMYDiQS" +
+ "QQGRB573Pe988yZmZmaB0HgHcz7ZHJKFgkEgyIkiSS9eHnk2SvPDryK1aqqqmtW4" +
+ "PSycD/w8sflE+v8v83/dyIplqpb1llszKa0Kl8tWXbMGzMy8XWnF0X937o/wO4fq" +
+ "0+r7tk9qe2FJ6z3CkozLYqzEKiqUFDKGP7kqsHaWq1aDYcCQokp/eU+vt7uZp4fD" +
+ "vw29FcKUSuratW2rX7I00/UcnqCIfPyP4ftqCVUyNaqZi2P7Lo2/nvtw1Ntxu2Ov" +
+ "M1cLOMOjTdl/Jw/jqwjhrHX7ljvTS0Ng9YWklWliFUpZUiCjOKclNiKmjWdFMjuo" +
+ "dSAo96JmslmGgyCeUmmjEtITqi4DqWXTg4318osVuX2Vfa63aYJNvvZpHIUVXXbr" +
+ "pPMYqxKrXRvoXCGuFnXhSb4SVZtAm6ojtvuIBkdOcqdgEZ6lcZZFN1kPKhJJhRBr" +
+ "WEQyIWkl1hnFU3uys63k4eJJlSIMlKqoErDI6G4EEUnpZfaOrlixLp9DvOUpB4Ta" +
+ "n2/ZW/q+fvPhH07t9H4MT16XESiARMKUE/rVVU3KNwDooJ7dlAzgnD7EhScMIYxZ" +
+ "/mOidHDestpVUIAEgC0t7/m9fLzzvPVb1fK+s+Y+f0Pon6xzJ9vzOD8R9GeLf1T5" +
+ "3aq222kVRIqwftW1VyfHRO+89MPe5zaktbKQr49+/jZmajwxNu3Zk7fVWkSWG+K2" +
+ "a1xZlKFOw5BlJpDTgyzEORiGVhmzt4tctufPV1DsnIxdsV3SbUdlXBrTgwnt41HJ" +
+ "0263X9faPss1y+iNSMUfp/X6ff7/6/TW98cccp1bYjhzq/3uXPJj5bT8/7W+nhNo" +
+ "/69v1+jGyfY/aaf9UV6T6SQPl1Bq30rH6H4yV69J/bdqqKoSHon4AEpmUtPAez+t" +
+ "92Y5lOj2CJ7CYdkZxf0D3R/XfsuFMS/C43Nv5T9sfMZV4L/G9pvd03/3mq9yzlm2" +
+ "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" +
+ "YS1EJA9jWfE+/5tRUV1ipCoof2zsjgKQ8vpHUIwQU4hNNSOW4tYulfaqfz6P4wYH" +
+ "GDM4DID3+NqN1ONUA/PfuPMRXS88tk7zKq/wt5RmaVy9WAxsjPw3pHVUomq01Y27" +
+ "q1V1m7Yd2KfWl+O5Zq7729d9zZ0l0p3fEcrJ5YgfbvWje7O3f3xZrowIWRkq4O+T" +
+ "FRyxJpiWo4lFPH3WrGdl4cvrRgQWOs7e+Rm7Fg5SGPs7K8wII3++tGhUMYuglST7" +
+ "5KtdoyntNOHVVlYkvFyJtG6k2rcPNYnRazDvM0jtv9e0GxHtPw9lbsVHo999iMnW" +
+ "ySQyREBBJkSLp6BsnvG/p9faVUKlPzdQ/ZVIRVFqLwVZA3bCzzChJo/VG3vBX5SF" +
+ "rWK1RZmzbONI5WDQJSoSvFrWQPYWLVWpk4wJi851alamk1f8QZvBepyqUITCUW1M" +
+ "PO3E+bYpbGJWorqrG+spHFPy6ovW+piPxPDpvMK9cLBMXT02D897907tO7q6Tqpw" +
+ "mu19VLVj5w68m9aLxrh5pRd60Z1Y7OPlnWyT67h8VWsGO4nUUKiC8Pu5yxhCT898" +
+ "xuvPfY+fhoRK5T5qvf5+ore9q8fDLTyk2u/mia2vXGhbTXwjpwro94vOKUYpdrNK" +
+ "/ilIKJN59XedxQPPGvYqUmlTpq88kgneW7DHmiG23HMo7Zsh04+H7xMdo7xOJJtY" +
+ "eizcYZdt7XbKVK6OL4vQLe/M+3jq86SgU5889oFKfPVuxF3wlFrkIun9efjz79d+" +
+ "wYeN/C+u3m1rd0jFGq9X89KmLLXN2C5Po/veZd64ndf3MKIxsceKwWTeL7MD3i1L" +
+ "FVj6xz2pzr8QKCFNCFKpIp+xTH6JnyBsNsPitQloYgqd1l5g4jhq6cPDUvHlmwrI" +
+ "oOhRQkOJcJfIaDs0KhNWaJJhi4g5WXdYcDKbkpiy7o20IRRpRFyOFooQ42GI3+Su" +
+ "oMuUwozR5RSK47UcIoQsIwhhRiAXHRoVM/c+S9/l9R47JC+j+m/Feaff6jz8TUQc" +
+ "fBu36cbfXyrsgqiUIyVfLNwCKvgnlBRwKKm+brfbFcOClV8LfTPJElZDw+Yw7n3R" +
+ "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" +
+ "9Ie3XnPlekWLviZo7sWzm9WT4r4vmvd4+Mn1zI9eadvv8/FYv0fllb9OdHfmF98c" +
+ "xiihhSVRBRSemqq32pgz4bzMD6OjNYamHHHp0WsLbYyKxZ3mLD52kY91zW6fPB9d" +
+ "GObcd2fPPjX0d4du7bA4tvfmSzb6t9NouC2GU+LHHGJNXK4s3xiY6MfbxT4Z83cZ" +
+ "UuZDLGk0mY/Z/iHrRxSY3S1SG9mvzS+bvxc44Th6JqNHLLC4ZR+p+NfpU+sMTeHg" +
+ "a67ZI7LO0gsjRa278NqHpyOH+PRsdMcqF5x65vjp0KeJjqR4dknzo+Zsle+oZmSN" +
+ "f8ttztuTWnh+4V2fpXP02u7ttibExiUsNhbdfPzh1+rQ09U+enFtXS5qQkjjxMd8" +
+ "MkkY56cYwqZcb6vi222vU9cyYersXMh7cOOI2Y7Viz6BNspac/J9fjp3RQw/gqpU" +
+ "1kIPpx1mbn6DEJI5wLjKElOj3z3XAvFr+HD+fSn8rhs166dJp1CBw82PeVw26dIv" +
+ "7MUi/KQbLXXHt4nPh0fSOYs35zI1WtZGrbfqaOvlNp6VywnitCl7G/RjngwTGOXw" +
+ "v3ThnnFFDb8PHJ2lL1vMzxiXS7Hci9P169PULTtp8MorSZB25VNA4Pw6X609+3Vz" +
+ "WTVcyRy2dbt8H177mEWSRvh8M+vSerjnx/SZfuZ0beIXSUuzna/Om+czLbbbVfTz" +
+ "54naAdd+pE26qa+jh4iOkG3g+U1FmjxmGX6Gj40+jLEntyrIn7/D+T8fy1+Pjjup" +
+ "Bc3CtbNuXO2tRdulIu21ItGsL9ccDt6aEtrxfwXjqcDx58HqqhesQkkFR5Hw5s+Y" +
+ "95rjxZ49Zxzzzs55zny5Y/Trf42ninShp2tC5MykPXPDq/HSuOcy/Hrg+uXOZjhw" +
+ "qpi7evQ+G3aueLbIW2pPLBOXPB2k0qeWcvH8dPX3537NGVVjFVhhjKxliVkqkjay" +
+ "ptqZq2S1WktJVZNtVJa0VtCm2mzbZsiNNZVVSy2ti1tS2Sq3md9hy4638z5PHNMz" +
+ "Ix3IfMkD8jgU/hevg0z6O9vrhfx2u0pdXi4ooddn1WwLTt3u0dtfx13/DwegMQYQ" +
+ "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" +
+ "Lj5me++lriwkeI4ck6bca2nHauuzfPTyrxRXIm23TPacNjajfNUa97T754q3c0rP" +
+ "IE5Nere/DaZzyBPTHL667M6YMUiwUw84c4W+5rlfVR6zxCzaeKly9x9x6DhaooPI" +
+ "1CNpPHVtq129Z3bpzpOM14nhw8c8mvgVGdYiu3n1jtni6FPTxEt8uOLVAnqxzGvU" +
+ "4XXlc09EDkrS68VHEuLovfh0kKjn16nx2624KnuSnHXYVkIprh8uKrXkxp5Z3aqc" +
+ "aeE59GkSJ0a8drt6aX+06Y9W1WYqdPi+di9Pw6evm8zGnrTzvvv+GSuG79/XDiov" +
+ "H0qepaxPYPTbhXBj1xR4w6Tg6NcOybV4+Om+3X41ItLvfGlU341TWO2R7tSuZO+O" +
+ "3asyajzIENvnh5J4Xw8OuDlfBN8GUCx4420ZVU52z250coXTppy6fELl7Rjpy+nP" +
+ "x28cG3ng7sNCRkisEe3Ltzt62dtbszTgXpLw27ePvRw+vlFcKR0ekbTaMSHDJB5e" +
+ "nZ8vLbTt78dG25fCwkJ//etW1scxPdFsVVsi0tFqS177RsuXJMklSkhrEjSwORa5" +
+ "3WlxTnZfjFJJ8qqYtJkGIYaQX+CRXd/3dKH8uAJ8Y9cu+OcSSPAL6Gs336Z468Zz" +
+ "vNxQRIyXt3dm7s0SAwKIJ5wEk8AwcCHFznBwg8o1kzNO72t3vAPY+sfngZ9dFb0o" +
+ "+X4H6XmWneYezTTiKIZ4CUUD4QEQCdPGmwTwkyTaXmJ2d+i8PAPAvDjERepd2Z2U" +
+ "tFeZqfopOh7VAjAeQ8BPpenxxACAkEQhEExObQ9XlR+e37Iw1mN+ICD34z4TEzKK" +
+ "dyQ5oUQnsRgHH1l1ker09IZ4KIqyrFUOLmqZbKLYUGaGAgOcGgdbwVvRho1lbYNU" +
+ "cdPj1zU4ogY7l1TxfNNPT+zP92ta1Xu6TpY6QeISM9/hrny59kjOErh+Ht2BPj57" +
+ "6L5BzgoCDQAx6HNqd9+Dyvbt27Lq3osAuFDt/Zv5zu78vxMXPz5rDDqp1z+Pi2nh" +
+ "zxuQkFAnqvWm2HD09db9dvJvpZ775mY/Nd5n5du34vVU6F+N+jTb5SesToqJfaen" +
+ "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" +
+ "faqcvPWZmV6OkmSyxFrWcJrWi1kksrvvgqr6xW9zj1ymeq4dcNajmbSDkR2mTlry" +
+ "5AnE7fgk9Tk978Fs2pXhPvjltkl3AXoF93yfjrr84+98655556eaKe/TcvX8+tDp" +
+ "+Pi1RQ8fdUu2pvFdMbdPAQGNN8ivU7S9Ryc166k8yJc5IdVFdb88+uu+/zeZveuG" +
+ "j1wuL35UllCnrTCt7IYcNxThFFbQtqjNZgXr60baY2hffWp4+ubvM/NIWzW5Uj1D" +
+ "p8eU+ZTg3naukLoZzl+a1n3vGta8samSFp7nvlKVuVxKevXTjTg2duJ3SfNK066b" +
+ "lwcPF5xw2+0cZJzrx68c3veNZrGOHXbTSSRwPSDE242fCWz4vTsVKYqOF4bx775p" +
+ "0xeOddrOpVXqcPaqqOW22WtV88c4xmZY7dL6ei956V67bbVtWu+nzM5fLQ6pS9sJ" +
+ "RXrzSp0cNSpHqF1oswXg7xoeipTO2OO3gSMFkwqyWwWmzzmd5mSrkIb9W0R4V052" +
+ "4SQ8m/L07yCFN+NEinDh32PHfHDzfDTYp2pF9vXXneZ84x6vcPRzRtDb1rS9KNoj" +
+ "G3tt8trVSm4nKzy3R6xxhOMVR5krVhMyjGXOrVEkqjaow3ghlCSpZNWBcVaxL3Fc" +
+ "Y9ZJpkrnJzlzh3m8wze+XP8uV2KlNuHovYPm99afPmu8VUqUJ47l3jmZl5eHCqbb" +
+ "HO7xlEBFcBA5Jb3t32Zl9tPvd2smGycKE9uyfDQQPDS8Ltb4qBF9a8qnudmpDwX4" +
+ "+wdtdWPrzp5ZJ51IafAcnZAsPkypcqpRFBAcxIYWs3vTR50fEtvnqdcUo/dUXwei" +
+ "bTydGiJ4PFIOWjex8NM77ddunuIT3rfm5Wc23BHly1Kmmj152czh1j2qUpWYqJEq" +
+ "vL10rcCedpLOreZEjlnPpzu3bt2Pe9pIbbhG5VdskX49R4c9PrbZr3tVMdOn17de" +
+ "nw+aNedrTuVI+Pjo67O359n1jijiSSJ9jstJAwAWh6D6ObOekTEOeh3nAr2g7ynr" +
+ "8xXTOMYFcwj5xiIpx8cwczh8LfyjzhSPBt74x6zvdzHlySLo8nCSRsk0eS6TRbxm" +
+ "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"
diff --git a/gcc/testsuite/go.test/test/bench/go1/revcomp_test.go b/gcc/testsuite/go.test/test/bench/go1/revcomp_test.go
new file mode 100644
index 0000000000..9256164d76
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/revcomp_test.go
@@ -0,0 +1,85 @@
+// 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.
+
+// This benchmark, taken from the shootout, tests array indexing
+// and array bounds elimination performance.
+
+package go1
+
+import (
+ "bufio"
+ "bytes"
+ "io/ioutil"
+ "testing"
+)
+
+var revCompTable = [256]uint8{
+ 'A': 'T', 'a': 'T',
+ 'C': 'G', 'c': 'G',
+ 'G': 'C', 'g': 'C',
+ 'T': 'A', 't': 'A',
+ 'U': 'A', 'u': 'A',
+ 'M': 'K', 'm': 'K',
+ 'R': 'Y', 'r': 'Y',
+ 'W': 'W', 'w': 'W',
+ 'S': 'S', 's': 'S',
+ 'Y': 'R', 'y': 'R',
+ 'K': 'M', 'k': 'M',
+ 'V': 'B', 'v': 'B',
+ 'H': 'D', 'h': 'D',
+ 'D': 'H', 'd': 'H',
+ 'B': 'V', 'b': 'V',
+ 'N': 'N', 'n': 'N',
+}
+
+func revcomp(data []byte) {
+ in := bufio.NewReader(bytes.NewBuffer(data))
+ out := ioutil.Discard
+ buf := make([]byte, 1024*1024)
+ line, err := in.ReadSlice('\n')
+ for err == nil {
+ out.Write(line)
+
+ // Accumulate reversed complement in buf[w:]
+ nchar := 0
+ w := len(buf)
+ for {
+ line, err = in.ReadSlice('\n')
+ if err != nil || line[0] == '>' {
+ break
+ }
+ line = line[0 : len(line)-1]
+ nchar += len(line)
+ if len(line)+nchar/60+128 >= w {
+ nbuf := make([]byte, len(buf)*5)
+ copy(nbuf[len(nbuf)-len(buf):], buf)
+ w += len(nbuf) - len(buf)
+ buf = nbuf
+ }
+
+ // This loop is the bottleneck.
+ for _, c := range line {
+ w--
+ buf[w] = revCompTable[c]
+ }
+ }
+
+ // Copy down to beginning of buffer, inserting newlines.
+ // The loop left room for the newlines and 128 bytes of padding.
+ i := 0
+ for j := w; j < len(buf); j += 60 {
+ n := copy(buf[i:i+60], buf[j:])
+ buf[i+n] = '\n'
+ i += n + 1
+ }
+ out.Write(buf[0:i])
+ }
+}
+
+func BenchmarkRevcomp25M(b *testing.B) {
+ b.SetBytes(int64(len(fasta25m)))
+ for i := 0; i < b.N; i++ {
+ revcomp(fasta25m)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/go1/template_test.go b/gcc/testsuite/go.test/test/bench/go1/template_test.go
new file mode 100644
index 0000000000..db4839a488
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/go1/template_test.go
@@ -0,0 +1,76 @@
+// 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.
+
+// This benchmark tests text/template throughput,
+// converting a large data structure with a simple template.
+
+package go1
+
+import (
+ "bytes"
+ "io/ioutil"
+ "strings"
+ "testing"
+ "text/template"
+)
+
+// After removing \t and \n this generates identical output to
+// json.Marshal, making it easy to test for correctness.
+const tmplText = `
+{
+ "tree":{{template "node" .Tree}},
+ "username":"{{.Username}}"
+}
+{{define "node"}}
+{
+ "name":"{{.Name}}",
+ "kids":[
+ {{range $i, $k := .Kids}}
+ {{if $i}}
+ ,
+ {{end}}
+ {{template "node" $k}}
+ {{end}}
+ ],
+ "cl_weight":{{.CLWeight}},
+ "touches":{{.Touches}},
+ "min_t":{{.MinT}},
+ "max_t":{{.MaxT}},
+ "mean_t":{{.MeanT}}
+}
+{{end}}
+`
+
+func stripTabNL(r rune) rune {
+ if r == '\t' || r == '\n' {
+ return -1
+ }
+ return r
+}
+
+var tmpl = template.Must(template.New("main").Parse(strings.Map(stripTabNL, tmplText)))
+
+func init() {
+ var buf bytes.Buffer
+ if err := tmpl.Execute(&buf, &jsondata); err != nil {
+ panic(err)
+ }
+ if !bytes.Equal(buf.Bytes(), jsonbytes) {
+ println(buf.Len(), len(jsonbytes))
+ panic("wrong output")
+ }
+}
+
+func tmplexec() {
+ if err := tmpl.Execute(ioutil.Discard, &jsondata); err != nil {
+ panic(err)
+ }
+}
+
+func BenchmarkTemplate(b *testing.B) {
+ b.SetBytes(int64(len(jsonbytes)))
+ for i := 0; i < b.N; i++ {
+ tmplexec()
+ }
+}
diff --git a/gcc/testsuite/go.test/test/bench/shootout/Makefile b/gcc/testsuite/go.test/test/bench/shootout/Makefile
new file mode 100644
index 0000000000..e1c9b7b80e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bench/shootout/Makefile
@@ -0,0 +1,14 @@
+# 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.
+
+include ../../../src/Make.inc
+
+all:
+ @echo "make clean or timing"
+
+timing:
+ ./timing.sh
+
+clean:
+ rm -f [568].out *.[568]
diff --git a/gcc/testsuite/go.test/test/bench/binary-tree-freelist.go b/gcc/testsuite/go.test/test/bench/shootout/binary-tree-freelist.go
index 071a4e06e7..071a4e06e7 100644
--- a/gcc/testsuite/go.test/test/bench/binary-tree-freelist.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/binary-tree-freelist.go
diff --git a/gcc/testsuite/go.test/test/bench/binary-tree-freelist.txt b/gcc/testsuite/go.test/test/bench/shootout/binary-tree-freelist.txt
index f8286dd88b..f8286dd88b 100644
--- a/gcc/testsuite/go.test/test/bench/binary-tree-freelist.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/binary-tree-freelist.txt
diff --git a/gcc/testsuite/go.test/test/bench/binary-tree.c b/gcc/testsuite/go.test/test/bench/shootout/binary-tree.c
index 1b4070406f..1b4070406f 100644
--- a/gcc/testsuite/go.test/test/bench/binary-tree.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/binary-tree.c
diff --git a/gcc/testsuite/go.test/test/bench/binary-tree.go b/gcc/testsuite/go.test/test/bench/shootout/binary-tree.go
index 9f867d11a7..9f867d11a7 100644
--- a/gcc/testsuite/go.test/test/bench/binary-tree.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/binary-tree.go
diff --git a/gcc/testsuite/go.test/test/bench/binary-tree.txt b/gcc/testsuite/go.test/test/bench/shootout/binary-tree.txt
index f8286dd88b..f8286dd88b 100644
--- a/gcc/testsuite/go.test/test/bench/binary-tree.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/binary-tree.txt
diff --git a/gcc/testsuite/go.test/test/bench/chameneosredux.c b/gcc/testsuite/go.test/test/bench/shootout/chameneosredux.c
index ed78c31d7b..ed78c31d7b 100644
--- a/gcc/testsuite/go.test/test/bench/chameneosredux.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/chameneosredux.c
diff --git a/gcc/testsuite/go.test/test/bench/chameneosredux.go b/gcc/testsuite/go.test/test/bench/shootout/chameneosredux.go
index 2cb1440041..3395798620 100644
--- a/gcc/testsuite/go.test/test/bench/chameneosredux.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/chameneosredux.go
@@ -49,20 +49,20 @@ const (
)
var complement = [...]int{
- red | red<<2: red,
- red | yellow<<2: blue,
- red | blue<<2: yellow,
- yellow | red<<2: blue,
+ red | red<<2: red,
+ red | yellow<<2: blue,
+ red | blue<<2: yellow,
+ yellow | red<<2: blue,
yellow | yellow<<2: yellow,
- yellow | blue<<2: red,
- blue | red<<2: yellow,
- blue | yellow<<2: red,
- blue | blue<<2: blue,
+ yellow | blue<<2: red,
+ blue | red<<2: yellow,
+ blue | yellow<<2: red,
+ blue | blue<<2: blue,
}
var colname = [...]string{
- blue: "blue",
- red: "red",
+ blue: "blue",
+ red: "red",
yellow: "yellow",
}
diff --git a/gcc/testsuite/go.test/test/bench/chameneosredux.txt b/gcc/testsuite/go.test/test/bench/shootout/chameneosredux.txt
index 6016d59a8c..6016d59a8c 100644
--- a/gcc/testsuite/go.test/test/bench/chameneosredux.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/chameneosredux.txt
diff --git a/gcc/testsuite/go.test/test/bench/fannkuch-parallel.go b/gcc/testsuite/go.test/test/bench/shootout/fannkuch-parallel.go
index 7897eac052..7e9b98d505 100644
--- a/gcc/testsuite/go.test/test/bench/fannkuch-parallel.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/fannkuch-parallel.go
@@ -44,7 +44,7 @@ import (
)
var n = flag.Int("n", 7, "count")
-var nCPU = flag.Int("ncpu", 2, "number of cpus")
+var nCPU = flag.Int("ncpu", 4, "number of cpus")
type Job struct {
start []int
diff --git a/gcc/testsuite/go.test/test/bench/fannkuch-parallel.txt b/gcc/testsuite/go.test/test/bench/shootout/fannkuch-parallel.txt
index e66f779ea1..e66f779ea1 100644
--- a/gcc/testsuite/go.test/test/bench/fannkuch-parallel.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/fannkuch-parallel.txt
diff --git a/gcc/testsuite/go.test/test/bench/fannkuch.c b/gcc/testsuite/go.test/test/bench/shootout/fannkuch.c
index e576b5441f..e576b5441f 100644
--- a/gcc/testsuite/go.test/test/bench/fannkuch.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/fannkuch.c
diff --git a/gcc/testsuite/go.test/test/bench/fannkuch.go b/gcc/testsuite/go.test/test/bench/shootout/fannkuch.go
index b554c77b10..b554c77b10 100644
--- a/gcc/testsuite/go.test/test/bench/fannkuch.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/fannkuch.go
diff --git a/gcc/testsuite/go.test/test/bench/fannkuch.txt b/gcc/testsuite/go.test/test/bench/shootout/fannkuch.txt
index e66f779ea1..e66f779ea1 100644
--- a/gcc/testsuite/go.test/test/bench/fannkuch.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/fannkuch.txt
diff --git a/gcc/testsuite/go.test/test/bench/fasta-1000.out b/gcc/testsuite/go.test/test/bench/shootout/fasta-1000.out
index f1caba0d62..f1caba0d62 100644
--- a/gcc/testsuite/go.test/test/bench/fasta-1000.out
+++ b/gcc/testsuite/go.test/test/bench/shootout/fasta-1000.out
diff --git a/gcc/testsuite/go.test/test/bench/fasta.c b/gcc/testsuite/go.test/test/bench/shootout/fasta.c
index 78a8490d71..64c1c52058 100644
--- a/gcc/testsuite/go.test/test/bench/fasta.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/fasta.c
@@ -41,10 +41,12 @@ POSSIBILITY OF SUCH DAMAGE.
#include <stdlib.h>
#include <string.h>
+#ifndef fwrite_unlocked
// not available on OS X
#define fwrite_unlocked fwrite
#define fputc_unlocked fputc
#define fputs_unlocked fputs
+#endif
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
#define unlikely(x) __builtin_expect((x), 0)
@@ -214,4 +216,4 @@ main(int argc, const char **argv) {
">THREE Homo sapiens frequency\n", n*5, &rand);
return 0;
-} \ No newline at end of file
+}
diff --git a/gcc/testsuite/go.test/test/bench/fasta.go b/gcc/testsuite/go.test/test/bench/shootout/fasta.go
index 470bdb3285..17ff5dae55 100644
--- a/gcc/testsuite/go.test/test/bench/fasta.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/fasta.go
@@ -37,7 +37,6 @@ POSSIBILITY OF SUCH DAMAGE.
package main
import (
- "bytes"
"flag"
"os"
)
@@ -49,7 +48,7 @@ var n = flag.Int("n", 1000, "length of result")
const Line = 60
func Repeat(alu []byte, n int) {
- buf := bytes.Add(alu, alu)
+ buf := append(alu, alu...)
off := 0
for n > 0 {
m := n
@@ -71,7 +70,7 @@ const (
IA = 3877
IC = 29573
- LookupSize = 4096
+ LookupSize = 4096
LookupScale float64 = LookupSize - 1
)
@@ -138,28 +137,28 @@ func main() {
flag.Parse()
iub := []Acid{
- Acid{prob: 0.27, sym: 'a'},
- Acid{prob: 0.12, sym: 'c'},
- Acid{prob: 0.12, sym: 'g'},
- Acid{prob: 0.27, sym: 't'},
- Acid{prob: 0.02, sym: 'B'},
- Acid{prob: 0.02, sym: 'D'},
- Acid{prob: 0.02, sym: 'H'},
- Acid{prob: 0.02, sym: 'K'},
- Acid{prob: 0.02, sym: 'M'},
- Acid{prob: 0.02, sym: 'N'},
- Acid{prob: 0.02, sym: 'R'},
- Acid{prob: 0.02, sym: 'S'},
- Acid{prob: 0.02, sym: 'V'},
- Acid{prob: 0.02, sym: 'W'},
- Acid{prob: 0.02, sym: 'Y'},
+ {prob: 0.27, sym: 'a'},
+ {prob: 0.12, sym: 'c'},
+ {prob: 0.12, sym: 'g'},
+ {prob: 0.27, sym: 't'},
+ {prob: 0.02, sym: 'B'},
+ {prob: 0.02, sym: 'D'},
+ {prob: 0.02, sym: 'H'},
+ {prob: 0.02, sym: 'K'},
+ {prob: 0.02, sym: 'M'},
+ {prob: 0.02, sym: 'N'},
+ {prob: 0.02, sym: 'R'},
+ {prob: 0.02, sym: 'S'},
+ {prob: 0.02, sym: 'V'},
+ {prob: 0.02, sym: 'W'},
+ {prob: 0.02, sym: 'Y'},
}
homosapiens := []Acid{
- Acid{prob: 0.3029549426680, sym: 'a'},
- Acid{prob: 0.1979883004921, sym: 'c'},
- Acid{prob: 0.1975473066391, sym: 'g'},
- Acid{prob: 0.3015094502008, sym: 't'},
+ {prob: 0.3029549426680, sym: 'a'},
+ {prob: 0.1979883004921, sym: 'c'},
+ {prob: 0.1975473066391, sym: 'g'},
+ {prob: 0.3015094502008, sym: 't'},
}
alu := []byte(
@@ -179,7 +178,6 @@ func main() {
Random(homosapiens, 5**n)
}
-
type buffer []byte
func (b *buffer) Flush() {
@@ -192,9 +190,7 @@ func (b *buffer) Flush() {
func (b *buffer) WriteString(s string) {
p := b.NextWrite(len(s))
- for i := 0; i < len(s); i++ {
- p[i] = s[i]
- }
+ copy(p, s)
}
func (b *buffer) NextWrite(n int) []byte {
@@ -204,6 +200,6 @@ func (b *buffer) NextWrite(n int) []byte {
p = *b
}
out := p[len(p) : len(p)+n]
- *b = p[0 : len(p)+n]
+ *b = p[:len(p)+n]
return out
}
diff --git a/gcc/testsuite/go.test/test/bench/fasta.txt b/gcc/testsuite/go.test/test/bench/shootout/fasta.txt
index f1caba0d62..f1caba0d62 100644
--- a/gcc/testsuite/go.test/test/bench/fasta.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/fasta.txt
diff --git a/gcc/testsuite/go.test/test/bench/k-nucleotide-parallel.go b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide-parallel.go
index 0234f33d11..96c80d8f0c 100644
--- a/gcc/testsuite/go.test/test/bench/k-nucleotide-parallel.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide-parallel.go
@@ -41,6 +41,7 @@ import (
"fmt"
"io/ioutil"
"os"
+ "runtime"
"sort"
)
@@ -97,6 +98,7 @@ func printKnucs(a kNucArray) {
}
func main() {
+ runtime.GOMAXPROCS(4)
in := bufio.NewReader(os.Stdin)
three := []byte(">THREE ")
for {
diff --git a/gcc/testsuite/go.test/test/bench/k-nucleotide-parallel.txt b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide-parallel.txt
index 84169b8ec3..84169b8ec3 100644
--- a/gcc/testsuite/go.test/test/bench/k-nucleotide-parallel.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide-parallel.txt
diff --git a/gcc/testsuite/go.test/test/bench/k-nucleotide.c b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.c
index 3bace391c4..3bace391c4 100644
--- a/gcc/testsuite/go.test/test/bench/k-nucleotide.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.c
diff --git a/gcc/testsuite/go.test/test/bench/k-nucleotide.go b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.go
index fdc98ed472..fdc98ed472 100644
--- a/gcc/testsuite/go.test/test/bench/k-nucleotide.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.go
diff --git a/gcc/testsuite/go.test/test/bench/k-nucleotide.txt b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.txt
index 84169b8ec3..84169b8ec3 100644
--- a/gcc/testsuite/go.test/test/bench/k-nucleotide.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/k-nucleotide.txt
diff --git a/gcc/testsuite/go.test/test/bench/mandelbrot.c b/gcc/testsuite/go.test/test/bench/shootout/mandelbrot.c
index c177c088ca..c177c088ca 100644
--- a/gcc/testsuite/go.test/test/bench/mandelbrot.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/mandelbrot.c
diff --git a/gcc/testsuite/go.test/test/bench/mandelbrot.go b/gcc/testsuite/go.test/test/bench/shootout/mandelbrot.go
index 1f9fbfd3d4..1f9fbfd3d4 100644
--- a/gcc/testsuite/go.test/test/bench/mandelbrot.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/mandelbrot.go
diff --git a/gcc/testsuite/go.test/test/bench/mandelbrot.txt b/gcc/testsuite/go.test/test/bench/shootout/mandelbrot.txt
index 2f7bbbc6b0..2f7bbbc6b0 100644
--- a/gcc/testsuite/go.test/test/bench/mandelbrot.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/mandelbrot.txt
Binary files differ
diff --git a/gcc/testsuite/go.test/test/bench/meteor-contest.c b/gcc/testsuite/go.test/test/bench/shootout/meteor-contest.c
index 19c43402c8..19c43402c8 100644
--- a/gcc/testsuite/go.test/test/bench/meteor-contest.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/meteor-contest.c
diff --git a/gcc/testsuite/go.test/test/bench/meteor-contest.go b/gcc/testsuite/go.test/test/bench/shootout/meteor-contest.go
index 6660810ebd..34a4e23f97 100644
--- a/gcc/testsuite/go.test/test/bench/meteor-contest.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/meteor-contest.go
@@ -43,7 +43,6 @@ import (
var max_solutions = flag.Int("n", 2100, "maximum number of solutions")
-
func boolInt(b bool) int8 {
if b {
return 1
@@ -115,7 +114,6 @@ var piece_def = [10][4]int8{
[4]int8{E, E, E, SW},
}
-
/* To minimize the amount of work done in the recursive solve function below,
* I'm going to allocate enough space for all legal rotations of each piece
* at each position on the board. That's 10 pieces x 50 board positions x
@@ -138,7 +136,6 @@ func rotate(dir int8) int8 { return (dir + 2) % PIVOT }
/* Returns the direction flipped on the horizontal axis */
func flip(dir int8) int8 { return (PIVOT - dir) % PIVOT }
-
/* Returns the new cell index from the specified cell in the
* specified direction. The index is only valid if the
* starting cell and direction have been checked by the
@@ -322,7 +319,6 @@ func record_piece(piece int, minimum int8, first_empty int8, piece_mask uint64)
piece_counts[piece][minimum]++
}
-
/* Fill the entire board going cell by cell. If any cells are "trapped"
* they will be left alone.
*/
@@ -351,7 +347,6 @@ func fill_contiguous_space(board []int8, index int8) {
}
}
-
/* To thin the number of pieces, I calculate if any of them trap any empty
* cells at the edges. There are only a handful of exceptions where the
* the board can be solved with the trapped cells. For example: piece 8 can
@@ -382,7 +377,6 @@ func has_island(cell []int8, piece int) bool {
return true
}
-
/* Calculate all six rotations of the specified piece at the specified index.
* We calculate only half of piece 3's rotations. This is because any solution
* found has an identical solution rotated 180 degrees. Thus we can reduce the
@@ -417,7 +411,6 @@ func calc_pieces() {
}
}
-
/* Calculate all 32 possible states for a 5-bit row and all rows that will
* create islands that follow any of the 32 possible rows. These pre-
* calculated 5-bit rows will be used to find islands in a partially solved
@@ -530,7 +523,6 @@ func calc_rows() {
}
}
-
/* Calculate islands while solving the board.
*/
func boardHasIslands(cell int8) int8 {
@@ -545,7 +537,6 @@ func boardHasIslands(cell int8) int8 {
return bad_even_triple[current_triple]
}
-
/* The recursive solve algorithm. Try to place each permutation in the upper-
* leftmost empty cell. Mark off available pieces as it goes along.
* Because the board is a bit mask, the piece number and bit mask must be saved
diff --git a/gcc/testsuite/go.test/test/bench/meteor-contest.txt b/gcc/testsuite/go.test/test/bench/shootout/meteor-contest.txt
index 38d9783d64..38d9783d64 100644
--- a/gcc/testsuite/go.test/test/bench/meteor-contest.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/meteor-contest.txt
diff --git a/gcc/testsuite/go.test/test/bench/nbody.c b/gcc/testsuite/go.test/test/bench/shootout/nbody.c
index 3b95b05929..3b95b05929 100644
--- a/gcc/testsuite/go.test/test/bench/nbody.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/nbody.c
diff --git a/gcc/testsuite/go.test/test/bench/nbody.go b/gcc/testsuite/go.test/test/bench/shootout/nbody.go
index e9f4517e8e..988f3ba9cc 100644
--- a/gcc/testsuite/go.test/test/bench/nbody.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/nbody.go
@@ -125,39 +125,39 @@ func (sys System) advance(dt float64) {
var (
jupiter = Body{
- x: 4.84143144246472090e+00,
- y: -1.16032004402742839e+00,
- z: -1.03622044471123109e-01,
- vx: 1.66007664274403694e-03 * daysPerYear,
- vy: 7.69901118419740425e-03 * daysPerYear,
- vz: -6.90460016972063023e-05 * daysPerYear,
+ x: 4.84143144246472090e+00,
+ y: -1.16032004402742839e+00,
+ z: -1.03622044471123109e-01,
+ vx: 1.66007664274403694e-03 * daysPerYear,
+ vy: 7.69901118419740425e-03 * daysPerYear,
+ vz: -6.90460016972063023e-05 * daysPerYear,
mass: 9.54791938424326609e-04 * solarMass,
}
saturn = Body{
- x: 8.34336671824457987e+00,
- y: 4.12479856412430479e+00,
- z: -4.03523417114321381e-01,
- vx: -2.76742510726862411e-03 * daysPerYear,
- vy: 4.99852801234917238e-03 * daysPerYear,
- vz: 2.30417297573763929e-05 * daysPerYear,
+ x: 8.34336671824457987e+00,
+ y: 4.12479856412430479e+00,
+ z: -4.03523417114321381e-01,
+ vx: -2.76742510726862411e-03 * daysPerYear,
+ vy: 4.99852801234917238e-03 * daysPerYear,
+ vz: 2.30417297573763929e-05 * daysPerYear,
mass: 2.85885980666130812e-04 * solarMass,
}
uranus = Body{
- x: 1.28943695621391310e+01,
- y: -1.51111514016986312e+01,
- z: -2.23307578892655734e-01,
- vx: 2.96460137564761618e-03 * daysPerYear,
- vy: 2.37847173959480950e-03 * daysPerYear,
- vz: -2.96589568540237556e-05 * daysPerYear,
+ x: 1.28943695621391310e+01,
+ y: -1.51111514016986312e+01,
+ z: -2.23307578892655734e-01,
+ vx: 2.96460137564761618e-03 * daysPerYear,
+ vy: 2.37847173959480950e-03 * daysPerYear,
+ vz: -2.96589568540237556e-05 * daysPerYear,
mass: 4.36624404335156298e-05 * solarMass,
}
neptune = Body{
- x: 1.53796971148509165e+01,
- y: -2.59193146099879641e+01,
- z: 1.79258772950371181e-01,
- vx: 2.68067772490389322e-03 * daysPerYear,
- vy: 1.62824170038242295e-03 * daysPerYear,
- vz: -9.51592254519715870e-05 * daysPerYear,
+ x: 1.53796971148509165e+01,
+ y: -2.59193146099879641e+01,
+ z: 1.79258772950371181e-01,
+ vx: 2.68067772490389322e-03 * daysPerYear,
+ vy: 1.62824170038242295e-03 * daysPerYear,
+ vz: -9.51592254519715870e-05 * daysPerYear,
mass: 5.15138902046611451e-05 * solarMass,
}
sun = Body{
diff --git a/gcc/testsuite/go.test/test/bench/nbody.txt b/gcc/testsuite/go.test/test/bench/shootout/nbody.txt
index 1731557ce1..1731557ce1 100644
--- a/gcc/testsuite/go.test/test/bench/nbody.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/nbody.txt
diff --git a/gcc/testsuite/go.test/test/bench/pidigits.c b/gcc/testsuite/go.test/test/bench/shootout/pidigits.c
index c064da0dd2..c064da0dd2 100644
--- a/gcc/testsuite/go.test/test/bench/pidigits.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/pidigits.c
diff --git a/gcc/testsuite/go.test/test/bench/pidigits.go b/gcc/testsuite/go.test/test/bench/shootout/pidigits.go
index dcfb502ce2..a0f21a91db 100644
--- a/gcc/testsuite/go.test/test/bench/pidigits.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/pidigits.go
@@ -38,9 +38,9 @@ POSSIBILITY OF SUCH DAMAGE.
package main
import (
- "big"
"flag"
"fmt"
+ "math/big"
)
var n = flag.Int("n", 27, "number of digits")
@@ -49,6 +49,7 @@ var silent = flag.Bool("s", false, "don't print result")
var (
tmp1 = big.NewInt(0)
tmp2 = big.NewInt(0)
+ tmp3 = big.NewInt(0)
y2 = big.NewInt(0)
bigk = big.NewInt(0)
numer = big.NewInt(1)
@@ -80,7 +81,6 @@ func extract_digit() int64 {
}
func next_term(k int64) {
- // TODO(eds) If big.Int ever gets a Scale method, y2 and bigk could be int64
y2.SetInt64(k*2 + 1)
bigk.SetInt64(k)
@@ -92,15 +92,15 @@ func next_term(k int64) {
}
func eliminate_digit(d int64) {
- tmp := big.NewInt(0).Set(denom)
- accum.Sub(accum, tmp.Mul(tmp, big.NewInt(d)))
+ tmp3.SetInt64(d)
+ accum.Sub(accum, tmp3.Mul(denom, tmp3))
accum.Mul(accum, ten)
numer.Mul(numer, ten)
}
func printf(s string, arg ...interface{}) {
if !*silent {
- fmt.Printf(s, arg)
+ fmt.Printf(s, arg...)
}
}
diff --git a/gcc/testsuite/go.test/test/bench/pidigits.txt b/gcc/testsuite/go.test/test/bench/shootout/pidigits.txt
index ad946a9e85..ad946a9e85 100644
--- a/gcc/testsuite/go.test/test/bench/pidigits.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/pidigits.txt
diff --git a/gcc/testsuite/go.test/test/bench/regex-dna-parallel.go b/gcc/testsuite/go.test/test/bench/shootout/regex-dna-parallel.go
index e8e62b806d..9c6d42101d 100644
--- a/gcc/testsuite/go.test/test/bench/regex-dna-parallel.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/regex-dna-parallel.go
@@ -39,8 +39,8 @@ import (
"fmt"
"io/ioutil"
"os"
- "runtime"
"regexp"
+ "runtime"
)
var variants = []string{
@@ -89,7 +89,7 @@ func countMatches(pat string, bytes []byte) int {
func main() {
runtime.GOMAXPROCS(4)
- bytes, err := ioutil.ReadFile("/dev/stdin")
+ bytes, err := ioutil.ReadAll(os.Stdin)
if err != nil {
fmt.Fprintf(os.Stderr, "can't read input: %s\n", err)
os.Exit(2)
diff --git a/gcc/testsuite/go.test/test/bench/regex-dna-parallel.txt b/gcc/testsuite/go.test/test/bench/shootout/regex-dna-parallel.txt
index e23e71fd6e..e23e71fd6e 100644
--- a/gcc/testsuite/go.test/test/bench/regex-dna-parallel.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/regex-dna-parallel.txt
diff --git a/gcc/testsuite/go.test/test/bench/regex-dna.c b/gcc/testsuite/go.test/test/bench/shootout/regex-dna.c
index 134f8215c7..134f8215c7 100644
--- a/gcc/testsuite/go.test/test/bench/regex-dna.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/regex-dna.c
diff --git a/gcc/testsuite/go.test/test/bench/regex-dna.go b/gcc/testsuite/go.test/test/bench/shootout/regex-dna.go
index dc31db7685..042d7f2836 100644
--- a/gcc/testsuite/go.test/test/bench/regex-dna.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/regex-dna.go
@@ -87,7 +87,7 @@ func countMatches(pat string, bytes []byte) int {
}
func main() {
- bytes, err := ioutil.ReadFile("/dev/stdin")
+ bytes, err := ioutil.ReadAll(os.Stdin)
if err != nil {
fmt.Fprintf(os.Stderr, "can't read input: %s\n", err)
os.Exit(2)
diff --git a/gcc/testsuite/go.test/test/bench/regex-dna.txt b/gcc/testsuite/go.test/test/bench/shootout/regex-dna.txt
index e23e71fd6e..e23e71fd6e 100644
--- a/gcc/testsuite/go.test/test/bench/regex-dna.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/regex-dna.txt
diff --git a/gcc/testsuite/go.test/test/bench/reverse-complement.c b/gcc/testsuite/go.test/test/bench/shootout/reverse-complement.c
index b34c84696e..b34c84696e 100644
--- a/gcc/testsuite/go.test/test/bench/reverse-complement.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/reverse-complement.c
diff --git a/gcc/testsuite/go.test/test/bench/reverse-complement.go b/gcc/testsuite/go.test/test/bench/shootout/reverse-complement.go
index baa30ffccc..baa30ffccc 100644
--- a/gcc/testsuite/go.test/test/bench/reverse-complement.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/reverse-complement.go
diff --git a/gcc/testsuite/go.test/test/bench/reverse-complement.txt b/gcc/testsuite/go.test/test/bench/shootout/reverse-complement.txt
index 14d792ade8..14d792ade8 100644
--- a/gcc/testsuite/go.test/test/bench/reverse-complement.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/reverse-complement.txt
diff --git a/gcc/testsuite/go.test/test/bench/spectral-norm-parallel.go b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm-parallel.go
index 2706f39ec3..2706f39ec3 100644
--- a/gcc/testsuite/go.test/test/bench/spectral-norm-parallel.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm-parallel.go
diff --git a/gcc/testsuite/go.test/test/bench/spectral-norm.c b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm.c
index 832eb3d217..832eb3d217 100644
--- a/gcc/testsuite/go.test/test/bench/spectral-norm.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm.c
diff --git a/gcc/testsuite/go.test/test/bench/spectral-norm.go b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm.go
index 6667f3e04a..6667f3e04a 100644
--- a/gcc/testsuite/go.test/test/bench/spectral-norm.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm.go
diff --git a/gcc/testsuite/go.test/test/bench/spectral-norm.txt b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm.txt
index b9885983ee..b9885983ee 100644
--- a/gcc/testsuite/go.test/test/bench/spectral-norm.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/spectral-norm.txt
diff --git a/gcc/testsuite/go.test/test/bench/threadring.c b/gcc/testsuite/go.test/test/bench/shootout/threadring.c
index 2c4fb77515..2c4fb77515 100644
--- a/gcc/testsuite/go.test/test/bench/threadring.c
+++ b/gcc/testsuite/go.test/test/bench/shootout/threadring.c
diff --git a/gcc/testsuite/go.test/test/bench/threadring.go b/gcc/testsuite/go.test/test/bench/shootout/threadring.go
index 031908a20f..e76dd0b452 100644
--- a/gcc/testsuite/go.test/test/bench/threadring.go
+++ b/gcc/testsuite/go.test/test/bench/shootout/threadring.go
@@ -52,7 +52,7 @@ func f(i int, in <-chan int, out chan<- int) {
fmt.Printf("%d\n", i)
os.Exit(0)
}
- out <- n-1
+ out <- n - 1
}
}
diff --git a/gcc/testsuite/go.test/test/bench/threadring.txt b/gcc/testsuite/go.test/test/bench/shootout/threadring.txt
index f9aaa4d565..f9aaa4d565 100644
--- a/gcc/testsuite/go.test/test/bench/threadring.txt
+++ b/gcc/testsuite/go.test/test/bench/shootout/threadring.txt
diff --git a/gcc/testsuite/go.test/test/bench/timing.log b/gcc/testsuite/go.test/test/bench/shootout/timing.log
index e7b0b48c11..2541a766b7 100644
--- a/gcc/testsuite/go.test/test/bench/timing.log
+++ b/gcc/testsuite/go.test/test/bench/shootout/timing.log
@@ -90,7 +90,7 @@ mandelbrot 5500
gc mandelbrot 74.32u 0.00s 74.35r
gc_B mandelbrot 74.28u 0.01s 74.31r
-meteor 16000
+meteor 2100
# we don't know
gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r
gccgo -O2 meteor-contest.go 0.12u 0.00s 0.14r
@@ -209,7 +209,7 @@ mandelbrot 16000
gc mandelbrot 64.05u 0.02s 64.08r # *** -14%
gc_B mandelbrot 64.10u 0.02s 64.14r # *** -14%
-meteor 16000
+meteor 2100
# we don't know
gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r
gccgo -O2 meteor-contest.go 0.12u 0.00s 0.12r
@@ -307,7 +307,7 @@ mandelbrot 16000
gc mandelbrot 63.31u 0.01s 63.35r # -1%
gc_B mandelbrot 63.29u 0.00s 63.31r # -1%
-meteor 16000
+meteor 2100
# we don't know
gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r
gccgo -O2 meteor-contest.go 0.11u 0.00s 0.12r
@@ -414,7 +414,7 @@ chameneos 6000000
gcc -O2 chameneosredux.c -lpthread 18.00u 303.29s 83.64r
gc chameneosredux 12.10u 0.00s 12.10r # 2.22X faster
-Jan 6, 2009
+Jan 6, 2010
# Long-overdue update. All numbers included in this complete run.
# Some programs (e.g. reverse-complement) rewritten for speed.
@@ -429,7 +429,7 @@ fasta -n 25000000
reverse-complement < output-of-fasta-25000000
gcc -O2 reverse-complement.c 2.00u 0.80s 9.54r
- gccgo -O2 reverse-complement.go 4.57u 0.35s 4.94r # 33% faster
+# gccgo -O2 reverse-complement.go 4.57u 0.35s 4.94r # 33% faster
gc reverse-complement 2.01u 0.38s 2.40r # 3.3X faster
gc_B reverse-complement 1.88u 0.36s 2.24r # 3.2X faster
GOGC=off
@@ -445,7 +445,6 @@ nbody -n 50000000
binary-tree 15 # too slow to use 20
gcc -O2 binary-tree.c -lm 0.86u 0.00s 0.87r
gccgo -O2 binary-tree.go 4.82u 0.41s 5.24r # 2.5X slower
- gccgo -O2 binary-tree-freelist.go 0.00u 0.00s 0.00r
gc binary-tree 7.23u 0.01s 7.25r # # -19%
gc binary-tree-freelist 0.43u 0.00s 0.44r # -9%
@@ -478,7 +477,7 @@ mandelbrot 16000
gc mandelbrot 66.05u 0.00s 66.07r # -3%
gc_B mandelbrot 66.06u 0.00s 66.07r # -3%
-meteor 16000
+meteor 2100
gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r
gccgo -O2 meteor-contest.go 0.12u 0.00s 0.12r
gc meteor-contest 0.17u 0.00s 0.17r
@@ -498,3 +497,406 @@ chameneos 6000000
gcc -O2 chameneosredux.c -lpthread 19.02u 331.08s 90.79r
gc chameneosredux 12.54u 0.00s 12.55r
+Oct 19, 2010
+
+# Another long-overdue update. Some of the code is new; parallel versions
+# of some are added. A few significant improvements.
+
+fasta -n 25000000
+ gcc -O2 fasta.c 4.92u 0.00s 4.93r
+ gccgo -O2 fasta.go 3.31u 0.00s 3.34r # new code
+ gc fasta 3.68u 0.00s 3.69r # 2.5X faster with no code
+ gc_B fasta 3.68u 0.00s 3.69r # 2.3X faster with no code
+
+reverse-complement < output-of-fasta-25000000
+ gcc -O2 reverse-complement.c 1.93u 0.81s 11.24r
+ gccgo -O2 reverse-complement.go 1.58u 0.43s 2.04r # first run with new code?
+ gc reverse-complement 1.84u 0.34s 2.20r # 10% faster
+ gc_B reverse-complement 1.85u 0.32s 2.18r
+
+nbody -n 50000000
+ gcc -O2 nbody.c 21.35u 0.00s 21.36r
+ gccgo -O2 nbody.go 21.62u 0.00s 21.66r # 3.7X faster - why??
+ gc nbody 29.78u 0.00s 29.79r
+ gc_B nbody 29.72u 0.00s 29.72r
+
+binary-tree 15 # too slow to use 20
+ gcc -O2 binary-tree.c -lm 0.86u 0.00s 0.88r
+ gccgo -O2 binary-tree.go 4.05u 0.02s 4.08r # 28% faster
+ gccgo -O2 binary-tree-freelist 0.34u 0.08s 0.34r
+ gc binary-tree 5.94u 0.00s 5.95r # 20% faster
+ gc binary-tree-freelist 0.50u 0.01s 0.54r
+
+fannkuch 12
+ gcc -O2 fannkuch.c 60.45u 0.00s 60.45r
+ gccgo -O2 fannkuch.go 64.64u 0.00s 64.64r
+ gccgo -O2 fannkuch-parallel.go 115.63u 0.00s 31.58r
+ gc fannkuch 126.52u 0.04s 126.68r
+ gc fannkuch-parallel 238.82u 0.10s 65.93r # GOMAXPROCS=4
+ gc_B fannkuch 88.99u 0.00s 89.02r
+
+regex-dna 100000
+ gcc -O2 regex-dna.c -lpcre 0.89u 0.00s 0.89r
+ gc regex-dna 8.99u 0.02s 9.03r
+ gc regex-dna-parallel 8.94u 0.02s 3.68r # GOMAXPROCS=4
+ gc_B regex-dna 9.12u 0.00s 9.14r
+
+spectral-norm 5500
+ gcc -O2 spectral-norm.c -lm 11.55u 0.00s 11.57r
+ gccgo -O2 spectral-norm.go 11.73u 0.00s 11.75r
+ gc spectral-norm 23.74u 0.00s 23.79r
+ gc_B spectral-norm 24.49u 0.02s 24.54r
+
+k-nucleotide 1000000
+ gcc -O2 k-nucleotide.c 11.44u 0.06s 11.50r
+ gccgo -O2 k-nucleotide.go 8.65u 0.04s 8.71r
+ gccgo -O2 k-nucleotide-parallel.go 8.75u 0.03s 2.97r # set GOMAXPROCS=4
+ gc k-nucleotide 14.92u 0.05s 15.01r
+ gc k-nucleotide-parallel 16.96u 0.06s 6.53r # set GOMAXPROCS=4
+ gc_B k-nucleotide 15.97u 0.03s 16.08r
+
+mandelbrot 16000
+ gcc -O2 mandelbrot.c 56.32u 0.00s 56.35r
+ gccgo -O2 mandelbrot.go 55.62u 0.02s 55.77r
+ gc mandelbrot 64.85u 0.01s 64.94r
+ gc_B mandelbrot 65.02u 0.01s 65.14r
+
+meteor 2100
+ gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r
+ gccgo -O2 meteor-contest.go 0.10u 0.00s 0.11r
+ gc meteor-contest 0.17u 0.00s 0.18r
+ gc_B meteor-contest 0.16u 0.00s 0.16r
+
+pidigits 10000
+ gcc -O2 pidigits.c -lgmp 2.58u 0.00s 2.59r
+ gccgo -O2 pidigits.go 14.06u 0.01s 14.09r # first run?
+ gc pidigits 8.47u 0.05s 8.55r # 4.5X faster due to package big
+ gc_B pidigits 8.33u 0.01s 8.36r # 4.5X faster due to package big
+
+threadring 50000000
+ gcc -O2 threadring.c 28.18u 153.19s 186.47r
+ gccgo -O2 threadring.go 110.10u 516.48s 515.25r
+ gc threadring 40.39u 0.00s 40.40r
+
+chameneos 6000000
+ gcc -O2 chameneosredux.c -lpthread 18.20u 301.55s 83.10r
+ gccgo -O2 chameneosredux.go 52.22u 324.54s 201.21r
+ gc chameneosredux 13.52u 0.00s 13.54r
+
+Dec 14, 2010
+
+# Improved regex code (same algorithm) gets ~30%.
+
+regex-dna 100000
+ gcc -O2 regex-dna.c -lpcre 0.77u 0.01s 0.78r
+ gc regex-dna 6.80u 0.00s 6.81r
+ gc regex-dna-parallel 6.82u 0.01s 2.75r
+ gc_B regex-dna 6.69u 0.02s 6.70r
+
+Feb 15, 2011
+
+# Improved GC, still single-threaded but more efficient
+
+fasta -n 25000000
+ gcc -O2 fasta.c 3.40u 0.00s 3.40r
+ gccgo -O2 fasta.go 3.51u 0.00s 3.50r
+ gc fasta 3.66u 0.01s 3.66r
+ gc_B fasta 3.66u 0.00s 3.66r
+
+reverse-complement < output-of-fasta-25000000
+ gcc -O2 reverse-complement.c 1.86u 1.29s 4.93r
+ gccgo -O2 reverse-complement.go 2.18u 0.41s 2.60r
+ gc reverse-complement 1.67u 0.48s 2.15r
+ gc_B reverse-complement 1.71u 0.45s 2.15r
+
+nbody -n 50000000
+ gcc -O2 -lm nbody.c 21.64u 0.00s 21.64r
+ gccgo -O2 nbody.go 21.46u 0.00s 21.45r
+ gc nbody 29.07u 0.00s 29.06r
+ gc_B nbody 31.61u 0.00s 31.61r
+
+binary-tree 15 # too slow to use 20
+ gcc -O2 binary-tree.c -lm 0.88u 0.00s 0.87r
+ gccgo -O2 binary-tree.go 2.74u 0.07s 2.81r
+ gccgo -O2 binary-tree-freelist.go 0.01u 0.00s 0.00r
+ gc binary-tree 4.22u 0.02s 4.24r
+ gc binary-tree-freelist 0.54u 0.02s 0.55r
+
+fannkuch 12
+ gcc -O2 fannkuch.c 57.64u 0.00s 57.64r
+ gccgo -O2 fannkuch.go 65.79u 0.00s 65.82r
+ gccgo -O2 fannkuch-parallel.go 160.91u 0.02s 43.90r
+ gc fannkuch 126.36u 0.03s 126.53r
+ gc fannkuch-parallel 175.23u 0.04s 45.49r
+ gc_B fannkuch 89.23u 0.00s 89.24r
+
+regex-dna 100000
+ gcc -O2 regex-dna.c -lpcre 0.77u 0.01s 0.80r
+ gccgo -O2 regex-dna.go 12.38u 0.10s 12.52r
+ gccgo -O2 regex-dna-parallel.go 43.96u 4.64s 15.11r
+ gc regex-dna 7.03u 0.01s 7.05r
+ gc regex-dna-parallel 6.85u 0.05s 2.70r
+ gc_B regex-dna 6.87u 0.02s 6.89r
+
+spectral-norm 5500
+ gcc -O2 spectral-norm.c -lm 12.29u 0.00s 12.28r
+ gccgo -O2 spectral-norm.go 11.79u 0.00s 11.79r
+ gc spectral-norm 24.00u 0.02s 24.05r
+ gc_B spectral-norm 24.59u 0.01s 24.59r
+
+k-nucleotide 1000000
+ gcc -O2 k-nucleotide.c 9.75u 0.07s 9.82r
+ gccgo -O2 k-nucleotide.go 8.92u 0.06s 8.98r
+ gccgo -O2 k-nucleotide-parallel.go 8.40u 0.04s 2.76r
+ gc k-nucleotide 17.01u 0.03s 17.04r
+ gc k-nucleotide-parallel 16.51u 0.08s 6.21r
+ gc_B k-nucleotide 16.94u 0.08s 17.02r
+
+mandelbrot 16000
+ gcc -O2 mandelbrot.c 54.60u 0.00s 54.66r
+ gccgo -O2 mandelbrot.go 59.38u 0.00s 59.41r
+ gc mandelbrot 64.93u 0.04s 65.08r
+ gc_B mandelbrot 64.85u 0.03s 64.92r
+
+meteor 2098
+ gcc -O2 meteor-contest.c 0.10u 0.01s 0.10r
+ gccgo -O2 meteor-contest.go 0.11u 0.00s 0.11r
+ gc meteor-contest 0.18u 0.00s 0.17r
+ gc_B meteor-contest 0.17u 0.00s 0.16r
+
+pidigits 10000
+ gcc -O2 pidigits.c -lgmp 2.24u 0.00s 2.23r
+ gccgo -O2 pidigits.go 14.05u 0.00s 14.06r
+ gc pidigits 6.34u 0.05s 6.38r
+ gc_B pidigits 6.37u 0.02s 6.38r
+
+threadring 50000000
+ gcc -O2 threadring.c 30.50u 258.05s 325.72r
+ gccgo -O2 threadring.go 92.87u 748.39s 728.46r
+ gc threadring 38.03u 0.01s 38.04r
+
+# Apr 15, 2011
+# Move to new machine, Intel Xeon E5520@2.27GHz.
+# (Was Opteron(tm) Processor 8214 HE)
+
+fasta -n 25000000
+OLD:
+ gcc -O2 fasta.c 3.39u 0.04s 3.42r
+ gccgo -O2 fasta.go 3.52u 0.00s 3.52r
+ gc fasta 3.63u 0.04s 3.67r
+ gc_B fasta 3.66u 0.00s 3.66r
+NEW:
+ gcc -O2 fasta.c 1.45u 0.02s 1.47r
+ gccgo -O2 fasta.go 1.51u 0.01s 1.51r
+ gc fasta 2.04u 0.00s 2.04r
+ gc_B fasta 2.05u 0.00s 2.04r
+
+reverse-complement < output-of-fasta-25000000
+OLD:
+ gcc -O2 reverse-complement.c 1.87u 1.51s 7.02r
+ gccgo -O2 reverse-complement.go 1.56u 0.54s 3.37r
+ gc reverse-complement 1.73u 0.36s 2.08r
+ gc_B reverse-complement 1.75u 0.37s 2.12r
+NEW:
+ gcc -O2 reverse-complement.c 1.20u 0.47s 12.96r
+ gccgo -O2 reverse-complement.go 0.88u 0.14s 1.01r
+ gc reverse-complement 1.13u 0.17s 1.30r
+ gc_B reverse-complement 1.11u 0.09s 1.20r
+
+nbody -n 50000000
+OLD:
+ gcc -O2 -lm nbody.c 21.90u 0.00s 21.92r
+ gccgo -O2 nbody.go 23.12u 0.03s 23.19r
+ gc nbody 29.07u 0.00s 29.07r
+ gc_B nbody 31.84u 0.00s 31.85r
+NEW:
+ gcc -O2 -lm nbody.c 13.01u 0.00s 13.03r
+ gccgo -O2 nbody.go 13.35u 0.00s 13.37r
+ gc nbody 21.78u 0.00s 21.82r
+ gc_B nbody 21.72u 0.00s 21.76r
+
+binary-tree 15 # too slow to use 20
+OLD:
+ gcc -O2 binary-tree.c -lm 0.83u 0.02s 0.84r
+ gccgo -O2 binary-tree.go 2.61u 0.02s 2.62r
+ gccgo -O2 binary-tree-freelist.go 0.32u 0.01s 0.32r
+ gc binary-tree 3.93u 0.04s 3.97r
+ gc binary-tree-freelist 0.47u 0.03s 0.50r
+NEW:
+ gcc -O2 binary-tree.c -lm 0.60u 0.00s 0.59r
+ gccgo -O2 binary-tree.go 1.53u 0.00s 1.52r
+ gccgo -O2 binary-tree-freelist.go 0.01u 0.00s 0.00r
+ gc binary-tree 1.93u 0.02s 1.95r
+ gc binary-tree-freelist 0.32u 0.01s 0.32r
+
+fannkuch 12
+OLD:
+ gcc -O2 fannkuch.c 57.64u 0.00s 57.64r
+ gccgo -O2 fannkuch.go 65.56u 0.01s 65.65r
+ gccgo -O2 fannkuch-parallel.go 179.12u 0.00s 49.82r
+ gc fannkuch 126.39u 0.00s 126.39r
+ gc fannkuch-parallel 172.49u 0.02s 45.44r
+ gc_B fannkuch 89.30u 0.00s 89.28r
+NEW:
+ gcc -O2 fannkuch.c 45.17u 0.00s 45.26r
+ gccgo -O2 fannkuch.go 53.63u 0.00s 53.73r
+ gccgo -O2 fannkuch-parallel.go 216.72u 0.00s 58.42r
+ gc fannkuch 108.21u 0.00s 108.44r
+ gc fannkuch-parallel 227.20u 0.00s 57.27r
+ gc_B fannkuch 56.14u 0.00s 56.26r
+
+regex-dna 100000
+OLD:
+ gcc -O2 regex-dna.c -lpcre 0.77u 0.01s 0.78r
+ gccgo -O2 regex-dna.go 10.15u 0.02s 10.23r
+ gccgo -O2 regex-dna-parallel.go 33.81u 3.22s 11.62r
+ gc regex-dna 6.52u 0.04s 6.56r
+ gc regex-dna-parallel 6.84u 0.03s 2.70r
+ gc_B regex-dna 6.83u 0.01s 6.84r
+NEW:
+ gcc -O2 regex-dna.c -lpcre 0.47u 0.00s 0.47r
+ gccgo -O2 regex-dna.go 6.00u 0.00s 6.00r
+ gccgo -O2 regex-dna-parallel.go 44.54u 1.57s 6.51r
+ gc regex-dna 5.41u 0.01s 5.42r
+ gc regex-dna-parallel 5.62u 0.01s 2.20r
+ gc_B regex-dna 5.50u 0.00s 5.50r
+
+spectral-norm 5500
+OLD:
+ gcc -O2 spectral-norm.c -lm 12.29u 0.00s 12.28r
+ gccgo -O2 spectral-norm.go 11.56u 0.00s 11.55r
+ gc spectral-norm 23.98u 0.00s 24.00r
+ gc_B spectral-norm 24.62u 0.00s 24.65r
+NEW:
+ gcc -O2 spectral-norm.c -lm 15.79u 0.00s 15.82r
+ gccgo -O2 spectral-norm.go 15.32u 0.00s 15.35r
+ gc spectral-norm 19.62u 0.01s 19.67r
+ gc_B spectral-norm 19.62u 0.00s 19.66r
+
+k-nucleotide 1000000
+OLD:
+ gcc -O2 k-nucleotide.c 9.82u 0.06s 9.87r
+ gccgo -O2 k-nucleotide.go 8.30u 0.02s 8.32r
+ gccgo -O2 k-nucleotide-parallel.go 8.84u 0.05s 3.02r
+ gc k-nucleotide 15.38u 0.07s 15.44r
+ gc k-nucleotide-parallel 16.40u 0.03s 5.93r
+ gc_B k-nucleotide 15.19u 0.05s 15.23r
+NEW:
+ gcc -O2 -k-nucleotide.c 4.88u 0.03s 4.92r
+ gccgo -O2 k-nucleotide.go 5.94u 0.01s 5.96r
+ gccgo -O2 k-nucleotide-parallel.go 6.44u 0.03s 1.47r
+ gc k-nucleotide 9.61u 0.01s 9.63r
+ gc k-nucleotide-parallel 9.70u 0.00s 3.39r
+ gc_B k-nucleotide 9.19u 0.03s 9.23r
+
+mandelbrot 16000
+OLD:
+ gcc -O2 mandelbrot.c 54.54u 0.00s 54.56r
+ gccgo -O2 mandelbrot.go 59.63u 0.03s 59.67r
+ gc mandelbrot 64.82u 0.00s 64.83r
+ gc_B mandelbrot 64.84u 0.00s 64.91r
+NEW:
+ gcc -O2 mandelbrot.c 36.07u 0.01s 36.15r
+ gccgo -O2 mandelbrot.go 43.57u 0.00s 43.66r
+ gc mandelbrot 60.66u 0.00s 60.79r
+ gc_B mandelbrot 60.90u 0.00s 61.03r
+
+meteor 2098
+OLD:
+ gcc -O2 meteor-contest.c 0.11u 0.00s 0.10r
+ gccgo -O2 meteor-contest.go 0.10u 0.01s 0.10r
+ gc meteor-contest 0.18u 0.00s 0.17r
+ gc_B meteor-contest 0.17u 0.00s 0.16r
+NEW:
+ gcc -O2 meteor-contest.c 0.10u 0.00s 0.09r
+ gccgo -O2 meteor-contest.go 0.10u 0.00s 0.09r
+ gc meteor-contest 0.14u 0.00s 0.14r
+ gc_B meteor-contest 0.13u 0.00s 0.13r
+
+pidigits 10000
+OLD:
+ gcc -O2 pidigits.c -lgmp 2.22u 0.00s 2.21r
+ gccgo -O2 pidigits.go 13.39u 0.00s 13.40r
+ gc pidigits 6.42u 0.04s 6.45r
+ gc_B pidigits 6.45u 0.02s 6.47r
+NEW:
+ gcc -O2 pidigits.c -lgmp 2.27u 0.00s 2.29r
+ gccgo -O2 pidigits.go 9.21u 0.00s 9.22r
+ gc pidigits 3.60u 0.00s 3.60r
+ gc_B pidigits 3.56u 0.02s 3.58r
+
+threadring 50000000
+OLD:
+ gcc -O2 threadring.c -lpthread 34.51u 267.95s 336.12r
+ gccgo -O2 threadring.go 103.51u 588.57s 627.16r
+ gc threadring 54.68u 0.00s 54.73r
+NEW:
+ gcc -O2 threadring.c 32.00u 259.39s 369.74r
+ gccgo -O2 threadring.go 133.06u 546.02s 595.33r
+ gc threadring 16.75u 0.02s 16.80r
+
+chameneos 6000000
+OLD:
+ gcc -O2 chameneosredux.c -lpthread 12.65u 31.02s 13.33r
+ gccgo -O2 chameneosredux.go 47.04u 302.84s 252.29r
+ gc chameneosredux 14.14u 0.00s 14.14r
+NEW:
+ gcc -O2 chameneosredux.c -lpthread 8.05u 63.43s 11.16r
+ gccgo -O2 chameneosredux.go 82.95u 304.37s 207.64r
+ gc chameneosredux 9.42u 0.00s 9.43r
+
+# May 13, 2011
+# after gc update to inline append when possible - 35% faster
+
+regex-dna 100000
+ gc regex-dna 3.94u 0.00s 3.95r
+ gc regex-dna-parallel 4.15u 0.01s 1.63r
+ gc_B regex-dna 4.01u 0.01s 4.02r
+
+# Aug 4, 2011
+# After various updates to locking code and some runtime changes.
+# Slowdowns believed due to slower (but more correct) memmove.
+
+fannkuch 12
+ gccgo -O2 fannkuch.go 51.59u 0.00s 51.69r # -4%
+ gccgo -O2 fannkuch-parallel.go 253.17u 0.00s 64.67r # -11%
+ gc fannkuch 103.14u 0.00s 103.36r # -5%
+ gc fannkuch-parallel 189.63u 0.00s 49.37r # +9%
+ gc_B fannkuch 49.19u 0.00s 49.29r # -14%
+
+regex-dna 100000
+ gc regex-dna 3.78u 0.00s 3.78r # -43%
+ gc regex-dna-parallel 3.84u 0.02s 1.48r # -49%
+ gc_B regex-dna 3.62u 0.00s 3.63r # -52%
+
+k-nucleotide 1000000
+ gc k-nucleotide 12.23u 0.02s 12.27r # +27%
+ gc k-nucleotide-parallel 12.76u 0.02s 4.37r # +29%
+ gc_B k-nucleotide 12.18u 0.01s 12.21r # +33%
+
+threadring 50000000
+ gc threadring 17.49u 0.00s 17.53r # +4%
+
+chameneos 6000000
+ gc chameneosredux 7.61u 0.00s 7.63r # -24%
+
+Aug 9, 2011
+# After custom algorithms for 1- 2- 4- 8-byte scalars.
+
+fannkuch 12
+ gc fannkuch-parallel 157.17u 0.00s 41.08r # -17%
+
+k-nucleotide 1000000
+ gc k-nucleotide 8.72u 0.03s 8.76r # -39%
+ gc k-nucleotide-parallel 8.79u 0.01s 3.14r # -39%
+ gc_B k-nucleotide 8.65u 0.03s 8.69r # -39%
+
+pidigits 10000
+ gc pidigits 3.71u 0.02s 3.73r # +4%
+ gc_B pidigits 3.73u 0.00s 3.73r # +4%
+
+threadring 50000000
+ gc threadring 14.51u 0.00s 14.54r # -17%
+
+chameneos 6000000
+ gc chameneosredux 7.41u 0.00s 7.42r # -3%
diff --git a/gcc/testsuite/go.test/test/bench/timing.sh b/gcc/testsuite/go.test/test/bench/shootout/timing.sh
index c52c0af94a..3e190e15c8 100755
--- a/gcc/testsuite/go.test/test/bench/timing.sh
+++ b/gcc/testsuite/go.test/test/bench/shootout/timing.sh
@@ -5,9 +5,15 @@
set -e
-eval $(gomake --no-print-directory -f ../../src/Make.inc go-env)
+eval $(gomake --no-print-directory -f ../../../src/Make.inc go-env)
PATH=.:$PATH
+havegccgo=false
+if which gccgo >/dev/null 2>&1
+then
+ havegccgo=true
+fi
+
mode=run
case X"$1" in
X-test)
@@ -30,8 +36,6 @@ runonly() {
fi
}
-
-
run() {
if [ $mode = test ]
then
@@ -57,6 +61,10 @@ run() {
fi
return
fi
+ if ! $havegccgo && echo $1 | grep -q '^gccgo '
+ then
+ return
+ fi
echo -n ' '$1' '
$1
shift
@@ -67,7 +75,7 @@ run() {
fasta() {
runonly echo 'fasta -n 25000000'
run 'gcc -O2 fasta.c' a.out 25000000
- #run 'gccgo -O2 fasta.go' a.out -n 25000000 #commented out until WriteString is in bufio
+ run 'gccgo -O2 fasta.go' a.out -n 25000000 #commented out until WriteString is in bufio
run 'gc fasta' $O.out -n 25000000
run 'gc_B fasta' $O.out -n 25000000
}
@@ -85,7 +93,7 @@ revcomp() {
nbody() {
runonly echo 'nbody -n 50000000'
- run 'gcc -O2 nbody.c' a.out 50000000
+ run 'gcc -O2 -lm nbody.c' a.out 50000000
run 'gccgo -O2 nbody.go' a.out -n 50000000
run 'gc nbody' $O.out -n 50000000
run 'gc_B nbody' $O.out -n 50000000
@@ -115,7 +123,8 @@ regexdna() {
runonly a.out 100000 > x
runonly echo 'regex-dna 100000'
run 'gcc -O2 regex-dna.c -lpcre' a.out <x
-# run 'gccgo -O2 regex-dna.go' a.out <x # pages badly; don't run
+ run 'gccgo -O2 regex-dna.go' a.out <x
+ run 'gccgo -O2 regex-dna-parallel.go' a.out <x
run 'gc regex-dna' $O.out <x
run 'gc regex-dna-parallel' $O.out <x
run 'gc_B regex-dna' $O.out <x
@@ -135,8 +144,8 @@ knucleotide() {
runonly a.out 1000000 > x # should be using 25000000
runonly echo 'k-nucleotide 1000000'
run 'gcc -O2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include k-nucleotide.c -lglib-2.0' a.out <x
- run 'gccgo -O2 k-nucleotide.go' a.out <x # warning: pages badly!
- run 'gccgo -O2 k-nucleotide-parallel.go' a.out <x # warning: pages badly!
+ run 'gccgo -O2 k-nucleotide.go' a.out <x
+ run 'gccgo -O2 k-nucleotide-parallel.go' a.out <x
run 'gc k-nucleotide' $O.out <x
run 'gc k-nucleotide-parallel' $O.out <x
run 'gc_B k-nucleotide' $O.out <x
@@ -152,17 +161,17 @@ mandelbrot() {
}
meteor() {
- runonly echo 'meteor 16000'
- run 'gcc -O2 meteor-contest.c' a.out
- run 'gccgo -O2 meteor-contest.go' a.out
- run 'gc meteor-contest' $O.out
- run 'gc_B meteor-contest' $O.out
+ runonly echo 'meteor 2098'
+ run 'gcc -O2 meteor-contest.c' a.out 2098
+ run 'gccgo -O2 meteor-contest.go' a.out -n 2098
+ run 'gc meteor-contest' $O.out -n 2098
+ run 'gc_B meteor-contest' $O.out -n 2098
}
pidigits() {
runonly echo 'pidigits 10000'
run 'gcc -O2 pidigits.c -lgmp' a.out 10000
-# run 'gccgo -O2 pidigits.go' a.out -n 10000 # uncomment when gccgo library updated
+ run 'gccgo -O2 pidigits.go' a.out -n 10000
run 'gc pidigits' $O.out -n 10000
run 'gc_B pidigits' $O.out -n 10000
}
diff --git a/gcc/testsuite/go.test/test/blank.go b/gcc/testsuite/go.test/test/blank.go
index 681a5e77cb..d6c9e79c60 100644
--- a/gcc/testsuite/go.test/test/blank.go
+++ b/gcc/testsuite/go.test/test/blank.go
@@ -101,6 +101,46 @@ func main() {
}
h(a, b)
+
+ m()
+}
+
+type I interface {
+ M(_ int, y int)
+}
+
+type TI struct{}
+
+func (TI) M(x int, y int) {
+ if x != y {
+ println("invalid M call:", x, y)
+ panic("bad M")
+ }
+}
+
+var fp = func(_ int, y int) {}
+
+func init() {
+ fp = fp1
+}
+
+func fp1(x, y int) {
+ if x != y {
+ println("invalid fp1 call:", x, y)
+ panic("bad fp1")
+ }
+}
+
+
+func m() {
+ var i I
+
+ i = TI{}
+ i.M(1, 1)
+ i.M(2, 2)
+
+ fp(1, 1)
+ fp(2, 2)
}
// useless but legal
@@ -120,3 +160,4 @@ func _() {
func ff() {
var _ int = 1
}
+
diff --git a/gcc/testsuite/go.test/test/blank1.go b/gcc/testsuite/go.test/test/blank1.go
index 5bc1efce5f..bcc78466dc 100644
--- a/gcc/testsuite/go.test/test/blank1.go
+++ b/gcc/testsuite/go.test/test/blank1.go
@@ -9,4 +9,5 @@ package _ // ERROR "invalid package name _"
func main() {
_() // ERROR "cannot use _ as value"
x := _+1 // ERROR "cannot use _ as value"
+ _ = x
}
diff --git a/gcc/testsuite/go.test/test/bugs/bug395.go b/gcc/testsuite/go.test/test/bugs/bug395.go
new file mode 100644
index 0000000000..adf74497cd
--- /dev/null
+++ b/gcc/testsuite/go.test/test/bugs/bug395.go
@@ -0,0 +1,22 @@
+// echo bug395 is broken # takes 90+ seconds to break
+// # $G $D/$F.go || echo bug395
+
+// 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.
+
+// Issue 1909
+// Would OOM due to exponential recursion on Foo's expanded methodset in nodefmt
+package test
+
+type Foo interface {
+ Bar() interface {
+ Foo
+ }
+ Baz() interface {
+ Foo
+ }
+ Bug() interface {
+ Foo
+ }
+}
diff --git a/gcc/testsuite/go.test/test/chan/doubleselect.go b/gcc/testsuite/go.test/test/chan/doubleselect.go
index 592d2f54a4..f8d50c90c0 100644
--- a/gcc/testsuite/go.test/test/chan/doubleselect.go
+++ b/gcc/testsuite/go.test/test/chan/doubleselect.go
@@ -21,6 +21,8 @@ var iterations *int = flag.Int("n", 100000, "number of iterations")
func sender(n int, c1, c2, c3, c4 chan<- int) {
defer close(c1)
defer close(c2)
+ defer close(c3)
+ defer close(c4)
for i := 0; i < n; i++ {
select {
@@ -35,26 +37,18 @@ func sender(n int, c1, c2, c3, c4 chan<- int) {
// mux receives the values from sender and forwards them onto another channel.
// It would be simplier to just have sender's four cases all be the same
// channel, but this doesn't actually trigger the bug.
-func mux(out chan<- int, in <-chan int) {
- for {
- v := <-in
- if closed(in) {
- close(out)
- break
- }
+func mux(out chan<- int, in <-chan int, done chan<- bool) {
+ for v := range in {
out <- v
}
+ done <- true
}
// recver gets a steam of values from the four mux's and checks for duplicates.
func recver(in <-chan int) {
seen := make(map[int]bool)
- for {
- v := <-in
- if closed(in) {
- break
- }
+ for v := range in {
if _, ok := seen[v]; ok {
println("got duplicate value: ", v)
panic("fail")
@@ -70,15 +64,22 @@ func main() {
c2 := make(chan int)
c3 := make(chan int)
c4 := make(chan int)
+ done := make(chan bool)
cmux := make(chan int)
go sender(*iterations, c1, c2, c3, c4)
- go mux(cmux, c1)
- go mux(cmux, c2)
- go mux(cmux, c3)
- go mux(cmux, c4)
+ go mux(cmux, c1, done)
+ go mux(cmux, c2, done)
+ go mux(cmux, c3, done)
+ go mux(cmux, c4, done)
+ go func() {
+ <-done
+ <-done
+ <-done
+ <-done
+ close(cmux)
+ }()
// We keep the recver because it might catch more bugs in the future.
// However, the result of the bug linked to at the top is that we'll
- // end up panicing with: "throw: bad g->status in ready".
+ // end up panicking with: "throw: bad g->status in ready".
recver(cmux)
- print("PASS\n")
}
diff --git a/gcc/testsuite/go.test/test/chan/goroutines.go b/gcc/testsuite/go.test/test/chan/goroutines.go
index d8f8803dfe..371a173876 100644
--- a/gcc/testsuite/go.test/test/chan/goroutines.go
+++ b/gcc/testsuite/go.test/test/chan/goroutines.go
@@ -21,7 +21,7 @@ func f(left, right chan int) {
func main() {
var n = 10000
if len(os.Args) > 1 {
- var err os.Error
+ var err error
n, err = strconv.Atoi(os.Args[1])
if err != nil {
print("bad arg\n")
diff --git a/gcc/testsuite/go.test/test/chan/nonblock.go b/gcc/testsuite/go.test/test/chan/nonblock.go
index 52f04bfb12..9addf12e99 100644
--- a/gcc/testsuite/go.test/test/chan/nonblock.go
+++ b/gcc/testsuite/go.test/test/chan/nonblock.go
@@ -76,7 +76,6 @@ func main() {
var i64 int64
var b bool
var s string
- var ok bool
var sync = make(chan bool)
@@ -86,35 +85,45 @@ func main() {
cb := make(chan bool, buffer)
cs := make(chan string, buffer)
- i32, ok = <-c32
- if ok {
+ select {
+ case i32 = <-c32:
panic("blocked i32sender")
+ default:
}
- i64, ok = <-c64
- if ok {
+ select {
+ case i64 = <-c64:
panic("blocked i64sender")
+ default:
}
- b, ok = <-cb
- if ok {
+ select {
+ case b = <-cb:
panic("blocked bsender")
+ default:
}
- s, ok = <-cs
- if ok {
+ select {
+ case s = <-cs:
panic("blocked ssender")
+ default:
}
go i32receiver(c32, sync)
try := 0
- for !(c32 <- 123) {
- try++
- if try > maxTries {
- println("i32receiver buffer=", buffer)
- panic("fail")
+ Send32:
+ for {
+ select {
+ case c32 <- 123:
+ break Send32
+ default:
+ try++
+ if try > maxTries {
+ println("i32receiver buffer=", buffer)
+ panic("fail")
+ }
+ sleep()
}
- sleep()
}
<-sync
@@ -123,13 +132,19 @@ func main() {
<-sync
}
try = 0
- for i32, ok = <-c32; !ok; i32, ok = <-c32 {
- try++
- if try > maxTries {
- println("i32sender buffer=", buffer)
- panic("fail")
+ Recv32:
+ for {
+ select {
+ case i32 = <-c32:
+ break Recv32
+ default:
+ try++
+ if try > maxTries {
+ println("i32sender buffer=", buffer)
+ panic("fail")
+ }
+ sleep()
}
- sleep()
}
if i32 != 234 {
panic("i32sender value")
@@ -140,12 +155,18 @@ func main() {
go i64receiver(c64, sync)
try = 0
- for !(c64 <- 123456) {
- try++
- if try > maxTries {
- panic("i64receiver")
+ Send64:
+ for {
+ select {
+ case c64 <- 123456:
+ break Send64
+ default:
+ try++
+ if try > maxTries {
+ panic("i64receiver")
+ }
+ sleep()
}
- sleep()
}
<-sync
@@ -154,12 +175,18 @@ func main() {
<-sync
}
try = 0
- for i64, ok = <-c64; !ok; i64, ok = <-c64 {
- try++
- if try > maxTries {
- panic("i64sender")
+ Recv64:
+ for {
+ select {
+ case i64 = <-c64:
+ break Recv64
+ default:
+ try++
+ if try > maxTries {
+ panic("i64sender")
+ }
+ sleep()
}
- sleep()
}
if i64 != 234567 {
panic("i64sender value")
@@ -170,12 +197,18 @@ func main() {
go breceiver(cb, sync)
try = 0
- for !(cb <- true) {
- try++
- if try > maxTries {
- panic("breceiver")
+ SendBool:
+ for {
+ select {
+ case cb <- true:
+ break SendBool
+ default:
+ try++
+ if try > maxTries {
+ panic("breceiver")
+ }
+ sleep()
}
- sleep()
}
<-sync
@@ -184,12 +217,18 @@ func main() {
<-sync
}
try = 0
- for b, ok = <-cb; !ok; b, ok = <-cb {
- try++
- if try > maxTries {
- panic("bsender")
+ RecvBool:
+ for {
+ select {
+ case b = <-cb:
+ break RecvBool
+ default:
+ try++
+ if try > maxTries {
+ panic("bsender")
+ }
+ sleep()
}
- sleep()
}
if !b {
panic("bsender value")
@@ -200,12 +239,18 @@ func main() {
go sreceiver(cs, sync)
try = 0
- for !(cs <- "hello") {
- try++
- if try > maxTries {
- panic("sreceiver")
+ SendString:
+ for {
+ select {
+ case cs <- "hello":
+ break SendString
+ default:
+ try++
+ if try > maxTries {
+ panic("sreceiver")
+ }
+ sleep()
}
- sleep()
}
<-sync
@@ -214,12 +259,18 @@ func main() {
<-sync
}
try = 0
- for s, ok = <-cs; !ok; s, ok = <-cs {
- try++
- if try > maxTries {
- panic("ssender")
+ RecvString:
+ for {
+ select {
+ case s = <-cs:
+ break RecvString
+ default:
+ try++
+ if try > maxTries {
+ panic("ssender")
+ }
+ sleep()
}
- sleep()
}
if s != "hello again" {
panic("ssender value")
@@ -228,5 +279,4 @@ func main() {
<-sync
}
}
- print("PASS\n")
}
diff --git a/gcc/testsuite/go.test/test/chan/perm.go b/gcc/testsuite/go.test/test/chan/perm.go
index d08c035193..a43df19821 100644
--- a/gcc/testsuite/go.test/test/chan/perm.go
+++ b/gcc/testsuite/go.test/test/chan/perm.go
@@ -9,49 +9,50 @@ package main
var (
cr <-chan int
cs chan<- int
- c chan int
+ c chan int
)
func main() {
- cr = c // ok
- cs = c // ok
- c = cr // ERROR "illegal types|incompatible|cannot"
- c = cs // ERROR "illegal types|incompatible|cannot"
- cr = cs // ERROR "illegal types|incompatible|cannot"
- cs = cr // ERROR "illegal types|incompatible|cannot"
-
- c <- 0 // ok
- ok := c <- 0 // ok
- _ = ok
- <-c // ok
+ cr = c // ok
+ cs = c // ok
+ c = cr // ERROR "illegal types|incompatible|cannot"
+ c = cs // ERROR "illegal types|incompatible|cannot"
+ cr = cs // ERROR "illegal types|incompatible|cannot"
+ cs = cr // ERROR "illegal types|incompatible|cannot"
+
+ c <- 0 // ok
+ <-c // ok
x, ok := <-c // ok
_, _ = x, ok
- cr <- 0 // ERROR "send"
- ok = cr <- 0 // ERROR "send"
- _ = ok
- <-cr // ok
+ cr <- 0 // ERROR "send"
+ <-cr // ok
x, ok = <-cr // ok
_, _ = x, ok
- cs <- 0 // ok
- ok = cs <- 0 // ok
- _ = ok
- <-cs // ERROR "receive"
+ cs <- 0 // ok
+ <-cs // ERROR "receive"
x, ok = <-cs // ERROR "receive"
_, _ = x, ok
select {
- case c <- 0: // ok
- case x := <-c: // ok
+ case c <- 0: // ok
+ case x := <-c: // ok
_ = x
- case cr <- 0: // ERROR "send"
- case x := <-cr: // ok
+ case cr <- 0: // ERROR "send"
+ case x := <-cr: // ok
_ = x
- case cs <- 0: // ok
- case x := <-cs: // ERROR "receive"
+ case cs <- 0: // ok
+ case x := <-cs: // ERROR "receive"
_ = x
}
+
+ for _ = range cs {// ERROR "receive"
+ }
+
+ close(c)
+ close(cs)
+ close(cr) // ERROR "receive"
}
diff --git a/gcc/testsuite/go.test/test/chan/select2.go b/gcc/testsuite/go.test/test/chan/select2.go
index e24c51ed16..2cbb86ec62 100644
--- a/gcc/testsuite/go.test/test/chan/select2.go
+++ b/gcc/testsuite/go.test/test/chan/select2.go
@@ -35,14 +35,17 @@ func main() {
go sender(c, 100000)
receiver(c, dummy, 100000)
runtime.GC()
- runtime.MemStats.Alloc = 0
+ memstats := new(runtime.MemStats)
+ runtime.ReadMemStats(memstats)
+ alloc := memstats.Alloc
// second time shouldn't increase footprint by much
go sender(c, 100000)
receiver(c, dummy, 100000)
runtime.GC()
+ runtime.ReadMemStats(memstats)
- if runtime.MemStats.Alloc > 1e5 {
- println("BUG: too much memory for 100,000 selects:", runtime.MemStats.Alloc)
+ if memstats.Alloc-alloc > 1e5 {
+ println("BUG: too much memory for 100,000 selects:", memstats.Alloc-alloc)
}
}
diff --git a/gcc/testsuite/go.test/test/chan/select3.go b/gcc/testsuite/go.test/test/chan/select3.go
index a1a2ef50b5..d919de3e0d 100644
--- a/gcc/testsuite/go.test/test/chan/select3.go
+++ b/gcc/testsuite/go.test/test/chan/select3.go
@@ -58,15 +58,15 @@ func main() {
closedch := make(chan int)
close(closedch)
- // sending/receiving from a nil channel outside a select panics
- testPanic(always, func() {
+ // sending/receiving from a nil channel blocks
+ testBlock(always, func() {
nilch <- 7
})
- testPanic(always, func() {
+ testBlock(always, func() {
<-nilch
})
- // sending/receiving from a nil channel inside a select never panics
+ // sending/receiving from a nil channel inside a select is never selected
testPanic(never, func() {
select {
case nilch <- 7:
@@ -88,22 +88,22 @@ func main() {
ch <- 7
})
- // receiving (a small number of times) from a closed channel never blocks
+ // receiving from a closed channel never blocks
testBlock(never, func() {
for i := 0; i < 10; i++ {
if <-closedch != 0 {
panic("expected zero value when reading from closed channel")
}
+ if x, ok := <-closedch; x != 0 || ok {
+ println("closedch:", x, ok)
+ panic("expected 0, false from closed channel")
+ }
}
})
- // sending (a small number of times) to a closed channel is not specified
- // but the current implementation doesn't block: test that different
- // implementations behave the same
- testBlock(never, func() {
- for i := 0; i < 10; i++ {
- closedch <- 7
- }
+ // sending to a closed channel panics.
+ testPanic(always, func() {
+ closedch <- 7
})
// receiving from a non-ready channel always blocks
@@ -189,7 +189,7 @@ func main() {
}
})
- // selects with closed channels don't block
+ // selects with closed channels behave like ordinary operations
testBlock(never, func() {
select {
case <-closedch:
@@ -197,7 +197,28 @@ func main() {
})
testBlock(never, func() {
select {
+ case x := <-closedch:
+ _ = x
+ }
+ })
+ testBlock(never, func() {
+ select {
+ case x, ok := <-closedch:
+ _, _ = x, ok
+ }
+ })
+ testPanic(always, func() {
+ select {
case closedch <- 7:
}
})
+
+ // select should not get confused if it sees itself
+ testBlock(always, func() {
+ c := make(chan int)
+ select {
+ case c <- 1:
+ case <-c:
+ }
+ })
}
diff --git a/gcc/testsuite/go.test/test/chan/select4.go b/gcc/testsuite/go.test/test/chan/select4.go
new file mode 100644
index 0000000000..46618ac881
--- /dev/null
+++ b/gcc/testsuite/go.test/test/chan/select4.go
@@ -0,0 +1,25 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+package main
+
+func f() *int {
+ println("BUG: called f")
+ return new(int)
+}
+
+func main() {
+ var x struct {
+ a int
+ }
+ c := make(chan int, 1)
+ c1 := make(chan int)
+ c <- 42
+ select {
+ case *f() = <-c1:
+ // nothing
+ case x.a = <-c:
+ if x.a != 42 {
+ println("BUG:", x.a)
+ }
+ }
+}
diff --git a/gcc/testsuite/go.test/test/chan/select5.go b/gcc/testsuite/go.test/test/chan/select5.go
new file mode 100644
index 0000000000..cc2cc71000
--- /dev/null
+++ b/gcc/testsuite/go.test/test/chan/select5.go
@@ -0,0 +1,480 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out >tmp.go &&
+// $G tmp.go && $L tmp.$A && ./$A.out || echo BUG: select5
+// rm -f tmp.go
+
+// 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.
+
+// Generate test of channel operations and simple selects.
+// Only doing one real send or receive at a time, but phrased
+// in various ways that the compiler may or may not rewrite
+// into simpler expressions.
+
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "io"
+ "os"
+ "text/template"
+)
+
+func main() {
+ out := bufio.NewWriter(os.Stdout)
+ fmt.Fprintln(out, header)
+ a := new(arg)
+
+ // Generate each kind of test as a separate function to avoid
+ // hitting the 6g optimizer with one enormous function.
+ // If we name all the functions init we don't have to
+ // maintain a list of which ones to run.
+ do := func(t *template.Template) {
+ fmt.Fprintln(out, `func init() {`)
+ for ; next(); a.reset() {
+ run(t, a, out)
+ }
+ fmt.Fprintln(out, `}`)
+ }
+
+ do(recv)
+ do(send)
+ do(recvOrder)
+ do(sendOrder)
+ do(nonblock)
+
+ fmt.Fprintln(out, "//", a.nreset, "cases")
+ out.Flush()
+}
+
+func run(t *template.Template, a interface{}, out io.Writer) {
+ if err := t.Execute(out, a); err != nil {
+ panic(err)
+ }
+}
+
+type arg struct {
+ def bool
+ nreset int
+}
+
+func (a *arg) Maybe() bool {
+ return maybe()
+}
+
+func (a *arg) MaybeDefault() bool {
+ if a.def {
+ return false
+ }
+ a.def = maybe()
+ return a.def
+}
+
+func (a *arg) MustDefault() bool {
+ return !a.def
+}
+
+func (a *arg) reset() {
+ a.def = false
+ a.nreset++
+}
+
+const header = `// GENERATED BY select5.go; DO NOT EDIT
+
+package main
+
+// channel is buffered so test is single-goroutine.
+// we are not interested in the concurrency aspects
+// of select, just testing that the right calls happen.
+var c = make(chan int, 1)
+var nilch chan int
+var n = 1
+var x int
+var i interface{}
+var dummy = make(chan int)
+var m = make(map[int]int)
+var order = 0
+
+func f(p *int) *int {
+ return p
+}
+
+// check order of operations by ensuring that
+// successive calls to checkorder have increasing o values.
+func checkorder(o int) {
+ if o <= order {
+ println("invalid order", o, "after", order)
+ panic("order")
+ }
+ order = o
+}
+
+func fc(c chan int, o int) chan int {
+ checkorder(o)
+ return c
+}
+
+func fp(p *int, o int) *int {
+ checkorder(o)
+ return p
+}
+
+func fn(n, o int) int {
+ checkorder(o)
+ return n
+}
+
+func die(x int) {
+ println("have", x, "want", n)
+ panic("chan")
+}
+
+func main() {
+ // everything happens in init funcs
+}
+`
+
+func parse(name, s string) *template.Template {
+ t, err := template.New(name).Parse(s)
+ if err != nil {
+ panic(fmt.Sprintf("%q: %s", name, err))
+ }
+ return t
+}
+
+var recv = parse("recv", `
+ {{/* Send n, receive it one way or another into x, check that they match. */}}
+ c <- n
+ {{if .Maybe}}
+ x = <-c
+ {{else}}
+ select {
+ {{/* Blocking or non-blocking, before the receive. */}}
+ {{/* The compiler implements two-case select where one is default with custom code, */}}
+ {{/* so test the default branch both before and after the send. */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Receive from c. Different cases are direct, indirect, :=, interface, and map assignment. */}}
+ {{if .Maybe}}
+ case x = <-c:
+ {{else}}{{if .Maybe}}
+ case *f(&x) = <-c:
+ {{else}}{{if .Maybe}}
+ case y := <-c:
+ x = y
+ {{else}}{{if .Maybe}}
+ case i = <-c:
+ x = i.(int)
+ {{else}}
+ case m[13] = <-c:
+ x = m[13]
+ {{end}}{{end}}{{end}}{{end}}
+ {{/* Blocking or non-blocking again, after the receive. */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Dummy send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case dummy <- 1:
+ panic("dummy send")
+ {{end}}
+ {{if .Maybe}}
+ case <-dummy:
+ panic("dummy receive")
+ {{end}}
+ {{/* Nil channel send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case nilch <- 1:
+ panic("nilch send")
+ {{end}}
+ {{if .Maybe}}
+ case <-nilch:
+ panic("nilch recv")
+ {{end}}
+ }
+ {{end}}
+ if x != n {
+ die(x)
+ }
+ n++
+`)
+
+var recvOrder = parse("recvOrder", `
+ {{/* Send n, receive it one way or another into x, check that they match. */}}
+ {{/* Check order of operations along the way by calling functions that check */}}
+ {{/* that the argument sequence is strictly increasing. */}}
+ order = 0
+ c <- n
+ {{if .Maybe}}
+ {{/* Outside of select, left-to-right rule applies. */}}
+ {{/* (Inside select, assignment waits until case is chosen, */}}
+ {{/* so right hand side happens before anything on left hand side. */}}
+ *fp(&x, 1) = <-fc(c, 2)
+ {{else}}{{if .Maybe}}
+ m[fn(13, 1)] = <-fc(c, 2)
+ x = m[13]
+ {{else}}
+ select {
+ {{/* Blocking or non-blocking, before the receive. */}}
+ {{/* The compiler implements two-case select where one is default with custom code, */}}
+ {{/* so test the default branch both before and after the send. */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Receive from c. Different cases are direct, indirect, :=, interface, and map assignment. */}}
+ {{if .Maybe}}
+ case *fp(&x, 100) = <-fc(c, 1):
+ {{else}}{{if .Maybe}}
+ case y := <-fc(c, 1):
+ x = y
+ {{else}}{{if .Maybe}}
+ case i = <-fc(c, 1):
+ x = i.(int)
+ {{else}}
+ case m[fn(13, 100)] = <-fc(c, 1):
+ x = m[13]
+ {{end}}{{end}}{{end}}
+ {{/* Blocking or non-blocking again, after the receive. */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Dummy send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case fc(dummy, 2) <- fn(1, 3):
+ panic("dummy send")
+ {{end}}
+ {{if .Maybe}}
+ case <-fc(dummy, 4):
+ panic("dummy receive")
+ {{end}}
+ {{/* Nil channel send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case fc(nilch, 5) <- fn(1, 6):
+ panic("nilch send")
+ {{end}}
+ {{if .Maybe}}
+ case <-fc(nilch, 7):
+ panic("nilch recv")
+ {{end}}
+ }
+ {{end}}{{end}}
+ if x != n {
+ die(x)
+ }
+ n++
+`)
+
+var send = parse("send", `
+ {{/* Send n one way or another, receive it into x, check that they match. */}}
+ {{if .Maybe}}
+ c <- n
+ {{else}}
+ select {
+ {{/* Blocking or non-blocking, before the receive (same reason as in recv). */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Send c <- n. No real special cases here, because no values come back */}}
+ {{/* from the send operation. */}}
+ case c <- n:
+ {{/* Blocking or non-blocking. */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Dummy send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case dummy <- 1:
+ panic("dummy send")
+ {{end}}
+ {{if .Maybe}}
+ case <-dummy:
+ panic("dummy receive")
+ {{end}}
+ {{/* Nil channel send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case nilch <- 1:
+ panic("nilch send")
+ {{end}}
+ {{if .Maybe}}
+ case <-nilch:
+ panic("nilch recv")
+ {{end}}
+ }
+ {{end}}
+ x = <-c
+ if x != n {
+ die(x)
+ }
+ n++
+`)
+
+var sendOrder = parse("sendOrder", `
+ {{/* Send n one way or another, receive it into x, check that they match. */}}
+ {{/* Check order of operations along the way by calling functions that check */}}
+ {{/* that the argument sequence is strictly increasing. */}}
+ order = 0
+ {{if .Maybe}}
+ fc(c, 1) <- fn(n, 2)
+ {{else}}
+ select {
+ {{/* Blocking or non-blocking, before the receive (same reason as in recv). */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Send c <- n. No real special cases here, because no values come back */}}
+ {{/* from the send operation. */}}
+ case fc(c, 1) <- fn(n, 2):
+ {{/* Blocking or non-blocking. */}}
+ {{if .MaybeDefault}}
+ default:
+ panic("nonblock")
+ {{end}}
+ {{/* Dummy send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case fc(dummy, 3) <- fn(1, 4):
+ panic("dummy send")
+ {{end}}
+ {{if .Maybe}}
+ case <-fc(dummy, 5):
+ panic("dummy receive")
+ {{end}}
+ {{/* Nil channel send, receive to keep compiler from optimizing select. */}}
+ {{if .Maybe}}
+ case fc(nilch, 6) <- fn(1, 7):
+ panic("nilch send")
+ {{end}}
+ {{if .Maybe}}
+ case <-fc(nilch, 8):
+ panic("nilch recv")
+ {{end}}
+ }
+ {{end}}
+ x = <-c
+ if x != n {
+ die(x)
+ }
+ n++
+`)
+
+var nonblock = parse("nonblock", `
+ x = n
+ {{/* Test various combinations of non-blocking operations. */}}
+ {{/* Receive assignments must not edit or even attempt to compute the address of the lhs. */}}
+ select {
+ {{if .MaybeDefault}}
+ default:
+ {{end}}
+ {{if .Maybe}}
+ case dummy <- 1:
+ panic("dummy <- 1")
+ {{end}}
+ {{if .Maybe}}
+ case nilch <- 1:
+ panic("nilch <- 1")
+ {{end}}
+ {{if .Maybe}}
+ case <-dummy:
+ panic("<-dummy")
+ {{end}}
+ {{if .Maybe}}
+ case x = <-dummy:
+ panic("<-dummy x")
+ {{end}}
+ {{if .Maybe}}
+ case **(**int)(nil) = <-dummy:
+ panic("<-dummy (and didn't crash saving result!)")
+ {{end}}
+ {{if .Maybe}}
+ case <-nilch:
+ panic("<-nilch")
+ {{end}}
+ {{if .Maybe}}
+ case x = <-nilch:
+ panic("<-nilch x")
+ {{end}}
+ {{if .Maybe}}
+ case **(**int)(nil) = <-nilch:
+ panic("<-nilch (and didn't crash saving result!)")
+ {{end}}
+ {{if .MustDefault}}
+ default:
+ {{end}}
+ }
+ if x != n {
+ die(x)
+ }
+ n++
+`)
+
+// Code for enumerating all possible paths through
+// some logic. The logic should call choose(n) when
+// it wants to choose between n possibilities.
+// On successive runs through the logic, choose(n)
+// will return 0, 1, ..., n-1. The helper maybe() is
+// similar but returns true and then false.
+//
+// Given a function gen that generates an output
+// using choose and maybe, code can generate all
+// possible outputs using
+//
+// for next() {
+// gen()
+// }
+
+type choice struct {
+ i, n int
+}
+
+var choices []choice
+var cp int = -1
+
+func maybe() bool {
+ return choose(2) == 0
+}
+
+func choose(n int) int {
+ if cp >= len(choices) {
+ // never asked this before: start with 0.
+ choices = append(choices, choice{0, n})
+ cp = len(choices)
+ return 0
+ }
+ // otherwise give recorded answer
+ if n != choices[cp].n {
+ panic("inconsistent choices")
+ }
+ i := choices[cp].i
+ cp++
+ return i
+}
+
+func next() bool {
+ if cp < 0 {
+ // start a new round
+ cp = 0
+ return true
+ }
+
+ // increment last choice sequence
+ cp = len(choices) - 1
+ for cp >= 0 && choices[cp].i == choices[cp].n-1 {
+ cp--
+ }
+ if cp < 0 {
+ choices = choices[:0]
+ return false
+ }
+ choices[cp].i++
+ choices = choices[:cp+1]
+ cp = 0
+ return true
+}
diff --git a/gcc/testsuite/go.test/test/chan/select6.go b/gcc/testsuite/go.test/test/chan/select6.go
new file mode 100644
index 0000000000..2ba6810ac3
--- /dev/null
+++ b/gcc/testsuite/go.test/test/chan/select6.go
@@ -0,0 +1,34 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Issue 2075
+// A bug in select corrupts channel queues of failed cases
+// if there are multiple waiters on those channels and the
+// select is the last in the queue. If further waits are made
+// on the channel without draining it first then those waiters
+// will never wake up. In the code below c1 is such a channel.
+
+package main
+
+func main() {
+ c1 := make(chan bool)
+ c2 := make(chan bool)
+ c3 := make(chan bool)
+ go func() { <-c1 }()
+ go func() {
+ select {
+ case <-c1:
+ panic("dummy")
+ case <-c2:
+ c3 <- true
+ }
+ <-c1
+ }()
+ go func() { c2 <- true }()
+ <-c3
+ c1 <- true
+ c1 <- true
+}
diff --git a/gcc/testsuite/go.test/test/chan/select7.go b/gcc/testsuite/go.test/test/chan/select7.go
new file mode 100644
index 0000000000..5fed6cbd42
--- /dev/null
+++ b/gcc/testsuite/go.test/test/chan/select7.go
@@ -0,0 +1,68 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 select when discarding a value.
+
+package main
+
+import "runtime"
+
+func recv1(c <-chan int) {
+ <-c
+}
+
+func recv2(c <-chan int) {
+ select {
+ case <-c:
+ }
+}
+
+func recv3(c <-chan int) {
+ c2 := make(chan int)
+ select {
+ case <-c:
+ case <-c2:
+ }
+}
+
+func send1(recv func(<-chan int)) {
+ c := make(chan int)
+ go recv(c)
+ runtime.Gosched()
+ c <- 1
+}
+
+func send2(recv func(<-chan int)) {
+ c := make(chan int)
+ go recv(c)
+ runtime.Gosched()
+ select {
+ case c <- 1:
+ }
+}
+
+func send3(recv func(<-chan int)) {
+ c := make(chan int)
+ go recv(c)
+ runtime.Gosched()
+ c2 := make(chan int)
+ select {
+ case c <- 1:
+ case c2 <- 1:
+ }
+}
+
+func main() {
+ send1(recv1)
+ send2(recv1)
+ send3(recv1)
+ send1(recv2)
+ send2(recv2)
+ send3(recv2)
+ send1(recv3)
+ send2(recv3)
+ send3(recv3)
+}
diff --git a/gcc/testsuite/go.test/test/chan/sendstmt.go b/gcc/testsuite/go.test/test/chan/sendstmt.go
new file mode 100644
index 0000000000..ee6f765cf8
--- /dev/null
+++ b/gcc/testsuite/go.test/test/chan/sendstmt.go
@@ -0,0 +1,37 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 various parsing cases that are a little
+// different now that send is a statement, not a expression.
+
+package main
+
+func main() {
+ chanchan()
+ sendprec()
+}
+
+func chanchan() {
+ cc := make(chan chan int, 1)
+ c := make(chan int, 1)
+ cc <- c
+ select {
+ case <-cc <- 2:
+ default:
+ panic("nonblock")
+ }
+ if <-c != 2 {
+ panic("bad receive")
+ }
+}
+
+func sendprec() {
+ c := make(chan bool, 1)
+ c <- false || true // not a syntax error: same as c <- (false || true)
+ if !<-c {
+ panic("sent false")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/chan/sieve2.go b/gcc/testsuite/go.test/test/chan/sieve2.go
index 7f2ed91579..9a7ab15406 100644
--- a/gcc/testsuite/go.test/test/chan/sieve2.go
+++ b/gcc/testsuite/go.test/test/chan/sieve2.go
@@ -13,7 +13,6 @@ package main
import (
"container/heap"
"container/ring"
- "container/vector"
)
// Return a chan of odd numbers, starting from 5.
@@ -47,13 +46,28 @@ type PeekCh struct {
ch chan int
}
-// Heap of PeekCh, sorting by head values.
-type PeekChHeap struct {
- *vector.Vector
-}
+// Heap of PeekCh, sorting by head values, satisfies Heap interface.
+type PeekChHeap []*PeekCh
func (h *PeekChHeap) Less(i, j int) bool {
- return h.At(i).(*PeekCh).head < h.At(j).(*PeekCh).head
+ return (*h)[i].head < (*h)[j].head
+}
+
+func (h *PeekChHeap) Swap(i, j int) {
+ (*h)[i], (*h)[j] = (*h)[j], (*h)[i]
+}
+
+func (h *PeekChHeap) Len() int {
+ return len(*h)
+}
+
+func (h *PeekChHeap) Pop() (v interface{}) {
+ *h, v = (*h)[:h.Len()-1], (*h)[h.Len()-1]
+ return
+}
+
+func (h *PeekChHeap) Push(v interface{}) {
+ *h = append(*h, v.(*PeekCh))
}
// Return a channel to serve as a sending proxy to 'out'.
@@ -108,26 +122,26 @@ func Sieve() chan int {
// Merge channels of multiples of 'primes' into 'composites'.
go func() {
- h := &PeekChHeap{new(vector.Vector)}
+ var h PeekChHeap
min := 15
for {
m := multiples(<-primes)
head := <-m
for min < head {
composites <- min
- minchan := heap.Pop(h).(*PeekCh)
+ minchan := heap.Pop(&h).(*PeekCh)
min = minchan.head
minchan.head = <-minchan.ch
- heap.Push(h, minchan)
+ heap.Push(&h, minchan)
}
for min == head {
- minchan := heap.Pop(h).(*PeekCh)
+ minchan := heap.Pop(&h).(*PeekCh)
min = minchan.head
minchan.head = <-minchan.ch
- heap.Push(h, minchan)
+ heap.Push(&h, minchan)
}
composites <- head
- heap.Push(h, &PeekCh{<-m, m})
+ heap.Push(&h, &PeekCh{<-m, m})
}
}()
diff --git a/gcc/testsuite/go.test/test/chan/zerosize.go b/gcc/testsuite/go.test/test/chan/zerosize.go
new file mode 100644
index 0000000000..617c9dab34
--- /dev/null
+++ b/gcc/testsuite/go.test/test/chan/zerosize.go
@@ -0,0 +1,16 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Making channels of a zero-sized type should not panic.
+
+package main
+
+func main() {
+ _ = make(chan [0]byte)
+ _ = make(chan [0]byte, 1)
+ _ = make(chan struct{})
+ _ = make(chan struct{}, 1)
+}
diff --git a/gcc/testsuite/go.test/test/closedchan.go b/gcc/testsuite/go.test/test/closedchan.go
index c7c759be3b..c2bbec59d9 100644
--- a/gcc/testsuite/go.test/test/closedchan.go
+++ b/gcc/testsuite/go.test/test/closedchan.go
@@ -4,31 +4,43 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// Test close(c), closed(c).
+// Test close(c), receive of closed channel.
//
// TODO(rsc): Doesn't check behavior of close(c) when there
// are blocked senders/receivers.
package main
+import "os"
+
+var failed bool
+
type Chan interface {
Send(int)
Nbsend(int) bool
- Recv() int
+ Recv() (int)
Nbrecv() (int, bool)
+ Recv2() (int, bool)
+ Nbrecv2() (int, bool, bool)
Close()
- Closed() bool
Impl() string
}
-// direct channel operations
+// direct channel operations when possible
type XChan chan int
+
func (c XChan) Send(x int) {
c <- x
}
func (c XChan) Nbsend(x int) bool {
- return c <- x
+ select {
+ case c <- x:
+ return true
+ default:
+ return false
+ }
+ panic("nbsend")
}
func (c XChan) Recv() int {
@@ -36,16 +48,32 @@ func (c XChan) Recv() int {
}
func (c XChan) Nbrecv() (int, bool) {
+ select {
+ case x := <-c:
+ return x, true
+ default:
+ return 0, false
+ }
+ panic("nbrecv")
+}
+
+func (c XChan) Recv2() (int, bool) {
x, ok := <-c
return x, ok
}
-func (c XChan) Close() {
- close(c)
+func (c XChan) Nbrecv2() (int, bool, bool) {
+ select {
+ case x, ok := <-c:
+ return x, ok, true
+ default:
+ return 0, false, false
+ }
+ panic("nbrecv2")
}
-func (c XChan) Closed() bool {
- return closed(c)
+func (c XChan) Close() {
+ close(c)
}
func (c XChan) Impl() string {
@@ -54,6 +82,7 @@ func (c XChan) Impl() string {
// indirect operations via select
type SChan chan int
+
func (c SChan) Send(x int) {
select {
case c <- x:
@@ -62,10 +91,10 @@ func (c SChan) Send(x int) {
func (c SChan) Nbsend(x int) bool {
select {
- case c <- x:
- return true
default:
return false
+ case c <- x:
+ return true
}
panic("nbsend")
}
@@ -80,10 +109,28 @@ func (c SChan) Recv() int {
func (c SChan) Nbrecv() (int, bool) {
select {
+ default:
+ return 0, false
case x := <-c:
return x, true
+ }
+ panic("nbrecv")
+}
+
+func (c SChan) Recv2() (int, bool) {
+ select {
+ case x, ok := <-c:
+ return x, ok
+ }
+ panic("recv")
+}
+
+func (c SChan) Nbrecv2() (int, bool, bool) {
+ select {
default:
- return 0, false
+ return 0, false, false
+ case x, ok := <-c:
+ return x, ok, true
}
panic("nbrecv")
}
@@ -92,87 +139,172 @@ func (c SChan) Close() {
close(c)
}
-func (c SChan) Closed() bool {
- return closed(c)
-}
-
func (c SChan) Impl() string {
return "(select)"
}
-func test1(c Chan) {
- // not closed until the close signal (a zero value) has been received.
- if c.Closed() {
- println("test1: Closed before Recv zero:", c.Impl())
+// indirect operations via larger selects
+var dummy = make(chan bool)
+
+type SSChan chan int
+
+func (c SSChan) Send(x int) {
+ select {
+ case c <- x:
+ case <-dummy:
}
+}
+func (c SSChan) Nbsend(x int) bool {
+ select {
+ default:
+ return false
+ case <-dummy:
+ case c <- x:
+ return true
+ }
+ panic("nbsend")
+}
+
+func (c SSChan) Recv() int {
+ select {
+ case <-dummy:
+ case x := <-c:
+ return x
+ }
+ panic("recv")
+}
+
+func (c SSChan) Nbrecv() (int, bool) {
+ select {
+ case <-dummy:
+ default:
+ return 0, false
+ case x := <-c:
+ return x, true
+ }
+ panic("nbrecv")
+}
+
+func (c SSChan) Recv2() (int, bool) {
+ select {
+ case <-dummy:
+ case x, ok := <-c:
+ return x, ok
+ }
+ panic("recv")
+}
+
+func (c SSChan) Nbrecv2() (int, bool, bool) {
+ select {
+ case <-dummy:
+ default:
+ return 0, false, false
+ case x, ok := <-c:
+ return x, ok, true
+ }
+ panic("nbrecv")
+}
+
+func (c SSChan) Close() {
+ close(c)
+}
+
+func (c SSChan) Impl() string {
+ return "(select)"
+}
+
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("did not panic")
+ }
+ }()
+ f()
+}
+
+func test1(c Chan) {
for i := 0; i < 3; i++ {
// recv a close signal (a zero value)
if x := c.Recv(); x != 0 {
- println("test1: recv on closed got non-zero:", x, c.Impl())
+ println("test1: recv on closed:", x, c.Impl())
+ failed = true
}
-
- // should now be closed.
- if !c.Closed() {
- println("test1: not closed after recv zero", c.Impl())
+ if x, ok := c.Recv2(); x != 0 || ok {
+ println("test1: recv2 on closed:", x, ok, c.Impl())
+ failed = true
}
- // should work with ,ok: received a value without blocking, so ok == true.
- x, ok := c.Nbrecv()
- if !ok {
- println("test1: recv on closed got not ok", c.Impl())
+ // should work with select: received a value without blocking, so selected == true.
+ x, selected := c.Nbrecv()
+ if x != 0 || !selected {
+ println("test1: recv on closed nb:", x, selected, c.Impl())
+ failed = true
}
- if x != 0 {
- println("test1: recv ,ok on closed got non-zero:", x, c.Impl())
+ x, ok, selected := c.Nbrecv2()
+ if x != 0 || ok || !selected {
+ println("test1: recv2 on closed nb:", x, ok, selected, c.Impl())
+ failed = true
}
}
// send should work with ,ok too: sent a value without blocking, so ok == true.
- ok := c.Nbsend(1)
- if !ok {
- println("test1: send on closed got not ok", c.Impl())
- }
+ shouldPanic(func() { c.Nbsend(1) })
- // but the value should have been discarded.
+ // the value should have been discarded.
if x := c.Recv(); x != 0 {
println("test1: recv on closed got non-zero after send on closed:", x, c.Impl())
+ failed = true
}
// similarly Send.
- c.Send(2)
+ shouldPanic(func() { c.Send(2) })
if x := c.Recv(); x != 0 {
println("test1: recv on closed got non-zero after send on closed:", x, c.Impl())
+ failed = true
}
}
func testasync1(c Chan) {
- // not closed until the close signal (a zero value) has been received.
- if c.Closed() {
- println("testasync1: Closed before Recv zero:", c.Impl())
- }
-
// should be able to get the last value via Recv
if x := c.Recv(); x != 1 {
println("testasync1: Recv did not get 1:", x, c.Impl())
+ failed = true
}
test1(c)
}
func testasync2(c Chan) {
- // not closed until the close signal (a zero value) has been received.
- if c.Closed() {
- println("testasync2: Closed before Recv zero:", c.Impl())
+ // should be able to get the last value via Recv2
+ if x, ok := c.Recv2(); x != 1 || !ok {
+ println("testasync1: Recv did not get 1, true:", x, ok, c.Impl())
+ failed = true
}
+ test1(c)
+}
+
+func testasync3(c Chan) {
// should be able to get the last value via Nbrecv
- if x, ok := c.Nbrecv(); !ok || x != 1 {
- println("testasync2: Nbrecv did not get 1, true:", x, ok, c.Impl())
+ if x, selected := c.Nbrecv(); x != 1 || !selected {
+ println("testasync2: Nbrecv did not get 1, true:", x, selected, c.Impl())
+ failed = true
}
test1(c)
}
+func testasync4(c Chan) {
+ // should be able to get the last value via Nbrecv2
+ if x, ok, selected := c.Nbrecv2(); x != 1 || !ok || !selected {
+ println("testasync2: Nbrecv did not get 1, true, true:", x, ok, selected, c.Impl())
+ failed = true
+ }
+ test1(c)
+}
+
func closedsync() chan int {
c := make(chan int)
close(c)
@@ -186,12 +318,42 @@ func closedasync() chan int {
return c
}
-func main() {
- test1(XChan(closedsync()))
- test1(SChan(closedsync()))
+var mks = []func(chan int) Chan {
+ func(c chan int) Chan { return XChan(c) },
+ func(c chan int) Chan { return SChan(c) },
+ func(c chan int) Chan { return SSChan(c) },
+}
- testasync1(XChan(closedasync()))
- testasync1(SChan(closedasync()))
- testasync2(XChan(closedasync()))
- testasync2(SChan(closedasync()))
+var testcloseds = []func(Chan) {
+ testasync1,
+ testasync2,
+ testasync3,
+ testasync4,
+}
+
+func main() {
+ for _, mk := range mks {
+ test1(mk(closedsync()))
+ }
+
+ for _, testclosed := range testcloseds {
+ for _, mk := range mks {
+ testclosed(mk(closedasync()))
+ }
+ }
+
+ var ch chan int
+ shouldPanic(func() {
+ close(ch)
+ })
+
+ ch = make(chan int)
+ close(ch)
+ shouldPanic(func() {
+ close(ch)
+ })
+
+ if failed {
+ os.Exit(1)
+ }
}
diff --git a/gcc/testsuite/go.test/test/closure.go b/gcc/testsuite/go.test/test/closure.go
index 54e4cf8eae..97da1dd230 100644
--- a/gcc/testsuite/go.test/test/closure.go
+++ b/gcc/testsuite/go.test/test/closure.go
@@ -6,6 +6,8 @@
package main
+import "runtime"
+
var c = make(chan int)
func check(a []int) {
@@ -76,8 +78,9 @@ func h() {
func newfunc() func(int) int { return func(x int) int { return x } }
-
func main() {
+ var fail bool
+
go f()
check([]int{1, 4, 5, 4})
@@ -89,13 +92,33 @@ func main() {
go h()
check([]int{100, 200, 101, 201, 500, 101, 201, 500})
+ runtime.UpdateMemStats()
+ n0 := runtime.MemStats.Mallocs
+
x, y := newfunc(), newfunc()
- if x == y {
- println("newfunc returned same func")
- panic("fail")
- }
if x(1) != 1 || y(2) != 2 {
println("newfunc returned broken funcs")
- panic("fail")
+ fail = true
+ }
+
+ runtime.UpdateMemStats()
+ if n0 != runtime.MemStats.Mallocs {
+ println("newfunc allocated unexpectedly")
+ fail = true
}
+
+ ff(1)
+
+ if fail {
+ panic("fail")
+ }
+}
+
+func ff(x int) {
+ call(func() {
+ _ = x
+ })
+}
+
+func call(func()) {
}
diff --git a/gcc/testsuite/go.test/test/cmp.go b/gcc/testsuite/go.test/test/cmp.go
new file mode 100644
index 0000000000..d51a11aa24
--- /dev/null
+++ b/gcc/testsuite/go.test/test/cmp.go
@@ -0,0 +1,400 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 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 "unsafe"
+
+var global bool
+func use(b bool) { global = b }
+
+func stringptr(s string) uintptr { return *(*uintptr)(unsafe.Pointer(&s)) }
+
+func isfalse(b bool) {
+ if b {
+ // stack will explain where
+ panic("wanted false, got true")
+ }
+}
+
+func istrue(b bool) {
+ if !b {
+ // stack will explain where
+ panic("wanted true, got false")
+ }
+}
+
+type T *int
+
+func main() {
+ var a []int
+ var b map[string]int
+
+ var c string = "hello"
+ var d string = "hel" // try to get different pointer
+ d = d + "lo"
+ if stringptr(c) == stringptr(d) {
+ panic("compiler too smart -- got same string")
+ }
+
+ var e = make(chan int)
+
+ var ia interface{} = a
+ var ib interface{} = b
+ var ic interface{} = c
+ var id interface{} = d
+ var ie interface{} = e
+
+ // these comparisons are okay because
+ // string compare is okay and the others
+ // are comparisons where the types differ.
+ isfalse(ia == ib)
+ isfalse(ia == ic)
+ isfalse(ia == id)
+ isfalse(ib == ic)
+ isfalse(ib == id)
+ istrue(ic == id)
+ istrue(ie == ie)
+
+ istrue(ia != ib)
+ istrue(ia != ic)
+ istrue(ia != id)
+ istrue(ib != ic)
+ istrue(ib != id)
+ isfalse(ic != id)
+ isfalse(ie != ie)
+
+ // these are not okay, because there is no comparison on slices or maps.
+ //isfalse(a == ib)
+ //isfalse(a == ic)
+ //isfalse(a == id)
+ //isfalse(b == ic)
+ //isfalse(b == id)
+
+ istrue(c == id)
+ istrue(e == ie)
+
+ //isfalse(ia == b)
+ isfalse(ia == c)
+ isfalse(ia == d)
+ isfalse(ib == c)
+ isfalse(ib == d)
+ istrue(ic == d)
+ istrue(ie == e)
+
+ //istrue(a != ib)
+ //istrue(a != ic)
+ //istrue(a != id)
+ //istrue(b != ic)
+ //istrue(b != id)
+ isfalse(c != id)
+ isfalse(e != ie)
+
+ //istrue(ia != b)
+ istrue(ia != c)
+ istrue(ia != d)
+ istrue(ib != c)
+ istrue(ib != d)
+ isfalse(ic != d)
+ isfalse(ie != e)
+
+ // 6g used to let this go through as true.
+ var g uint64 = 123
+ var h int64 = 123
+ var ig interface{} = g
+ var ih interface{} = h
+ isfalse(ig == ih)
+ istrue(ig != ih)
+
+ // map of interface should use == on interface values,
+ // not memory.
+ var m = make(map[interface{}]int)
+ m[ic] = 1
+ m[id] = 2
+ if m[c] != 2 {
+ println("m[c] = ", m[c])
+ panic("bad m[c]")
+ }
+
+ // non-interface comparisons
+ {
+ c := make(chan int)
+ c1 := (<-chan int)(c)
+ c2 := (chan<- int)(c)
+ istrue(c == c1)
+ istrue(c == c2)
+ istrue(c1 == c)
+ istrue(c2 == c)
+
+ isfalse(c != c1)
+ isfalse(c != c2)
+ isfalse(c1 != c)
+ isfalse(c2 != c)
+
+ d := make(chan int)
+ isfalse(c == d)
+ isfalse(d == c)
+ isfalse(d == c1)
+ isfalse(d == c2)
+ isfalse(c1 == d)
+ isfalse(c2 == d)
+
+ istrue(c != d)
+ istrue(d != c)
+ istrue(d != c1)
+ istrue(d != c2)
+ istrue(c1 != d)
+ istrue(c2 != d)
+ }
+
+ // named types vs not
+ {
+ var x = new(int)
+ var y T
+ var z T = x
+
+ isfalse(x == y)
+ istrue(x == z)
+ isfalse(y == z)
+
+ isfalse(y == x)
+ istrue(z == x)
+ isfalse(z == y)
+
+ istrue(x != y)
+ isfalse(x != z)
+ istrue(y != z)
+
+ istrue(y != x)
+ isfalse(z != x)
+ istrue(z != y)
+ }
+
+ // structs
+ {
+ var x = struct {
+ x int
+ y string
+ }{1, "hi"}
+ var y = struct {
+ x int
+ y string
+ }{2, "bye"}
+ var z = struct {
+ x int
+ y string
+ }{1, "hi"}
+
+ isfalse(x == y)
+ isfalse(y == x)
+ isfalse(y == z)
+ isfalse(z == y)
+ istrue(x == z)
+ istrue(z == x)
+
+ istrue(x != y)
+ istrue(y != x)
+ istrue(y != z)
+ istrue(z != y)
+ isfalse(x != z)
+ isfalse(z != x)
+
+ var m = make(map[struct {
+ x int
+ y string
+ }]int)
+ m[x] = 10
+ m[y] = 20
+ m[z] = 30
+ istrue(m[x] == 30)
+ istrue(m[y] == 20)
+ istrue(m[z] == 30)
+ istrue(m[x] != 10)
+ isfalse(m[x] != 30)
+ isfalse(m[y] != 20)
+ isfalse(m[z] != 30)
+ isfalse(m[x] == 10)
+
+ var m1 = make(map[struct {
+ x int
+ y string
+ }]struct {
+ x int
+ y string
+ })
+ m1[x] = x
+ m1[y] = y
+ m1[z] = z
+ istrue(m1[x] == z)
+ istrue(m1[y] == y)
+ istrue(m1[z] == z)
+ istrue(m1[x] == x)
+ isfalse(m1[x] != z)
+ isfalse(m1[y] != y)
+ isfalse(m1[z] != z)
+ isfalse(m1[x] != x)
+
+ var ix, iy, iz interface{} = x, y, z
+
+ isfalse(ix == iy)
+ isfalse(iy == ix)
+ isfalse(iy == iz)
+ isfalse(iz == iy)
+ istrue(ix == iz)
+ istrue(iz == ix)
+
+ isfalse(x == iy)
+ isfalse(y == ix)
+ isfalse(y == iz)
+ isfalse(z == iy)
+ istrue(x == iz)
+ istrue(z == ix)
+
+ isfalse(ix == y)
+ isfalse(iy == x)
+ isfalse(iy == z)
+ isfalse(iz == y)
+ istrue(ix == z)
+ istrue(iz == x)
+
+ istrue(ix != iy)
+ istrue(iy != ix)
+ istrue(iy != iz)
+ istrue(iz != iy)
+ isfalse(ix != iz)
+ isfalse(iz != ix)
+
+ istrue(x != iy)
+ istrue(y != ix)
+ istrue(y != iz)
+ istrue(z != iy)
+ isfalse(x != iz)
+ isfalse(z != ix)
+
+ istrue(ix != y)
+ istrue(iy != x)
+ istrue(iy != z)
+ istrue(iz != y)
+ isfalse(ix != z)
+ isfalse(iz != x)
+ }
+
+ // arrays
+ {
+ var x = [2]string{"1", "hi"}
+ var y = [2]string{"2", "bye"}
+ var z = [2]string{"1", "hi"}
+
+ isfalse(x == y)
+ isfalse(y == x)
+ isfalse(y == z)
+ isfalse(z == y)
+ istrue(x == z)
+ istrue(z == x)
+
+ istrue(x != y)
+ istrue(y != x)
+ istrue(y != z)
+ istrue(z != y)
+ isfalse(x != z)
+ isfalse(z != x)
+
+ var m = make(map[[2]string]int)
+ m[x] = 10
+ m[y] = 20
+ m[z] = 30
+ istrue(m[x] == 30)
+ istrue(m[y] == 20)
+ istrue(m[z] == 30)
+ isfalse(m[x] != 30)
+ isfalse(m[y] != 20)
+ isfalse(m[z] != 30)
+
+ var ix, iy, iz interface{} = x, y, z
+
+ isfalse(ix == iy)
+ isfalse(iy == ix)
+ isfalse(iy == iz)
+ isfalse(iz == iy)
+ istrue(ix == iz)
+ istrue(iz == ix)
+
+ isfalse(x == iy)
+ isfalse(y == ix)
+ isfalse(y == iz)
+ isfalse(z == iy)
+ istrue(x == iz)
+ istrue(z == ix)
+
+ isfalse(ix == y)
+ isfalse(iy == x)
+ isfalse(iy == z)
+ isfalse(iz == y)
+ istrue(ix == z)
+ istrue(iz == x)
+
+ istrue(ix != iy)
+ istrue(iy != ix)
+ istrue(iy != iz)
+ istrue(iz != iy)
+ isfalse(ix != iz)
+ isfalse(iz != ix)
+
+ istrue(x != iy)
+ istrue(y != ix)
+ istrue(y != iz)
+ istrue(z != iy)
+ isfalse(x != iz)
+ isfalse(z != ix)
+
+ istrue(ix != y)
+ istrue(iy != x)
+ istrue(iy != z)
+ istrue(iz != y)
+ isfalse(ix != z)
+ isfalse(iz != x)
+ }
+
+ shouldPanic(p1)
+ shouldPanic(p2)
+ shouldPanic(p3)
+ shouldPanic(p4)
+}
+
+func p1() {
+ var a []int
+ var ia interface{} = a
+ use(ia == ia)
+}
+
+func p2() {
+ var b []int
+ var ib interface{} = b
+ use(ib == ib)
+}
+
+func p3() {
+ var a []int
+ var ia interface{} = a
+ var m = make(map[interface{}]int)
+ m[ia] = 1
+}
+
+func p4() {
+ var b []int
+ var ib interface{} = b
+ var m = make(map[interface{}]int)
+ m[ib] = 1
+}
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("function should panic")
+ }
+ }()
+ f()
+}
diff --git a/gcc/testsuite/go.test/test/cmp1.go b/gcc/testsuite/go.test/test/cmp1.go
deleted file mode 100644
index db0a486dd3..0000000000
--- a/gcc/testsuite/go.test/test/cmp1.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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 "unsafe"
-
-func use(bool) {}
-
-func stringptr(s string) uintptr { return *(*uintptr)(unsafe.Pointer(&s)) }
-
-func isfalse(b bool) {
- if b {
- // stack will explain where
- panic("wanted false, got true")
- }
-}
-
-func istrue(b bool) {
- if !b {
- // stack will explain where
- panic("wanted true, got false")
- }
-}
-
-func main() {
- var a []int
- var b map[string]int
-
- var c string = "hello"
- var d string = "hel" // try to get different pointer
- d = d + "lo"
- if stringptr(c) == stringptr(d) {
- panic("compiler too smart -- got same string")
- }
-
- var e = make(chan int)
-
- var ia interface{} = a
- var ib interface{} = b
- var ic interface{} = c
- var id interface{} = d
- var ie interface{} = e
-
- // these comparisons are okay because
- // string compare is okay and the others
- // are comparisons where the types differ.
- isfalse(ia == ib)
- isfalse(ia == ic)
- isfalse(ia == id)
- isfalse(ib == ic)
- isfalse(ib == id)
- istrue(ic == id)
- istrue(ie == ie)
-
- // 6g used to let this go through as true.
- var g uint64 = 123
- var h int64 = 123
- var ig interface{} = g
- var ih interface{} = h
- isfalse(ig == ih)
-
- // map of interface should use == on interface values,
- // not memory.
- // TODO: should m[c], m[d] be valid here?
- var m = make(map[interface{}]int)
- m[ic] = 1
- m[id] = 2
- if m[ic] != 2 {
- println("m[ic] = ", m[ic])
- panic("bad m[ic]")
- }
-}
diff --git a/gcc/testsuite/go.test/test/cmp3.go b/gcc/testsuite/go.test/test/cmp3.go
deleted file mode 100644
index dd90bfb03e..0000000000
--- a/gcc/testsuite/go.test/test/cmp3.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ! ./$A.out
-
-// Copyright 2009 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
-
-func use(bool) { }
-
-func main() {
- var b []int
- var ib interface{} = b
- use(ib == ib)
-}
diff --git a/gcc/testsuite/go.test/test/cmp4.go b/gcc/testsuite/go.test/test/cmp4.go
deleted file mode 100644
index 3f9b2c0b8b..0000000000
--- a/gcc/testsuite/go.test/test/cmp4.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ! ./$A.out
-
-// Copyright 2009 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
-
-func main() {
- var a []int
- var ia interface{} = a
- var m = make(map[interface{}] int)
- m[ia] = 1
-}
diff --git a/gcc/testsuite/go.test/test/cmp5.go b/gcc/testsuite/go.test/test/cmp5.go
deleted file mode 100644
index 3a7d733f02..0000000000
--- a/gcc/testsuite/go.test/test/cmp5.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ! ./$A.out
-
-// Copyright 2009 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
-
-func main() {
- var b []int
- var ib interface{} = b
- var m = make(map[interface{}] int)
- m[ib] = 1
-}
diff --git a/gcc/testsuite/go.test/test/cmp6.go b/gcc/testsuite/go.test/test/cmp6.go
new file mode 100644
index 0000000000..0113a69ddb
--- /dev/null
+++ b/gcc/testsuite/go.test/test/cmp6.go
@@ -0,0 +1,67 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+func use(bool) {}
+
+type T1 *int
+type T2 *int
+
+type T3 struct{ z []int }
+
+var t3 T3
+
+func main() {
+ // Arguments to comparison must be
+ // assignable one to the other (or vice versa)
+ // so chan int can be compared against
+ // directional channels but channel of different
+ // direction cannot be compared against each other.
+ var c1 chan<- int
+ var c2 <-chan int
+ var c3 chan int
+
+ use(c1 == c2) // ERROR "invalid operation|incompatible"
+ use(c2 == c1) // ERROR "invalid operation|incompatible"
+ use(c1 == c3)
+ use(c2 == c2)
+ use(c3 == c1)
+ use(c3 == c2)
+
+ // Same applies to named types.
+ var p1 T1
+ var p2 T2
+ var p3 *int
+
+ use(p1 == p2) // ERROR "invalid operation|incompatible"
+ use(p2 == p1) // ERROR "invalid operation|incompatible"
+ use(p1 == p3)
+ use(p2 == p2)
+ use(p3 == p1)
+ use(p3 == p2)
+
+ // Comparison of structs should have a good message
+ use(t3 == t3) // ERROR "struct|expected"
+
+ // Slices, functions, and maps too.
+ var x []int
+ var f func()
+ var m map[int]int
+ use(x == x) // ERROR "slice can only be compared to nil"
+ use(f == f) // ERROR "func can only be compared to nil"
+ use(m == m) // ERROR "map can only be compared to nil"
+
+ // Comparison with interface that cannot return true
+ // (would panic).
+ var i interface{}
+ use(i == x) // ERROR "invalid operation"
+ use(x == i) // ERROR "invalid operation"
+ use(i == f) // ERROR "invalid operation"
+ use(f == i) // ERROR "invalid operation"
+ use(i == m) // ERROR "invalid operation"
+ use(m == i) // ERROR "invalid operation"
+}
diff --git a/gcc/testsuite/go.test/test/cmplxdivide.c b/gcc/testsuite/go.test/test/cmplxdivide.c
index b3c6055ed2..b340f04d88 100644
--- a/gcc/testsuite/go.test/test/cmplxdivide.c
+++ b/gcc/testsuite/go.test/test/cmplxdivide.c
@@ -72,7 +72,7 @@ main(void)
if(iscnan(n) && d == 0)
q = (NAN+NAN*I) / zero;
- printf("\tTest{cmplx(%s, %s), cmplx(%s, %s), cmplx(%s, %s)},\n",
+ printf("\tTest{complex(%s, %s), complex(%s, %s), complex(%s, %s)},\n",
fmt(creal(n)), fmt(cimag(n)),
fmt(creal(d)), fmt(cimag(d)),
fmt(creal(q)), fmt(cimag(q)));
diff --git a/gcc/testsuite/go.test/test/cmplxdivide.go b/gcc/testsuite/go.test/test/cmplxdivide.go
index 6a67b175de..461ee9796e 100644
--- a/gcc/testsuite/go.test/test/cmplxdivide.go
+++ b/gcc/testsuite/go.test/test/cmplxdivide.go
@@ -9,14 +9,14 @@
package main
import (
- "cmath"
"fmt"
"math"
+ "math/cmplx"
)
-type Test struct{
- f, g complex128
- out complex128
+type Test struct {
+ f, g complex128
+ out complex128
}
var nan = math.NaN()
@@ -25,9 +25,9 @@ var negzero = math.Copysign(0, -1)
func calike(a, b complex128) bool {
switch {
- case cmath.IsInf(a) && cmath.IsInf(b):
+ case cmplx.IsInf(a) && cmplx.IsInf(b):
return true
- case cmath.IsNaN(a) && cmath.IsNaN(b):
+ case cmplx.IsNaN(a) && cmplx.IsNaN(b):
return true
}
return a == b
@@ -36,7 +36,7 @@ func calike(a, b complex128) bool {
func main() {
bad := false
for _, t := range tests {
- x := t.f/t.g
+ x := t.f / t.g
if !calike(x, t.out) {
if !bad {
fmt.Printf("BUG\n")
diff --git a/gcc/testsuite/go.test/test/complit.go b/gcc/testsuite/go.test/test/complit.go
index f5f7aca9d9..8dfc71dcb4 100644
--- a/gcc/testsuite/go.test/test/complit.go
+++ b/gcc/testsuite/go.test/test/complit.go
@@ -31,6 +31,18 @@ func eq(a []*R) {
}
}
+func teq(t *T, n int) {
+ for i := 0; i < n; i++ {
+ if t == nil || t.i != i {
+ panic("bad")
+ }
+ t = t.next
+ }
+ if t != nil {
+ panic("bad")
+ }
+}
+
type P struct {
a, b int
}
@@ -46,6 +58,9 @@ func main() {
var tp *T
tp = &T{0, 7.2, "hi", &t}
+ tl := &T{i: 0, next: &T{i: 1, next: &T{i: 2, next: &T{i: 3, next: &T{i: 4}}}}}
+ teq(tl, 5)
+
a1 := []int{1, 2, 3}
if len(a1) != 3 {
panic("a1")
@@ -93,6 +108,7 @@ func main() {
}
eq([]*R{itor(0), itor(1), itor(2), itor(3), itor(4), itor(5)})
+ eq([]*R{{0}, {1}, {2}, {3}, {4}, {5}})
p1 := NewP(1, 2)
p2 := NewP(1, 2)
diff --git a/gcc/testsuite/go.test/test/complit1.go b/gcc/testsuite/go.test/test/complit1.go
new file mode 100644
index 0000000000..cd543930ee
--- /dev/null
+++ b/gcc/testsuite/go.test/test/complit1.go
@@ -0,0 +1,39 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+var m map[int][3]int
+
+func f() [3]int
+
+func fp() *[3]int
+
+var mp map[int]*[3]int
+
+var (
+ _ = [3]int{1, 2, 3}[:] // ERROR "slice of unaddressable value"
+ _ = m[0][:] // ERROR "slice of unaddressable value"
+ _ = f()[:] // ERROR "slice of unaddressable value"
+
+ // these are okay because they are slicing a pointer to an array
+ _ = (&[3]int{1, 2, 3})[:]
+ _ = mp[0][:]
+ _ = fp()[:]
+)
+
+type T struct {
+ i int
+ f float64
+ s string
+ next *T
+}
+
+var (
+ _ = &T{0, 0, "", nil} // ok
+ _ = &T{i: 0, f: 0, s: "", next: {}} // ERROR "missing type in composite literal|omit types within composite literal"
+ _ = &T{0, 0, "", {}} // ERROR "missing type in composite literal|omit types within composite literal"
+)
diff --git a/gcc/testsuite/go.test/test/const1.go b/gcc/testsuite/go.test/test/const1.go
index 6cfcb460b5..67f36e4fdc 100644
--- a/gcc/testsuite/go.test/test/const1.go
+++ b/gcc/testsuite/go.test/test/const1.go
@@ -78,3 +78,5 @@ func main() {
f(String) // ERROR "convert|wrong type|cannot|incompatible"
f(Bool) // ERROR "convert|wrong type|cannot|incompatible"
}
+
+const ptr = nil // ERROR "const.*nil"
diff --git a/gcc/testsuite/go.test/test/const3.go b/gcc/testsuite/go.test/test/const3.go
index dd5c88958d..9bba6ced0b 100644
--- a/gcc/testsuite/go.test/test/const3.go
+++ b/gcc/testsuite/go.test/test/const3.go
@@ -26,4 +26,10 @@ func main() {
println("type info didn't propagate in const: got", s)
panic("fail")
}
+ x := uint(5)
+ y := float64(uint64(1)<<x) // used to fail to compile
+ if y != 32 {
+ println("wrong y", y)
+ panic("fail")
+ }
}
diff --git a/gcc/testsuite/go.test/test/convert.go b/gcc/testsuite/go.test/test/convert.go
index e7361aa87f..0a75663d06 100644
--- a/gcc/testsuite/go.test/test/convert.go
+++ b/gcc/testsuite/go.test/test/convert.go
@@ -8,7 +8,7 @@ package main
import "reflect"
-func typeof(x interface{}) string { return reflect.Typeof(x).String() }
+func typeof(x interface{}) string { return reflect.TypeOf(x).String() }
func f() int { return 0 }
diff --git a/gcc/testsuite/go.test/test/convert1.go b/gcc/testsuite/go.test/test/convert1.go
new file mode 100644
index 0000000000..bbd0c5f2b0
--- /dev/null
+++ b/gcc/testsuite/go.test/test/convert1.go
@@ -0,0 +1,96 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+type Tbyte []byte
+type Trune []rune
+type Tint64 []int64
+type Tstring string
+
+func main() {
+ s := "hello"
+ sb := []byte("hello")
+ sr := []rune("hello")
+ si := []int64{'h', 'e', 'l', 'l', 'o'}
+
+ ts := Tstring(s)
+ tsb := Tbyte(sb)
+ tsr := Trune(sr)
+ tsi := Tint64(si)
+
+ _ = string(s)
+ _ = []byte(s)
+ _ = []rune(s)
+ _ = []int64(s) // ERROR "cannot convert.*\[\]int64|invalid type conversion"
+ _ = Tstring(s)
+ _ = Tbyte(s)
+ _ = Trune(s)
+ _ = Tint64(s) // ERROR "cannot convert.*Tint64|invalid type conversion"
+
+ _ = string(sb)
+ _ = []byte(sb)
+ _ = []rune(sb) // ERROR "cannot convert.*\[\]rune|invalid type conversion"
+ _ = []int64(sb) // ERROR "cannot convert.*\[\]int64|invalid type conversion"
+ _ = Tstring(sb)
+ _ = Tbyte(sb)
+ _ = Trune(sb) // ERROR "cannot convert.*Trune|invalid type conversion"
+ _ = Tint64(sb) // ERROR "cannot convert.*Tint64|invalid type conversion"
+
+ _ = string(sr)
+ _ = []byte(sr) // ERROR "cannot convert.*\[\]byte|invalid type conversion"
+ _ = []rune(sr)
+ _ = []int64(sr) // ERROR "cannot convert.*\[\]int64|invalid type conversion"
+ _ = Tstring(sr)
+ _ = Tbyte(sr) // ERROR "cannot convert.*Tbyte|invalid type conversion"
+ _ = Trune(sr)
+ _ = Tint64(sr) // ERROR "cannot convert.*Tint64|invalid type conversion"
+
+ _ = string(si) // ERROR "cannot convert.* string|invalid type conversion"
+ _ = []byte(si) // ERROR "cannot convert.*\[\]byte|invalid type conversion"
+ _ = []rune(si) // ERROR "cannot convert.*\[\]rune|invalid type conversion"
+ _ = []int64(si)
+ _ = Tstring(si) // ERROR "cannot convert.*Tstring|invalid type conversion"
+ _ = Tbyte(si) // ERROR "cannot convert.*Tbyte|invalid type conversion"
+ _ = Trune(si) // ERROR "cannot convert.*Trune|invalid type conversion"
+ _ = Tint64(si)
+
+ _ = string(ts)
+ _ = []byte(ts)
+ _ = []rune(ts)
+ _ = []int64(ts) // ERROR "cannot convert.*\[\]int64|invalid type conversion"
+ _ = Tstring(ts)
+ _ = Tbyte(ts)
+ _ = Trune(ts)
+ _ = Tint64(ts) // ERROR "cannot convert.*Tint64|invalid type conversion"
+
+ _ = string(tsb)
+ _ = []byte(tsb)
+ _ = []rune(tsb) // ERROR "cannot convert.*\[\]rune|invalid type conversion"
+ _ = []int64(tsb) // ERROR "cannot convert.*\[\]int64|invalid type conversion"
+ _ = Tstring(tsb)
+ _ = Tbyte(tsb)
+ _ = Trune(tsb) // ERROR "cannot convert.*Trune|invalid type conversion"
+ _ = Tint64(tsb) // ERROR "cannot convert.*Tint64|invalid type conversion"
+
+ _ = string(tsr)
+ _ = []byte(tsr) // ERROR "cannot convert.*\[\]byte|invalid type conversion"
+ _ = []rune(tsr)
+ _ = []int64(tsr) // ERROR "cannot convert.*\[\]int64|invalid type conversion"
+ _ = Tstring(tsr)
+ _ = Tbyte(tsr) // ERROR "cannot convert.*Tbyte|invalid type conversion"
+ _ = Trune(tsr)
+ _ = Tint64(tsr) // ERROR "cannot convert.*Tint64|invalid type conversion"
+
+ _ = string(tsi) // ERROR "cannot convert.* string|invalid type conversion"
+ _ = []byte(tsi) // ERROR "cannot convert.*\[\]byte|invalid type conversion"
+ _ = []rune(tsi) // ERROR "cannot convert.*\[\]rune|invalid type conversion"
+ _ = []int64(tsi)
+ _ = Tstring(tsi) // ERROR "cannot convert.*Tstring|invalid type conversion"
+ _ = Tbyte(tsi) // ERROR "cannot convert.*Tbyte|invalid type conversion"
+ _ = Trune(tsi) // ERROR "cannot convert.*Trune|invalid type conversion"
+ _ = Tint64(tsi)
+}
diff --git a/gcc/testsuite/go.test/test/convlit.go b/gcc/testsuite/go.test/test/convlit.go
index 90ac5490c8..1e82d1f2f5 100644
--- a/gcc/testsuite/go.test/test/convlit.go
+++ b/gcc/testsuite/go.test/test/convlit.go
@@ -36,7 +36,7 @@ var good3 int = 1e9
var good4 float64 = 1e20
// explicit conversion of string is okay
-var _ = []int("abc")
+var _ = []rune("abc")
var _ = []byte("abc")
// implicit is not
@@ -47,20 +47,20 @@ var _ []byte = "abc" // ERROR "cannot use|incompatible|invalid"
type Tstring string
var ss Tstring = "abc"
-var _ = []int(ss)
+var _ = []rune(ss)
var _ = []byte(ss)
// implicit is still not
-var _ []int = ss // ERROR "cannot use|incompatible|invalid"
+var _ []rune = ss // ERROR "cannot use|incompatible|invalid"
var _ []byte = ss // ERROR "cannot use|incompatible|invalid"
-// named slice is not
-type Tint []int
+// named slice is now ok
+type Trune []rune
type Tbyte []byte
-var _ = Tint("abc") // ERROR "convert|incompatible|invalid"
-var _ = Tbyte("abc") // ERROR "convert|incompatible|invalid"
+var _ = Trune("abc") // ok
+var _ = Tbyte("abc") // ok
// implicit is still not
-var _ Tint = "abc" // ERROR "cannot use|incompatible|invalid"
+var _ Trune = "abc" // ERROR "cannot use|incompatible|invalid"
var _ Tbyte = "abc" // ERROR "cannot use|incompatible|invalid"
diff --git a/gcc/testsuite/go.test/test/copy.go b/gcc/testsuite/go.test/test/copy.go
index 037d3f41fe..0b5bddbed5 100644
--- a/gcc/testsuite/go.test/test/copy.go
+++ b/gcc/testsuite/go.test/test/copy.go
@@ -23,6 +23,15 @@ var input32 = make([]uint32, N)
var output32 = make([]uint32, N)
var input64 = make([]uint64, N)
var output64 = make([]uint64, N)
+var inputS string
+var outputS = make([]uint8, N)
+
+type my8 []uint8
+type my16 []uint16
+type my32 []uint32
+type my32b []uint32
+type my64 []uint64
+type myS string
func u8(i int) uint8 {
i = 'a' + i%26
@@ -64,6 +73,7 @@ func reset() {
for i := range input8 {
input8[i] = u8(in)
output8[i] = u8(out)
+ outputS[i] = u8(out)
input16[i] = u16(in)
output16[i] = u16(out)
input32[i] = u32(in)
@@ -73,6 +83,7 @@ func reset() {
in++
out++
}
+ inputS = string(input8)
}
func clamp(n int) int {
@@ -95,13 +106,15 @@ func ncopied(length, in, out int) int {
func doAllSlices(length, in, out int) {
reset()
- n := copy(output8[out:clamp(out+length)], input8[in:clamp(in+length)])
+ n := copy(my8(output8[out:clamp(out+length)]), input8[in:clamp(in+length)])
verify8(length, in, out, n)
- n = copy(output16[out:clamp(out+length)], input16[in:clamp(in+length)])
+ n = copy(my8(outputS[out:clamp(out+length)]), myS(inputS[in:clamp(in+length)]))
+ verifyS(length, in, out, n)
+ n = copy(my16(output16[out:clamp(out+length)]), input16[in:clamp(in+length)])
verify16(length, in, out, n)
- n = copy(output32[out:clamp(out+length)], input32[in:clamp(in+length)])
+ n = copy(my32(output32[out:clamp(out+length)]), my32b(input32[in:clamp(in+length)]))
verify32(length, in, out, n)
- n = copy(output64[out:clamp(out+length)], input64[in:clamp(in+length)])
+ n = copy(my64(output64[out:clamp(out+length)]), input64[in:clamp(in+length)])
verify64(length, in, out, n)
}
@@ -145,6 +158,46 @@ func verify8(length, in, out, m int) {
}
}
+func badS(state string, i, length, in, out int) {
+ fmt.Printf("%s bad(%d %d %d): %c not %c:\n\t%s\n\t%s\n",
+ state,
+ length, in, out,
+ outputS[i],
+ uint8(i+13),
+ inputS, outputS)
+ os.Exit(1)
+}
+
+func verifyS(length, in, out, m int) {
+ n := ncopied(length, in, out)
+ if m != n {
+ fmt.Printf("count bad(%d %d %d): %d not %d\n", length, in, out, m, n)
+ return
+ }
+ // before
+ var i int
+ for i = 0; i < out; i++ {
+ if outputS[i] != u8(i+13) {
+ badS("beforeS", i, length, in, out)
+ return
+ }
+ }
+ // copied part
+ for ; i < out+n; i++ {
+ if outputS[i] != u8(i+in-out) {
+ badS("copiedS", i, length, in, out)
+ return
+ }
+ }
+ // after
+ for ; i < len(outputS); i++ {
+ if outputS[i] != u8(i+13) {
+ badS("afterS", i, length, in, out)
+ return
+ }
+ }
+}
+
func bad16(state string, i, length, in, out int) {
fmt.Printf("%s bad(%d %d %d): %x not %x:\n\t%v\n\t%v\n",
state,
diff --git a/gcc/testsuite/go.test/test/crlf.go b/gcc/testsuite/go.test/test/crlf.go
new file mode 100644
index 0000000000..292b63bf4b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/crlf.go
@@ -0,0 +1,52 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out >tmp.go &&
+// $G tmp.go && $L tmp.$A && ./$A.out
+// rm -f tmp.go
+
+// 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 source files and strings containing \r and \r\n.
+
+package main
+
+import (
+ "fmt"
+ "strings"
+)
+
+func main() {
+ prog = strings.Replace(prog, "BQ", "`", -1)
+ prog = strings.Replace(prog, "CR", "\r", -1)
+ fmt.Print(prog)
+}
+
+var prog = `
+package main
+CR
+
+import "fmt"
+
+var CR s = "hello\n" + CR
+ " world"CR
+
+var t = BQhelloCR
+ worldBQ
+
+var u = BQhCReCRlCRlCRoCR
+ worldBQ
+
+var golden = "hello\n world"
+
+func main() {
+ if s != golden {
+ fmt.Printf("s=%q, want %q", s, golden)
+ }
+ if t != golden {
+ fmt.Printf("t=%q, want %q", t, golden)
+ }
+ if u != golden {
+ fmt.Printf("u=%q, want %q", u, golden)
+ }
+}
+`
diff --git a/gcc/testsuite/go.test/test/ddd1.go b/gcc/testsuite/go.test/test/ddd1.go
index 6f714c078a..6d84248e5e 100644
--- a/gcc/testsuite/go.test/test/ddd1.go
+++ b/gcc/testsuite/go.test/test/ddd1.go
@@ -6,6 +6,8 @@
package main
+import "unsafe"
+
func sum(args ...int) int { return 0 }
var (
@@ -13,8 +15,8 @@ var (
_ = sum()
_ = sum(1.0, 2.0)
_ = sum(1.5) // ERROR "integer"
- _ = sum("hello") // ERROR "convert|incompatible"
- _ = sum([]int{1}) // ERROR "slice literal.*as type int|incompatible"
+ _ = sum("hello") // ERROR ".hello. .type string. as type int|incompatible"
+ _ = sum([]int{1}) // ERROR "\[\]int literal.*as type int|incompatible"
)
type T []T
@@ -26,3 +28,22 @@ var (
_ = funny(nil, nil)
_ = funny([]T{}) // ok because []T{} is a T; passes []T{[]T{}}
)
+
+func bad(args ...int) {
+ print(1, 2, args...) // ERROR "[.][.][.]"
+ println(args...) // ERROR "[.][.][.]"
+ ch := make(chan int)
+ close(ch...) // ERROR "[.][.][.]"
+ _ = len(args...) // ERROR "[.][.][.]"
+ _ = new(int...) // ERROR "[.][.][.]"
+ n := 10
+ _ = make([]byte, n...) // ERROR "[.][.][.]"
+ // TODO(rsc): enable after gofmt bug is fixed
+ // _ = make([]byte, 10 ...) // error "[.][.][.]"
+ var x int
+ _ = unsafe.Pointer(&x...) // ERROR "[.][.][.]"
+ _ = unsafe.Sizeof(x...) // ERROR "[.][.][.]"
+ _ = [...]byte("foo") // ERROR "[.][.][.]"
+ _ = [...][...]int{{1,2,3},{4,5,6}} // ERROR "[.][.][.]"
+}
+
diff --git a/gcc/testsuite/go.test/test/declbad.go b/gcc/testsuite/go.test/test/declbad.go
index 5e5e145011..09f1dfb576 100644
--- a/gcc/testsuite/go.test/test/declbad.go
+++ b/gcc/testsuite/go.test/test/declbad.go
@@ -40,7 +40,7 @@ func main() {
{
// single redeclaration
i, f, s := f3()
- i := f1() // ERROR "redeclared|no new|incompatible"
+ i := 1 // ERROR "redeclared|no new|incompatible"
_, _, _ = i, f, s
}
// double redeclaration
diff --git a/gcc/testsuite/go.test/test/defer.go b/gcc/testsuite/go.test/test/defer.go
index 8b8312235d..bef8fbe26a 100644
--- a/gcc/testsuite/go.test/test/defer.go
+++ b/gcc/testsuite/go.test/test/defer.go
@@ -26,7 +26,7 @@ func test1() {
}
}
-func addDotDotDot(v ...interface{}) { result += fmt.Sprint(v) }
+func addDotDotDot(v ...interface{}) { result += fmt.Sprint(v...) }
func test2helper() {
for i := 0; i < 10; i++ {
diff --git a/gcc/testsuite/go.test/test/deferprint.go b/gcc/testsuite/go.test/test/deferprint.go
index f1e75266f7..0e0c618216 100644
--- a/gcc/testsuite/go.test/test/deferprint.go
+++ b/gcc/testsuite/go.test/test/deferprint.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// $G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
diff --git a/gcc/testsuite/go.test/test/deferprint.out b/gcc/testsuite/go.test/test/deferprint.out
new file mode 100644
index 0000000000..a71cfcebd7
--- /dev/null
+++ b/gcc/testsuite/go.test/test/deferprint.out
@@ -0,0 +1,2 @@
+printing: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+42 true false true +1.500000e+000 world 0x0 [0/0]0x0 0x0 0x0 255
diff --git a/gcc/testsuite/go.test/test/divide.go b/gcc/testsuite/go.test/test/divide.go
new file mode 100644
index 0000000000..5c0f45059a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/divide.go
@@ -0,0 +1,54 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// divide corner cases
+
+package main
+
+import "fmt"
+
+func f8(x, y, q, r int8) {
+ if t := x / y; t != q {
+ fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q)
+ }
+ if t := x % y; t != r {
+ fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r)
+ }
+}
+
+func f16(x, y, q, r int16) {
+ if t := x / y; t != q {
+ fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q)
+ }
+ if t := x % y; t != r {
+ fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r)
+ }
+}
+
+func f32(x, y, q, r int32) {
+ if t := x / y; t != q {
+ fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q)
+ }
+ if t := x % y; t != r {
+ fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r)
+ }
+}
+
+func f64(x, y, q, r int64) {
+ if t := x / y; t != q {
+ fmt.Printf("%d/%d = %d, want %d\n", x, y, t, q)
+ }
+ if t := x % y; t != r {
+ fmt.Printf("%d%%%d = %d, want %d\n", x, y, t, r)
+ }
+}
+
+func main() {
+ f8(-1<<7, -1, -1<<7, 0)
+ f16(-1<<15, -1, -1<<15, 0)
+ f32(-1<<31, -1, -1<<31, 0)
+ f64(-1<<63, -1, -1<<63, 0)
+}
diff --git a/gcc/testsuite/go.test/test/dwarf/linedirectives.go b/gcc/testsuite/go.test/test/dwarf/linedirectives.go
new file mode 100644
index 0000000000..68434f0ab5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/linedirectives.go
@@ -0,0 +1,83 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+//line foo/bar.y:4
+package main
+//line foo/bar.y:60
+func main() {
+//line foo/bar.y:297
+ f, l := 0, 0
+//line yacctab:1
+ f, l = 1, 1
+//line yaccpar:1
+ f, l = 2, 1
+//line foo/bar.y:82
+ f, l = 3, 82
+//line foo/bar.y:90
+ f, l = 3, 90
+//line foo/bar.y:92
+ f, l = 3, 92
+//line foo/bar.y:100
+ f, l = 3, 100
+//line foo/bar.y:104
+ l = 104
+//line foo/bar.y:112
+ l = 112
+//line foo/bar.y:117
+ l = 117
+//line foo/bar.y:121
+ l = 121
+//line foo/bar.y:125
+ l = 125
+//line foo/bar.y:133
+ l = 133
+//line foo/bar.y:146
+ l = 146
+//line foo/bar.y:148
+//line foo/bar.y:153
+//line foo/bar.y:155
+ l = 155
+//line foo/bar.y:160
+
+//line foo/bar.y:164
+//line foo/bar.y:173
+
+//line foo/bar.y:178
+//line foo/bar.y:180
+//line foo/bar.y:185
+//line foo/bar.y:195
+//line foo/bar.y:197
+//line foo/bar.y:202
+//line foo/bar.y:204
+//line foo/bar.y:208
+//line foo/bar.y:211
+//line foo/bar.y:213
+//line foo/bar.y:215
+//line foo/bar.y:217
+//line foo/bar.y:221
+//line foo/bar.y:229
+//line foo/bar.y:236
+//line foo/bar.y:238
+//line foo/bar.y:240
+//line foo/bar.y:244
+//line foo/bar.y:249
+//line foo/bar.y:253
+//line foo/bar.y:257
+//line foo/bar.y:262
+//line foo/bar.y:267
+//line foo/bar.y:272
+ if l == f {
+//line foo/bar.y:277
+ panic("aie!")
+//line foo/bar.y:281
+ }
+//line foo/bar.y:285
+ return
+//line foo/bar.y:288
+//line foo/bar.y:290
+}
+//line foo/bar.y:293
+//line foo/bar.y:295
diff --git a/gcc/testsuite/go.test/test/cmp2.go b/gcc/testsuite/go.test/test/dwarf/main.go
index f6f124f2e8..7f2ec4c00a 100644
--- a/gcc/testsuite/go.test/test/cmp2.go
+++ b/gcc/testsuite/go.test/test/dwarf/main.go
@@ -1,15 +1,29 @@
-// $G $D/$F.go && $L $F.$A && ! ./$A.out
+// $G $D/$F.go $D/z*.go && $L $F.$A && ./$A.out
// Copyright 2009 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
-
-func use(bool) { }
-
func main() {
- var a []int
- var ia interface{} = a
- use(ia == ia)
+F1()
+F2()
+F3()
+F4()
+F5()
+F6()
+F7()
+F8()
+F9()
+F10()
+F11()
+F12()
+F13()
+F14()
+F15()
+F16()
+F17()
+F18()
+F19()
+F20()
}
diff --git a/gcc/testsuite/go.test/test/dwarf/z1.go b/gcc/testsuite/go.test/test/dwarf/z1.go
new file mode 100644
index 0000000000..7f163e9a1d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z1.go
@@ -0,0 +1,5 @@
+
+
+//line x1.go:4
+package main
+func F1() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z10.go b/gcc/testsuite/go.test/test/dwarf/z10.go
new file mode 100644
index 0000000000..19c70020e0
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z10.go
@@ -0,0 +1,6 @@
+
+
+
+//line x10.go:4
+package main
+func F10() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z11.go b/gcc/testsuite/go.test/test/dwarf/z11.go
new file mode 100644
index 0000000000..c1d2f9180f
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z11.go
@@ -0,0 +1,4 @@
+
+//line x11.go:4
+package main
+func F11() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z12.go b/gcc/testsuite/go.test/test/dwarf/z12.go
new file mode 100644
index 0000000000..7455f18946
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z12.go
@@ -0,0 +1,4 @@
+
+//line x12.go:4
+package main
+func F12() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z13.go b/gcc/testsuite/go.test/test/dwarf/z13.go
new file mode 100644
index 0000000000..ecb3c4c8c7
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z13.go
@@ -0,0 +1,4 @@
+
+//line x13.go:4
+package main
+func F13() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z14.go b/gcc/testsuite/go.test/test/dwarf/z14.go
new file mode 100644
index 0000000000..134b39b64e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z14.go
@@ -0,0 +1,4 @@
+
+//line x14.go:4
+package main
+func F14() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z15.go b/gcc/testsuite/go.test/test/dwarf/z15.go
new file mode 100644
index 0000000000..d73819b443
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z15.go
@@ -0,0 +1,4 @@
+
+//line x15.go:4
+package main
+func F15() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z16.go b/gcc/testsuite/go.test/test/dwarf/z16.go
new file mode 100644
index 0000000000..6c31651baa
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z16.go
@@ -0,0 +1,4 @@
+
+//line x16.go:4
+package main
+func F16() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z17.go b/gcc/testsuite/go.test/test/dwarf/z17.go
new file mode 100644
index 0000000000..b742d16726
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z17.go
@@ -0,0 +1,4 @@
+
+//line x17.go:4
+package main
+func F17() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z18.go b/gcc/testsuite/go.test/test/dwarf/z18.go
new file mode 100644
index 0000000000..84150ff0a3
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z18.go
@@ -0,0 +1,5 @@
+
+
+//line x18.go:4
+package main
+func F18() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z19.go b/gcc/testsuite/go.test/test/dwarf/z19.go
new file mode 100644
index 0000000000..bb2e296841
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z19.go
@@ -0,0 +1,4 @@
+
+//line x19.go:4
+package main
+func F19() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z2.go b/gcc/testsuite/go.test/test/dwarf/z2.go
new file mode 100644
index 0000000000..68bd58257d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z2.go
@@ -0,0 +1,4 @@
+
+//line x2.go:4
+package main
+func F2() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z20.go b/gcc/testsuite/go.test/test/dwarf/z20.go
new file mode 100644
index 0000000000..03111e1845
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z20.go
@@ -0,0 +1,4 @@
+
+//line x20.go:4
+package main
+func F20() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z3.go b/gcc/testsuite/go.test/test/dwarf/z3.go
new file mode 100644
index 0000000000..5e4ad3ae25
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z3.go
@@ -0,0 +1,4 @@
+
+//line x3.go:4
+package main
+func F3() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z4.go b/gcc/testsuite/go.test/test/dwarf/z4.go
new file mode 100644
index 0000000000..1f28465c57
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z4.go
@@ -0,0 +1,4 @@
+
+//line x4.go:4
+package main
+func F4() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z5.go b/gcc/testsuite/go.test/test/dwarf/z5.go
new file mode 100644
index 0000000000..7f4eeb419a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z5.go
@@ -0,0 +1,4 @@
+
+//line x5.go:4
+package main
+func F5() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z6.go b/gcc/testsuite/go.test/test/dwarf/z6.go
new file mode 100644
index 0000000000..241791dff2
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z6.go
@@ -0,0 +1,4 @@
+
+//line x6.go:4
+package main
+func F6() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z7.go b/gcc/testsuite/go.test/test/dwarf/z7.go
new file mode 100644
index 0000000000..68c1ad0c24
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z7.go
@@ -0,0 +1,4 @@
+
+//line x7.go:4
+package main
+func F7() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z8.go b/gcc/testsuite/go.test/test/dwarf/z8.go
new file mode 100644
index 0000000000..16eed32a28
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z8.go
@@ -0,0 +1,4 @@
+
+//line x8.go:4
+package main
+func F8() {}
diff --git a/gcc/testsuite/go.test/test/dwarf/z9.go b/gcc/testsuite/go.test/test/dwarf/z9.go
new file mode 100644
index 0000000000..cbb94b4d2b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/dwarf/z9.go
@@ -0,0 +1,4 @@
+
+//line x9.go:4
+package main
+func F9() {}
diff --git a/gcc/testsuite/go.test/test/env.go b/gcc/testsuite/go.test/test/env.go
index 7646e07dd6..3c8e423283 100644
--- a/gcc/testsuite/go.test/test/env.go
+++ b/gcc/testsuite/go.test/test/env.go
@@ -1,27 +1,28 @@
-// [ $GOOS != nacl ] || exit 0 # NaCl runner does not expose environment
// $G $F.go && $L $F.$A && ./$A.out
// Copyright 2009 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 Go environment variables are present and accessible through
+// package os and package runtime.
+
package main
-import os "os"
+import (
+ "os"
+ "runtime"
+)
func main() {
- ga, e0 := os.Getenverror("GOARCH")
- if e0 != nil {
- print("$GOARCH: ", e0.String(), "\n")
- os.Exit(1)
- }
- if ga != "amd64" && ga != "386" && ga != "arm" {
- print("$GOARCH=", ga, "\n")
+ ga := os.Getenv("GOARCH")
+ if ga != runtime.GOARCH {
+ print("$GOARCH=", ga, "!= runtime.GOARCH=", runtime.GOARCH, "\n")
os.Exit(1)
}
- xxx, e1 := os.Getenverror("DOES_NOT_EXIST")
- if e1 != os.ENOENV {
- print("$DOES_NOT_EXIST=", xxx, "; err = ", e1.String(), "\n")
+ xxx := os.Getenv("DOES_NOT_EXIST")
+ if xxx != "" {
+ print("$DOES_NOT_EXIST=", xxx, "\n")
os.Exit(1)
}
}
diff --git a/gcc/testsuite/go.test/test/eof.go b/gcc/testsuite/go.test/test/eof.go
new file mode 100644
index 0000000000..81f9fd028f
--- /dev/null
+++ b/gcc/testsuite/go.test/test/eof.go
@@ -0,0 +1,9 @@
+// $G $D/$F.go
+
+// 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.
+
+// No newline at the end of this file.
+
+package main \ No newline at end of file
diff --git a/gcc/testsuite/go.test/test/eof1.go b/gcc/testsuite/go.test/test/eof1.go
new file mode 100644
index 0000000000..c39a3cfdb1
--- /dev/null
+++ b/gcc/testsuite/go.test/test/eof1.go
@@ -0,0 +1,9 @@
+// $G $D/$F.go
+
+// 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 main
+
+// No newline at the end of this comment. \ No newline at end of file
diff --git a/gcc/testsuite/go.test/test/errchk b/gcc/testsuite/go.test/test/errchk
index ab7192da2a..6b00570bde 100755
--- a/gcc/testsuite/go.test/test/errchk
+++ b/gcc/testsuite/go.test/test/errchk
@@ -3,30 +3,45 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
-# This script checks that the compilers emits the errors which we
-# expect. Usage: errchk COMPILER [OPTS] SOURCEFILE. This will run
-# the command COMPILER [OPTS] SOURCEFILE. The compilation is expected
-# to fail; if it succeeds, this script will report an error. The
-# stderr output of the compiler will be matched against comments in
-# SOURCEFILE. For each line of the source file which should generate
-# an error, there should be a comment of the form // ERROR "regexp".
-# If the compiler generates an error for a line which has no such
-# commnt, this script will report an error. Likewise if the compiler
-# does not generate an error for a line which has a comment, or if the
-# error message does not match the <regexp>. The <regexp> syntax
-# is Perl but its best to stick to egrep.
+# This script checks that the compilers emit the errors which we expect.
+# Usage: errchk COMPILER [OPTS] SOURCEFILES. This will run the command
+# COMPILER [OPTS] SOURCEFILES. The compilation is expected to fail; if
+# it succeeds, this script will report an error. The stderr output of
+# the compiler will be matched against comments in SOURCEFILES. For each
+# line of the source files which should generate an error, there should
+# be a comment of the form // ERROR "regexp". If the compiler generates
+# an error for a line which has no such comment, this script will report
+# an error. Likewise if the compiler does not generate an error for a
+# line which has a comment, or if the error message does not match the
+# <regexp>. The <regexp> syntax is Perl but its best to stick to egrep.
use POSIX;
+my $exitcode = 1;
+
+if(@ARGV >= 1 && $ARGV[0] eq "-0") {
+ $exitcode = 0;
+ shift;
+}
+
if(@ARGV < 1) {
- print STDERR "Usage: errchk COMPILER [OPTS] SOURCEFILE\n";
+ print STDERR "Usage: errchk COMPILER [OPTS] SOURCEFILES\n";
exit 1;
}
-$file = $ARGV[@ARGV-1];
-open(SRC, $file) || die "BUG: errchk: open $file: $!";
-@src = <SRC>;
-close(SRC);
+# Grab SOURCEFILES
+foreach(reverse 0 .. @ARGV-1) {
+ unless($ARGV[$_] =~ /\.go$/) {
+ @file = @ARGV[$_+1 .. @ARGV-1];
+ last;
+ }
+}
+
+foreach $file (@file) {
+ open(SRC, $file) || die "BUG: errchk: open $file: $!";
+ $src{$file} = [<SRC>];
+ close(SRC);
+}
# Run command
$cmd = join(' ', @ARGV);
@@ -39,12 +54,18 @@ $out = join('', <CMD>);
close CMD;
-if($? == 0) {
+if($exitcode != 0 && $? == 0) {
print STDERR "BUG: errchk: command succeeded unexpectedly\n";
print STDERR @out;
exit 0;
}
+if($exitcode == 0 && $? != 0) {
+ print STDERR "BUG: errchk: command failed unexpectedly\n";
+ print STDERR @out;
+ exit 0;
+}
+
if(!WIFEXITED($?)) {
print STDERR "BUG: errchk: compiler crashed\n";
print STDERR @out, "\n";
@@ -57,35 +78,67 @@ sub bug() {
}
}
-$line = 0;
-foreach $src (@src) {
- $line++;
- next unless $src =~ m|// (GC_)?ERROR (.*)|;
- $regexp = $2;
- if($regexp !~ /^"([^"]*)"/) {
- print STDERR "$file:$line: malformed regexp\n";
- next;
- }
- $regexp = $1;
-
- @errmsg = grep { /$file:$line:/ } @out;
- @out = grep { !/$file:$line:/ } @out;
- if(@errmsg == 0) {
- bug();
- print STDERR "errchk: $file:$line: missing expected error: '$regexp'\n";
- next;
- }
- @match = grep { /$regexp/ } @errmsg;
- if(@match == 0) {
- bug();
- print STDERR "errchk: $file:$line: error message does not match '$regexp'\n";
- next;
+sub chk {
+ my $file = shift;
+ my $line = 0;
+ my $regexp;
+ my @errmsg;
+ my @match;
+ foreach my $src (@{$src{$file}}) {
+ $line++;
+ next if $src =~ m|////|; # double comment disables ERROR
+ next unless $src =~ m|// (GC_)?ERROR (.*)|;
+ my $all = $2;
+ if($all !~ /^"([^"]*)"/) {
+ print STDERR "$file:$line: malformed regexp\n";
+ next;
+ }
+ @errmsg = grep { /$file:$line[:[]/ } @out;
+ @out = grep { !/$file:$line[:[]/ } @out;
+ if(@errmsg == 0) {
+ bug();
+ print STDERR "errchk: $file:$line: missing expected error: '$all'\n";
+ next;
+ }
+ foreach my $regexp ($all =~ /"([^"]*)"/g) {
+ # Turn relative line number in message into absolute line number.
+ if($regexp =~ /LINE(([+-])([0-9]+))?/) {
+ my $n = $line;
+ if(defined($1)) {
+ if($2 eq "+") {
+ $n += int($3);
+ } else {
+ $n -= int($3);
+ }
+ }
+ $regexp = "$`$file:$n$'";
+ }
+
+ @match = grep { /$regexp/ } @errmsg;
+ if(@match == 0) {
+ bug();
+ print STDERR "errchk: $file:$line: error messages do not match '$regexp'\n";
+ next;
+ }
+ @errmsg = grep { !/$regexp/ } @errmsg;
+ }
+ if(@errmsg != 0) {
+ bug();
+ print STDERR "errchk: $file:$line: unmatched error messages:\n";
+ foreach my $l (@errmsg) {
+ print STDERR "> $l";
+ }
+ }
}
}
+foreach $file (@file) {
+ chk($file)
+}
+
if(@out != 0) {
bug();
- print STDERR "errchk: $file: unmatched error messages:\n";
+ print STDERR "errchk: unmatched error messages:\n";
print STDERR "==================================================\n";
print STDERR @out;
print STDERR "==================================================\n";
diff --git a/gcc/testsuite/go.test/test/escape2.go b/gcc/testsuite/go.test/test/escape2.go
new file mode 100644
index 0000000000..73b2a7e589
--- /dev/null
+++ b/gcc/testsuite/go.test/test/escape2.go
@@ -0,0 +1,1064 @@
+// errchk -0 $G -m -l $D/$F.go
+
+// 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 foo
+
+import (
+ "fmt"
+ "unsafe"
+)
+
+var gxx *int
+
+func foo1(x int) { // ERROR "moved to heap: x"
+ gxx = &x // ERROR "&x escapes to heap"
+}
+
+func foo2(yy *int) { // ERROR "leaking param: yy"
+ gxx = yy
+}
+
+func foo3(x int) *int { // ERROR "moved to heap: x"
+ return &x // ERROR "&x escapes to heap"
+}
+
+type T *T
+
+func foo3b(t T) { // ERROR "leaking param: t"
+ *t = t
+}
+
+// xx isn't going anywhere, so use of yy is ok
+func foo4(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape"
+ xx = yy
+}
+
+// xx isn't going anywhere, so taking address of yy is ok
+func foo5(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape"
+ xx = &yy // ERROR "&yy does not escape"
+}
+
+func foo6(xx **int, yy *int) { // ERROR "xx does not escape" "leaking param: yy"
+ *xx = yy
+}
+
+func foo7(xx **int, yy *int) { // ERROR "xx does not escape" "yy does not escape"
+ **xx = *yy
+}
+
+func foo8(xx, yy *int) int { // ERROR "xx does not escape" "yy does not escape"
+ xx = yy
+ return *xx
+}
+
+func foo9(xx, yy *int) *int { // ERROR "leaking param: xx" "leaking param: yy"
+ xx = yy
+ return xx
+}
+
+func foo10(xx, yy *int) { // ERROR "xx does not escape" "yy does not escape"
+ *xx = *yy
+}
+
+func foo11() int {
+ x, y := 0, 42
+ xx := &x // ERROR "&x does not escape"
+ yy := &y // ERROR "&y does not escape"
+ *xx = *yy
+ return x
+}
+
+var xxx **int
+
+func foo12(yyy **int) { // ERROR "leaking param: yyy"
+ xxx = yyy
+}
+
+func foo13(yyy **int) { // ERROR "yyy does not escape"
+ *xxx = *yyy
+}
+
+func foo14(yyy **int) { // ERROR "yyy does not escape"
+ **xxx = **yyy
+}
+
+func foo15(yy *int) { // ERROR "moved to heap: yy"
+ xxx = &yy // ERROR "&yy escapes to heap"
+}
+
+func foo16(yy *int) { // ERROR "leaking param: yy"
+ *xxx = yy
+}
+
+func foo17(yy *int) { // ERROR "yy does not escape"
+ **xxx = *yy
+}
+
+func foo18(y int) { // ERROR "moved to heap: "y"
+ *xxx = &y // ERROR "&y escapes to heap"
+}
+
+func foo19(y int) {
+ **xxx = y
+}
+
+type Bar struct {
+ i int
+ ii *int
+}
+
+func NewBar() *Bar {
+ return &Bar{42, nil} // ERROR "&Bar literal escapes to heap"
+}
+
+func NewBarp(x *int) *Bar { // ERROR "leaking param: x"
+ return &Bar{42, x} // ERROR "&Bar literal escapes to heap"
+}
+
+func NewBarp2(x *int) *Bar { // ERROR "x does not escape"
+ return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap"
+}
+
+func (b *Bar) NoLeak() int { // ERROR "b does not escape"
+ return *(b.ii)
+}
+
+func (b *Bar) Leak() *int { // ERROR "leaking param: b"
+ return &b.i // ERROR "&b.i escapes to heap"
+}
+
+func (b *Bar) AlsoNoLeak() *int { // ERROR "b does not escape"
+ return b.ii
+}
+
+func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b"
+ return b.ii
+}
+
+func (b Bar) LeaksToo() *int { // ERROR "leaking param: b"
+ v := 0 // ERROR "moved to heap: v"
+ b.ii = &v // ERROR "&v escapes"
+ return b.ii
+}
+
+func (b *Bar) LeaksABit() *int { // ERROR "b does not escape"
+ v := 0 // ERROR "moved to heap: v"
+ b.ii = &v // ERROR "&v escapes"
+ return b.ii
+}
+
+func (b Bar) StillNoLeak() int { // ERROR "b does not escape"
+ v := 0
+ b.ii = &v // ERROR "&v does not escape"
+ return b.i
+}
+
+func goLeak(b *Bar) { // ERROR "leaking param: b"
+ go b.NoLeak()
+}
+
+type Bar2 struct {
+ i [12]int
+ ii []int
+}
+
+func NewBar2() *Bar2 {
+ return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap"
+}
+
+func (b *Bar2) NoLeak() int { // ERROR "b does not escape"
+ return b.i[0]
+}
+
+func (b *Bar2) Leak() []int { // ERROR "leaking param: b"
+ return b.i[:] // ERROR "b.i escapes to heap"
+}
+
+func (b *Bar2) AlsoNoLeak() []int { // ERROR "b does not escape"
+ return b.ii[0:1]
+}
+
+func (b Bar2) AgainNoLeak() [12]int { // ERROR "b does not escape"
+ return b.i
+}
+
+func (b *Bar2) LeakSelf() { // ERROR "leaking param: b"
+ b.ii = b.i[0:4] // ERROR "b.i escapes to heap"
+}
+
+func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b"
+ var buf []int
+ buf = b.i[0:] // ERROR "b.i escapes to heap"
+ b.ii = buf
+}
+
+func foo21() func() int {
+ x := 42 // ERROR "moved to heap: x"
+ return func() int { // ERROR "func literal escapes to heap"
+ return x // ERROR "&x escapes to heap"
+ }
+}
+
+func foo22() int {
+ x := 42
+ return func() int { // ERROR "func literal does not escape"
+ return x
+ }()
+}
+
+func foo23(x int) func() int { // ERROR "moved to heap: x"
+ return func() int { // ERROR "func literal escapes to heap"
+ return x // ERROR "&x escapes to heap"
+ }
+}
+
+func foo23a(x int) func() int { // ERROR "moved to heap: x"
+ f := func() int { // ERROR "func literal escapes to heap"
+ return x // ERROR "&x escapes to heap"
+ }
+ return f
+}
+
+func foo23b(x int) *(func() int) { // ERROR "moved to heap: x"
+ f := func() int { return x } // ERROR "moved to heap: f" "func literal escapes to heap" "&x escapes to heap"
+ return &f // ERROR "&f escapes to heap"
+}
+
+func foo24(x int) int {
+ return func() int { // ERROR "func literal does not escape"
+ return x
+ }()
+}
+
+var x *int
+
+func fooleak(xx *int) int { // ERROR "leaking param: xx"
+ x = xx
+ return *x
+}
+
+func foonoleak(xx *int) int { // ERROR "xx does not escape"
+ return *x + *xx
+}
+
+func foo31(x int) int { // ERROR "moved to heap: x"
+ return fooleak(&x) // ERROR "&x escapes to heap"
+}
+
+func foo32(x int) int {
+ return foonoleak(&x) // ERROR "&x does not escape"
+}
+
+type Foo struct {
+ xx *int
+ x int
+}
+
+var F Foo
+var pf *Foo
+
+func (f *Foo) fooleak() { // ERROR "leaking param: f"
+ pf = f
+}
+
+func (f *Foo) foonoleak() { // ERROR "f does not escape"
+ F.x = f.x
+}
+
+func (f *Foo) Leak() { // ERROR "leaking param: f"
+ f.fooleak()
+}
+
+func (f *Foo) NoLeak() { // ERROR "f does not escape"
+ f.foonoleak()
+}
+
+func foo41(x int) { // ERROR "moved to heap: x"
+ F.xx = &x // ERROR "&x escapes to heap"
+}
+
+func (f *Foo) foo42(x int) { // ERROR "f does not escape" "moved to heap: x"
+ f.xx = &x // ERROR "&x escapes to heap"
+}
+
+func foo43(f *Foo, x int) { // ERROR "f does not escape" "moved to heap: x"
+ f.xx = &x // ERROR "&x escapes to heap"
+}
+
+func foo44(yy *int) { // ERROR "leaking param: yy"
+ F.xx = yy
+}
+
+func (f *Foo) foo45() { // ERROR "f does not escape"
+ F.x = f.x
+}
+
+func (f *Foo) foo46() { // ERROR "f does not escape"
+ F.xx = f.xx
+}
+
+func (f *Foo) foo47() { // ERROR "leaking param: f"
+ f.xx = &f.x // ERROR "&f.x escapes to heap"
+}
+
+var ptrSlice []*int
+
+func foo50(i *int) { // ERROR "leaking param: i"
+ ptrSlice[0] = i
+}
+
+var ptrMap map[*int]*int
+
+func foo51(i *int) { // ERROR "leaking param: i"
+ ptrMap[i] = i
+}
+
+func indaddr1(x int) *int { // ERROR "moved to heap: x"
+ return &x // ERROR "&x escapes to heap"
+}
+
+func indaddr2(x *int) *int { // ERROR "leaking param: x"
+ return *&x // ERROR "&x does not escape"
+}
+
+func indaddr3(x *int32) *int { // ERROR "leaking param: x"
+ return *(**int)(unsafe.Pointer(&x)) // ERROR "&x does not escape"
+}
+
+// From package math:
+
+func Float32bits(f float32) uint32 {
+ return *(*uint32)(unsafe.Pointer(&f)) // ERROR "&f does not escape"
+}
+
+func Float32frombits(b uint32) float32 {
+ return *(*float32)(unsafe.Pointer(&b)) // ERROR "&b does not escape"
+}
+
+func Float64bits(f float64) uint64 {
+ return *(*uint64)(unsafe.Pointer(&f)) // ERROR "&f does not escape"
+}
+
+func Float64frombits(b uint64) float64 {
+ return *(*float64)(unsafe.Pointer(&b)) // ERROR "&b does not escape"
+}
+
+// contrast with
+func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f"
+ return (*uint64)(unsafe.Pointer(&f)) // ERROR "&f escapes to heap"
+}
+
+func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f"
+ return (*uint64)(unsafe.Pointer(f))
+}
+
+func typesw(i interface{}) *int { // ERROR "leaking param: i"
+ switch val := i.(type) {
+ case *int:
+ return val
+ case *int8:
+ v := int(*val) // ERROR "moved to heap: v"
+ return &v // ERROR "&v escapes to heap"
+ }
+ return nil
+}
+
+func exprsw(i *int) *int { // ERROR "leaking param: i"
+ switch j := i; *j + 110 {
+ case 12:
+ return j
+ case 42:
+ return nil
+ }
+ return nil
+
+}
+
+// assigning to an array element is like assigning to the array
+func foo60(i *int) *int { // ERROR "leaking param: i"
+ var a [12]*int
+ a[0] = i
+ return a[1]
+}
+
+func foo60a(i *int) *int { // ERROR "i does not escape"
+ var a [12]*int
+ a[0] = i
+ return nil
+}
+
+// assigning to a struct field is like assigning to the struct
+func foo61(i *int) *int { // ERROR "leaking param: i"
+ type S struct {
+ a, b *int
+ }
+ var s S
+ s.a = i
+ return s.b
+}
+
+func foo61a(i *int) *int { // ERROR "i does not escape"
+ type S struct {
+ a, b *int
+ }
+ var s S
+ s.a = i
+ return nil
+}
+
+// assigning to a struct field is like assigning to the struct but
+// here this subtlety is lost, since s.a counts as an assignment to a
+// track-losing dereference.
+func foo62(i *int) *int { // ERROR "leaking param: i"
+ type S struct {
+ a, b *int
+ }
+ s := new(S) // ERROR "new[(]S[)] does not escape"
+ s.a = i
+ return nil // s.b
+}
+
+type M interface {
+ M()
+}
+
+func foo63(m M) { // ERROR "m does not escape"
+}
+
+func foo64(m M) { // ERROR "leaking param: m"
+ m.M()
+}
+
+func foo64b(m M) { // ERROR "leaking param: m"
+ defer m.M()
+}
+
+type MV int
+
+func (MV) M() {}
+
+func foo65() {
+ var mv MV
+ foo63(&mv) // ERROR "&mv does not escape"
+}
+
+func foo66() {
+ var mv MV // ERROR "moved to heap: mv"
+ foo64(&mv) // ERROR "&mv escapes to heap"
+}
+
+func foo67() {
+ var mv MV
+ foo63(mv)
+}
+
+func foo68() {
+ var mv MV
+ foo64(mv) // escapes but it's an int so irrelevant
+}
+
+func foo69(m M) { // ERROR "leaking param: m"
+ foo64(m)
+}
+
+func foo70(mv1 *MV, m M) { // ERROR "leaking param: mv1" "leaking param: m"
+ m = mv1
+ foo64(m)
+}
+
+func foo71(x *int) []*int { // ERROR "leaking param: x"
+ var y []*int
+ y = append(y, x)
+ return y
+}
+
+func foo71a(x int) []*int { // ERROR "moved to heap: x"
+ var y []*int
+ y = append(y, &x) // ERROR "&x escapes to heap"
+ return y
+}
+
+func foo72() {
+ var x int
+ var y [1]*int
+ y[0] = &x // ERROR "&x does not escape"
+}
+
+func foo72aa() [10]*int {
+ var x int // ERROR "moved to heap: x"
+ var y [10]*int
+ y[0] = &x // ERROR "&x escapes to heap"
+ return y
+}
+
+func foo72a() {
+ var y [10]*int
+ for i := 0; i < 10; i++ {
+ // escapes its scope
+ x := i // ERROR "moved to heap: x"
+ y[i] = &x // ERROR "&x escapes to heap"
+ }
+ return
+}
+
+func foo72b() [10]*int {
+ var y [10]*int
+ for i := 0; i < 10; i++ {
+ x := i // ERROR "moved to heap: x"
+ y[i] = &x // ERROR "&x escapes to heap"
+ }
+ return y
+}
+
+// issue 2145
+func foo73() {
+ s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
+ for _, v := range s {
+ vv := v // ERROR "moved to heap: vv"
+ // actually just escapes its scope
+ defer func() { // ERROR "func literal escapes to heap"
+ println(vv) // ERROR "&vv escapes to heap"
+ }()
+ }
+}
+
+func foo74() {
+ s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape"
+ for _, v := range s {
+ vv := v // ERROR "moved to heap: vv"
+ // actually just escapes its scope
+ fn := func() { // ERROR "func literal escapes to heap"
+ println(vv) // ERROR "&vv escapes to heap"
+ }
+ defer fn()
+ }
+}
+
+func myprint(y *int, x ...interface{}) *int { // ERROR "x does not escape" "leaking param: y"
+ return y
+}
+
+func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "y does not escape" "leaking param: x"
+ return &x[0] // ERROR "&x.0. escapes to heap"
+}
+
+func foo75(z *int) { // ERROR "leaking param: z"
+ myprint(z, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
+}
+
+func foo75a(z *int) { // ERROR "z does not escape"
+ myprint1(z, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
+}
+
+func foo76(z *int) { // ERROR "leaking param: z"
+ myprint(nil, z) // ERROR "[.][.][.] argument does not escape"
+}
+
+func foo76a(z *int) { // ERROR "leaking param: z"
+ myprint1(nil, z) // ERROR "[.][.][.] argument escapes to heap"
+}
+
+func foo76b() {
+ myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
+}
+
+func foo76c() {
+ myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
+}
+
+func foo76d() {
+ defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument does not escape"
+}
+
+func foo76e() {
+ defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
+}
+
+func foo76f() {
+ for {
+ // TODO: This one really only escapes its scope, but we don't distinguish yet.
+ defer myprint(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
+ }
+}
+
+func foo76g() {
+ for {
+ defer myprint1(nil, 1, 2, 3) // ERROR "[.][.][.] argument escapes to heap"
+ }
+}
+
+func foo77(z []interface{}) { // ERROR "z does not escape"
+ myprint(nil, z...) // z does not escape
+}
+
+func foo77a(z []interface{}) { // ERROR "leaking param: z"
+ myprint1(nil, z...)
+}
+
+func foo78(z int) *int { // ERROR "moved to heap: z"
+ return &z // ERROR "&z escapes to heap"
+}
+
+func foo78a(z int) *int { // ERROR "moved to heap: z"
+ y := &z // ERROR "&z escapes to heap"
+ x := &y // ERROR "&y does not escape"
+ return *x // really return y
+}
+
+func foo79() *int {
+ return new(int) // ERROR "new[(]int[)] escapes to heap"
+}
+
+func foo80() *int {
+ var z *int
+ for {
+ // Really just escapes its scope but we don't distinguish
+ z = new(int) // ERROR "new[(]int[)] escapes to heap"
+ }
+ _ = z
+ return nil
+}
+
+func foo81() *int {
+ for {
+ z := new(int) // ERROR "new[(]int[)] does not escape"
+ _ = z
+ }
+ return nil
+}
+
+type Fooer interface {
+ Foo()
+}
+
+type LimitedFooer struct {
+ Fooer
+ N int64
+}
+
+func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r"
+ return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap"
+}
+
+func foo90(x *int) map[*int]*int { // ERROR "leaking param: x"
+ return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap"
+}
+
+func foo91(x *int) map[*int]*int { // ERROR "leaking param: x"
+ return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap"
+}
+
+func foo92(x *int) [2]*int { // ERROR "leaking param: x"
+ return [2]*int{x, nil}
+}
+
+// does not leak c
+func foo93(c chan *int) *int { // ERROR "c does not escape"
+ for v := range c {
+ return v
+ }
+ return nil
+}
+
+// does not leak m
+func foo94(m map[*int]*int, b bool) *int { // ERROR "m does not escape"
+ for k, v := range m {
+ if b {
+ return k
+ }
+ return v
+ }
+ return nil
+}
+
+// does leak x
+func foo95(m map[*int]*int, x *int) { // ERROR "m does not escape" "leaking param: x"
+ m[x] = x
+}
+
+// does not leak m
+func foo96(m []*int) *int { // ERROR "m does not escape"
+ return m[0]
+}
+
+// does leak m
+func foo97(m [1]*int) *int { // ERROR "leaking param: m"
+ return m[0]
+}
+
+// does not leak m
+func foo98(m map[int]*int) *int { // ERROR "m does not escape"
+ return m[0]
+}
+
+// does leak m
+func foo99(m *[1]*int) []*int { // ERROR "leaking param: m"
+ return m[:]
+}
+
+// does not leak m
+func foo100(m []*int) *int { // ERROR "m does not escape"
+ for _, v := range m {
+ return v
+ }
+ return nil
+}
+
+// does leak m
+func foo101(m [1]*int) *int { // ERROR "leaking param: m"
+ for _, v := range m {
+ return v
+ }
+ return nil
+}
+
+// does not leak m
+func foo101a(m [1]*int) *int { // ERROR "m does not escape"
+ for i := range m { // ERROR "moved to heap: i"
+ return &i // ERROR "&i escapes to heap"
+ }
+ return nil
+}
+
+// does leak x
+func foo102(m []*int, x *int) { // ERROR "m does not escape" "leaking param: x"
+ m[0] = x
+}
+
+// does not leak x
+func foo103(m [1]*int, x *int) { // ERROR "m does not escape" "x does not escape"
+ m[0] = x
+}
+
+var y []*int
+
+// does not leak x
+func foo104(x []*int) { // ERROR "x does not escape"
+ copy(y, x)
+}
+
+// does not leak x
+func foo105(x []*int) { // ERROR "x does not escape"
+ _ = append(y, x...)
+}
+
+// does leak x
+func foo106(x *int) { // ERROR "leaking param: x"
+ _ = append(y, x)
+}
+
+func foo107(x *int) map[*int]*int { // ERROR "leaking param: x"
+ return map[*int]*int{x: nil} // ERROR "map.* literal escapes to heap"
+}
+
+func foo108(x *int) map[*int]*int { // ERROR "leaking param: x"
+ return map[*int]*int{nil: x} // ERROR "map.* literal escapes to heap"
+}
+
+func foo109(x *int) *int { // ERROR "leaking param: x"
+ m := map[*int]*int{x: nil} // ERROR "map.* literal does not escape"
+ for k, _ := range m {
+ return k
+ }
+ return nil
+}
+
+func foo110(x *int) *int { // ERROR "leaking param: x"
+ m := map[*int]*int{nil: x} // ERROR "map.* literal does not escape"
+ return m[nil]
+}
+
+func foo111(x *int) *int { // ERROR "leaking param: x"
+ m := []*int{x} // ERROR "\[\]\*int literal does not escape"
+ return m[0]
+}
+
+func foo112(x *int) *int { // ERROR "leaking param: x"
+ m := [1]*int{x}
+ return m[0]
+}
+
+func foo113(x *int) *int { // ERROR "leaking param: x"
+ m := Bar{ii: x}
+ return m.ii
+}
+
+func foo114(x *int) *int { // ERROR "leaking param: x"
+ m := &Bar{ii: x} // ERROR "&Bar literal does not escape"
+ return m.ii
+}
+
+func foo115(x *int) *int { // ERROR "leaking param: x"
+ return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1))
+}
+
+func foo116(b bool) *int {
+ if b {
+ x := 1 // ERROR "moved to heap: x"
+ return &x // ERROR "&x escapes to heap"
+ } else {
+ y := 1 // ERROR "moved to heap: y"
+ return &y // ERROR "&y escapes to heap"
+ }
+ return nil
+}
+
+func foo117(unknown func(interface{})) { // ERROR "unknown does not escape"
+ x := 1 // ERROR "moved to heap: x"
+ unknown(&x) // ERROR "&x escapes to heap"
+}
+
+func foo118(unknown func(*int)) { // ERROR "unknown does not escape"
+ x := 1 // ERROR "moved to heap: x"
+ unknown(&x) // ERROR "&x escapes to heap"
+}
+
+func external(*int)
+
+func foo119(x *int) { // ERROR "leaking param: x"
+ external(x)
+}
+
+func foo120() {
+ // formerly exponential time analysis
+L1:
+L2:
+L3:
+L4:
+L5:
+L6:
+L7:
+L8:
+L9:
+L10:
+L11:
+L12:
+L13:
+L14:
+L15:
+L16:
+L17:
+L18:
+L19:
+L20:
+L21:
+L22:
+L23:
+L24:
+L25:
+L26:
+L27:
+L28:
+L29:
+L30:
+L31:
+L32:
+L33:
+L34:
+L35:
+L36:
+L37:
+L38:
+L39:
+L40:
+L41:
+L42:
+L43:
+L44:
+L45:
+L46:
+L47:
+L48:
+L49:
+L50:
+L51:
+L52:
+L53:
+L54:
+L55:
+L56:
+L57:
+L58:
+L59:
+L60:
+L61:
+L62:
+L63:
+L64:
+L65:
+L66:
+L67:
+L68:
+L69:
+L70:
+L71:
+L72:
+L73:
+L74:
+L75:
+L76:
+L77:
+L78:
+L79:
+L80:
+L81:
+L82:
+L83:
+L84:
+L85:
+L86:
+L87:
+L88:
+L89:
+L90:
+L91:
+L92:
+L93:
+L94:
+L95:
+L96:
+L97:
+L98:
+L99:
+L100:
+ // use the labels to silence compiler errors
+ goto L1
+ goto L2
+ goto L3
+ goto L4
+ goto L5
+ goto L6
+ goto L7
+ goto L8
+ goto L9
+ goto L10
+ goto L11
+ goto L12
+ goto L13
+ goto L14
+ goto L15
+ goto L16
+ goto L17
+ goto L18
+ goto L19
+ goto L20
+ goto L21
+ goto L22
+ goto L23
+ goto L24
+ goto L25
+ goto L26
+ goto L27
+ goto L28
+ goto L29
+ goto L30
+ goto L31
+ goto L32
+ goto L33
+ goto L34
+ goto L35
+ goto L36
+ goto L37
+ goto L38
+ goto L39
+ goto L40
+ goto L41
+ goto L42
+ goto L43
+ goto L44
+ goto L45
+ goto L46
+ goto L47
+ goto L48
+ goto L49
+ goto L50
+ goto L51
+ goto L52
+ goto L53
+ goto L54
+ goto L55
+ goto L56
+ goto L57
+ goto L58
+ goto L59
+ goto L60
+ goto L61
+ goto L62
+ goto L63
+ goto L64
+ goto L65
+ goto L66
+ goto L67
+ goto L68
+ goto L69
+ goto L70
+ goto L71
+ goto L72
+ goto L73
+ goto L74
+ goto L75
+ goto L76
+ goto L77
+ goto L78
+ goto L79
+ goto L80
+ goto L81
+ goto L82
+ goto L83
+ goto L84
+ goto L85
+ goto L86
+ goto L87
+ goto L88
+ goto L89
+ goto L90
+ goto L91
+ goto L92
+ goto L93
+ goto L94
+ goto L95
+ goto L96
+ goto L97
+ goto L98
+ goto L99
+ goto L100
+}
+
+func foo121() {
+ for i := 0; i < 10; i++ {
+ defer myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap"
+ go myprint(nil, i) // ERROR "[.][.][.] argument escapes to heap"
+ }
+}
+
+// same as foo121 but check across import
+func foo121b() {
+ for i := 0; i < 10; i++ {
+ defer fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap"
+ go fmt.Printf("%d", i) // ERROR "[.][.][.] argument escapes to heap"
+ }
+}
+
+// a harmless forward jump
+func foo122() {
+ var i *int
+
+ goto L1
+L1:
+ i = new(int) // ERROR "does not escape"
+ _ = i
+}
+
+// a backward jump, increases loopdepth
+func foo123() {
+ var i *int
+
+L1:
+ i = new(int) // ERROR "escapes"
+
+ goto L1
+ _ = i
+}
diff --git a/gcc/testsuite/go.test/test/escape3.go b/gcc/testsuite/go.test/test/escape3.go
new file mode 100644
index 0000000000..fc2d6ebbe4
--- /dev/null
+++ b/gcc/testsuite/go.test/test/escape3.go
@@ -0,0 +1,36 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 run-time behavior of escape analysis-related optimizations.
+
+package main
+
+func main() {
+ test1()
+}
+
+func test1() {
+ check1(0)
+ check1(1)
+ check1(2)
+}
+
+type T1 struct {
+ X, Y, Z int
+}
+
+func f() int {
+ return 1
+}
+
+func check1(pass int) T1 {
+ v := []T1{{X: f(), Z: f()}}
+ if v[0].Y != 0 {
+ panic("nonzero init")
+ }
+ v[0].Y = pass
+ return v[0]
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug014.go b/gcc/testsuite/go.test/test/fixedbugs/bug014.go
index dac2ce5174..38a6e51abc 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug014.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug014.go
@@ -11,4 +11,5 @@ func main() {
var c01 uint8 = '\07'; // ERROR "oct|char"
var cx0 uint8 = '\x0'; // ERROR "hex|char"
var cx1 uint8 = '\x'; // ERROR "hex|char"
+ _, _, _, _ = c00, c01, cx0, cx1
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug016.go b/gcc/testsuite/go.test/test/fixedbugs/bug016.go
index 461bcf82ac..4fbfd48fd9 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug016.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug016.go
@@ -1,4 +1,4 @@
-// ! $G $D/$F.go
+// errchk $G -e $D/$F.go
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -7,8 +7,8 @@
package main
func main() {
- var i int = 100;
- i = i << -3; // BUG: should not compile (negative shift)
+ var i int = 100
+ i = i << -3 // ERROR "overflows|negative"
}
/*
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug027.go b/gcc/testsuite/go.test/test/fixedbugs/bug027.go
index acc295d51a..cf2daaecf0 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug027.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug027.go
@@ -6,53 +6,76 @@
package main
+import "fmt"
+
type Element interface {
}
type Vector struct {
- nelem int;
- elem []Element;
+ nelem int
+ elem []Element
}
func New() *Vector {
- v := new(Vector);
- v.nelem = 0;
- v.elem = make([]Element, 10);
- return v;
+ v := new(Vector)
+ v.nelem = 0
+ v.elem = make([]Element, 10)
+ return v
}
func (v *Vector) At(i int) Element {
- return v.elem[i];
+ return v.elem[i]
}
func (v *Vector) Insert(e Element) {
- v.elem[v.nelem] = e;
- v.nelem++;
+ v.elem[v.nelem] = e
+ v.nelem++
}
func main() {
- type I struct { val int; };
- i0 := new(I); i0.val = 0;
- i1 := new(I); i1.val = 11;
- i2 := new(I); i2.val = 222;
- i3 := new(I); i3.val = 3333;
- i4 := new(I); i4.val = 44444;
- v := New();
- print("hi\n");
- v.Insert(i4);
- v.Insert(i3);
- v.Insert(i2);
- v.Insert(i1);
- v.Insert(i0);
+ type I struct{ val int }
+ i0 := new(I)
+ i0.val = 0
+ i1 := new(I)
+ i1.val = 11
+ i2 := new(I)
+ i2.val = 222
+ i3 := new(I)
+ i3.val = 3333
+ i4 := new(I)
+ i4.val = 44444
+ v := New()
+ r := "hi\n"
+ v.Insert(i4)
+ v.Insert(i3)
+ v.Insert(i2)
+ v.Insert(i1)
+ v.Insert(i0)
for i := 0; i < v.nelem; i++ {
- var x *I;
- x = v.At(i).(*I);
- print(i, " ", x.val, "\n"); // prints correct list
+ var x *I
+ x = v.At(i).(*I)
+ r += fmt.Sprintln(i, x.val) // prints correct list
}
for i := 0; i < v.nelem; i++ {
- print(i, " ", v.At(i).(*I).val, "\n");
+ r += fmt.Sprintln(i, v.At(i).(*I).val)
+ }
+ expect := `hi
+0 44444
+1 3333
+2 222
+3 11
+4 0
+0 44444
+1 3333
+2 222
+3 11
+4 0
+`
+ if r != expect {
+ panic(r)
}
}
+
/*
bug027.go:50: illegal types for operand
(<Element>I{}) CONV (<I>{})
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug055.go b/gcc/testsuite/go.test/test/fixedbugs/bug055.go
index 0326d828f2..8617396109 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug055.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug055.go
@@ -7,16 +7,21 @@
package main
func main() {
- var i int;
- var j int;
- if true {}
- { return }
- i = 0;
- if true {} else i++;
- type s struct {};
- i = 0;
- type s2 int;
- var k = func (a int) int { return a+1 }(3);
- _, _ = j, k;
-ro: ;
+ var i int
+ var j int
+ if true {
+ }
+ {
+ return
+ }
+ i = 0
+ if true {
+ } else {
+ i++
+ }
+ type s struct{}
+ i = 0
+ type s2 int
+ var k = func(a int) int { return a + 1 }(3)
+ _, _ = j, k
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug067.go b/gcc/testsuite/go.test/test/fixedbugs/bug067.go
index b812f01169..328d191bb4 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug067.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug067.go
@@ -10,6 +10,6 @@ var c chan int
func main() {
c = make(chan int);
- go func() { print("ok\n"); c <- 0 } ();
+ go func() { c <- 0 } ();
<-c
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug069.go b/gcc/testsuite/go.test/test/fixedbugs/bug069.go
index d6796cd72b..9038387ac8 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug069.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug069.go
@@ -6,14 +6,14 @@
package main
-func main(){
+func main() {
c := make(chan int);
ok := false;
var i int;
-
+
i, ok = <-c; // works
_, _ = i, ok;
-
+
ca := new([2]chan int);
i, ok = <-(ca[0]); // fails: c.go:11: bad shape across assignment - cr=1 cl=2
_, _ = i, ok;
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug070.go b/gcc/testsuite/go.test/test/fixedbugs/bug070.go
index 6afdd467d9..24ac779888 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug070.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug070.go
@@ -6,20 +6,35 @@
package main
+import "fmt"
+
func main() {
- var i, k int;
- outer:
- for k=0; k<2; k++ {
- print("outer loop top k ", k, "\n");
- if k != 0 { panic("k not zero") } // inner loop breaks this one every time
- for i=0; i<2; i++ {
- if i != 0 { panic("i not zero") } // loop breaks every time
- print("inner loop top i ", i, "\n");
+ var i, k int
+ var r string
+outer:
+ for k = 0; k < 2; k++ {
+ r += fmt.Sprintln("outer loop top k", k)
+ if k != 0 {
+ panic("k not zero")
+ } // inner loop breaks this one every time
+ for i = 0; i < 2; i++ {
+ if i != 0 {
+ panic("i not zero")
+ } // loop breaks every time
+ r += fmt.Sprintln("inner loop top i", i)
if true {
- print("do break\n");
- break outer;
+ r += "do break\n"
+ break outer
}
}
}
- print("broke\n");
+ r += "broke\n"
+ expect := `outer loop top k 0
+inner loop top i 0
+do break
+broke
+`
+ if r != expect {
+ panic(r)
+ }
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug076.go b/gcc/testsuite/go.test/test/fixedbugs/bug076.go
index 065cecc015..2ca518d76d 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug076.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug076.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// $G $D/$F.go && $L $F.$A
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -7,12 +7,16 @@
package main
func f() {
-exit: ;
+exit:
+ ;
+ goto exit
}
func main() {
-exit: ; // this should be legal (labels not properly scoped?)
+exit:
+ ; // this should be legal (labels not properly scoped?)
+ goto exit
}
/*
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug077.go b/gcc/testsuite/go.test/test/fixedbugs/bug077.go
index 08028ab10f..2cbf96d98f 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug077.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug077.go
@@ -7,7 +7,8 @@
package main
func main() {
- var exit int;
+ var exit int
exit:
- _ = exit;
+ _ = exit
+ goto exit
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug081.go b/gcc/testsuite/go.test/test/fixedbugs/bug081.go
index ccb3699534..026ce8002f 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug081.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug081.go
@@ -1,12 +1,12 @@
-// ! $G $D/$F.go
+// errchk $G $D/$F.go
// Copyright 2009 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
-
-const x x = 2;
+package main
+
+const x x = 2 // ERROR "loop|type"
/*
bug081.go:3: first constant must evaluate an expression
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug091.go b/gcc/testsuite/go.test/test/fixedbugs/bug091.go
index cfbb09cd82..c2ede7153c 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug091.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug091.go
@@ -7,18 +7,19 @@
package main
func f1() {
- exit:
- print("hi\n");
+exit:
+ print("hi\n")
+ goto exit
}
func f2() {
- const c = 1234;
+ const c = 1234
}
func f3() {
- i := c; // ERROR "undef"
+ i := c // ERROR "undef"
}
func main() {
- f3();
+ f3()
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug093.go b/gcc/testsuite/go.test/test/fixedbugs/bug093.go
index f80eee01fa..52d92c7e3d 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug093.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug093.go
@@ -10,7 +10,6 @@ type S struct {
}
func (p *S) M() {
- print("M\n");
}
type I interface {
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug107.go b/gcc/testsuite/go.test/test/fixedbugs/bug107.go
index d0b062a659..0554bbc8b8 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug107.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug107.go
@@ -6,7 +6,7 @@
package main
import os "os"
-type _ os.Error
+type _ os.FileInfo
func f() (os int) {
// In the next line "os" should refer to the result variable, not
// to the package.
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug108.go b/gcc/testsuite/go.test/test/fixedbugs/bug108.go
index 5c7649f081..10e406de6e 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug108.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug108.go
@@ -7,4 +7,5 @@
package main
func f() {
v := 1 << 1025; // ERROR "overflow|stupid shift"
+ _ = v
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug113.go b/gcc/testsuite/go.test/test/fixedbugs/bug113.go
index 4fd322d531..4ca07dc65a 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug113.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug113.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && (! ./$A.out || echo BUG: should not succeed)
+// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -21,8 +21,24 @@ func main() {
if foo2(v2) != 1 {
panic(2)
}
+
+ shouldPanic(p1)
+}
+
+func p1() {
+ var i I
+ i = 1
var v3 = i.(int32) // This type conversion should fail at runtime.
if foo2(v3) != 1 {
panic(3)
}
}
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("function should panic")
+ }
+ }()
+ f()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug120.go b/gcc/testsuite/go.test/test/fixedbugs/bug120.go
index 2a71957d84..bf401bf304 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug120.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug120.go
@@ -41,16 +41,16 @@ func main() {
ok := true
for i := 0; i < len(tests); i++ {
t := tests[i]
- v := strconv.Ftoa64(t.f, 'g', -1)
+ v := strconv.FormatFloat(t.f, 'g', -1, 64)
if v != t.out {
println("Bad float64 const:", t.in, "want", t.out, "got", v)
- x, err := strconv.Atof64(t.out)
+ x, err := strconv.ParseFloat(t.out, 64)
if err != nil {
println("bug120: strconv.Atof64", t.out)
panic("fail")
}
- println("\twant exact:", strconv.Ftoa64(x, 'g', 1000))
- println("\tgot exact: ", strconv.Ftoa64(t.f, 'g', 1000))
+ println("\twant exact:", strconv.FormatFloat(x, 'g', 1000, 64))
+ println("\tgot exact: ", strconv.FormatFloat(t.f, 'g', 1000, 64))
ok = false
}
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug137.go b/gcc/testsuite/go.test/test/fixedbugs/bug137.go
index 1527924116..9d43f431be 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug137.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug137.go
@@ -8,16 +8,21 @@ package main
func main() {
L1:
-L2: for i := 0; i < 10; i++ {
- print(i);
- break L2;
+L2:
+ for i := 0; i < 10; i++ {
+ print(i)
+ break L2
}
-L3: ;
-L4: for i := 0; i < 10; i++ {
- print(i);
- break L4;
+L3:
+ ;
+L4:
+ for i := 0; i < 10; i++ {
+ print(i)
+ break L4
}
+ goto L1
+ goto L3
}
/*
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug140.go b/gcc/testsuite/go.test/test/fixedbugs/bug140.go
index 33d1deb8a0..441c57a485 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug140.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug140.go
@@ -7,8 +7,17 @@
package main
func main() {
- if {} else L1: ;
- if {} else L2: main() ;
+ if true {
+ } else {
+ L1:
+ goto L1
+ }
+ if true {
+ } else {
+ goto L2
+ L2:
+ main()
+ }
}
/*
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug141.go b/gcc/testsuite/go.test/test/fixedbugs/bug141.go
index 756ba308d9..1b125e5d1e 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug141.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug141.go
@@ -20,7 +20,7 @@ type Getter interface {
func f1(p Empty) {
switch x := p.(type) {
- default: println("failed to match interface"); os.Exit(1);
+ default: println("failed to match interface", x); os.Exit(1);
case Getter: break;
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug148.go b/gcc/testsuite/go.test/test/fixedbugs/bug148.go
index daedff1053..251020c96f 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug148.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug148.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && ! ./$A.out || echo BUG: should crash
+// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -8,6 +8,8 @@ package main
type T struct {a, b int};
+func println(x, y int) { }
+
func f(x interface{}) interface{} {
type T struct {a, b int};
@@ -24,16 +26,29 @@ func main() {
inner_T := f(nil);
f(inner_T);
+ shouldPanic(p1)
+}
+
+func p1() {
outer_T := T{5, 7};
f(outer_T);
}
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("function should panic")
+ }
+ }()
+ f()
+}
+
/*
This prints:
2 3
5 7
-but it should crash: The type assertion on line 14 should fail
+but it should crash: The type assertion on line 18 should fail
for the 2nd call to f with outer_T.
*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug1515.go b/gcc/testsuite/go.test/test/fixedbugs/bug1515.go
new file mode 100644
index 0000000000..7402525164
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug1515.go
@@ -0,0 +1,20 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+const (
+ joao = "João"
+ jose = "José"
+)
+
+func main() {
+ s1 := joao
+ s2 := jose
+ if (s1 < s2) != (joao < jose) {
+ panic("unequal")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug175.go b/gcc/testsuite/go.test/test/fixedbugs/bug175.go
index a8f6e3ca40..1ca1415076 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug175.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug175.go
@@ -10,5 +10,5 @@ func f() (int, bool) { return 0, true }
func main() {
x, y := f(), 2; // ERROR "multi"
+ _, _ = x, y
}
-
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug177.go b/gcc/testsuite/go.test/test/fixedbugs/bug177.go
index 84ff59d2f5..a120ad0abf 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug177.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug177.go
@@ -5,23 +5,26 @@
// license that can be found in the LICENSE file.
package main
+
import "reflect"
-type S1 struct { i int }
-type S2 struct { S1 }
+
+type S1 struct{ i int }
+type S2 struct{ S1 }
+
func main() {
- typ := reflect.Typeof(S2{}).(*reflect.StructType);
- f := typ.Field(0);
+ typ := reflect.TypeOf(S2{})
+ f := typ.Field(0)
if f.Name != "S1" || f.Anonymous != true {
- println("BUG: ", f.Name, f.Anonymous);
- return;
+ println("BUG: ", f.Name, f.Anonymous)
+ return
}
- f, ok := typ.FieldByName("S1");
+ f, ok := typ.FieldByName("S1")
if !ok {
- println("BUG: missing S1");
- return;
+ println("BUG: missing S1")
+ return
}
if !f.Anonymous {
- println("BUG: S1 is not anonymous");
- return;
+ println("BUG: S1 is not anonymous")
+ return
}
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug178.go b/gcc/testsuite/go.test/test/fixedbugs/bug178.go
index 4f586342b4..a7ff09daee 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug178.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug178.go
@@ -9,19 +9,25 @@ package main
func main() {
L:
for i := 0; i < 1; i++ {
-L1:
+ L1:
for {
- break L;
+ break L
+ }
+ panic("BUG: not reached - break")
+ if false {
+ goto L1
}
- panic("BUG: not reached - break");
}
L2:
for i := 0; i < 1; i++ {
-L3:
+ L3:
for {
- continue L2;
+ continue L2
+ }
+ panic("BUG: not reached - continue")
+ if false {
+ goto L3
}
- panic("BUG: not reached - continue");
}
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug179.go b/gcc/testsuite/go.test/test/fixedbugs/bug179.go
index 67548733ce..3347613d8d 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug179.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug179.go
@@ -10,16 +10,18 @@ func main() {
L:
for {
for {
- break L2; // ERROR "L2"
- continue L2; // ERROR "L2"
+ break L2 // ERROR "L2"
+ continue L2 // ERROR "L2"
}
}
L1:
- x := 1;
- _ = x;
+ x := 1
+ _ = x
for {
- break L1; // ERROR "L1"
- continue L1; // ERROR "L1"
+ break L1 // ERROR "L1"
+ continue L1 // ERROR "L1"
}
+
+ goto L
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug195.go b/gcc/testsuite/go.test/test/fixedbugs/bug195.go
index 65ab02a039..d8e112a3a6 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug195.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug195.go
@@ -23,5 +23,5 @@ type I5 interface {
}
type I6 interface {
- I5 // GC_ERROR "interface"
+ I5 // ERROR "interface"
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug200.go b/gcc/testsuite/go.test/test/fixedbugs/bug200.go
index 123f687280..63b8633bd9 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug200.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug200.go
@@ -12,7 +12,7 @@ func main() {
// and worse, compiled the wrong code
// for one of them.
var x interface{};
- switch v := x.(type) {
+ switch x.(type) {
case func(int):
case func(f int): // ERROR "duplicate"
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug204.go b/gcc/testsuite/go.test/test/fixedbugs/bug204.go
index d4534c27c5..adf0aafd6b 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug204.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug204.go
@@ -7,18 +7,18 @@
package main
func main() {
- nchar := 0;
- a := []int { '日', '本', '語', 0xFFFD };
+ nchar := 0
+ a := []rune{'日', '本', '語', 0xFFFD}
for _, char := range "日本語\xc0" {
if nchar >= len(a) {
- println("BUG");
- break;
+ println("BUG")
+ break
}
if char != a[nchar] {
- println("expected", a[nchar], "got", char);
- println("BUG");
- break;
+ println("expected", a[nchar], "got", char)
+ println("BUG")
+ break
}
- nchar++;
+ nchar++
}
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug205.go b/gcc/testsuite/go.test/test/fixedbugs/bug205.go
index 4262ec10dc..e12be72f92 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug205.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug205.go
@@ -12,7 +12,7 @@ var m map[string]int;
func main() {
println(t["hi"]); // ERROR "integer"
- println(s["hi"]); // ERROR "integer"
+ println(s["hi"]); // ERROR "integer" "to type uint"
println(m[0]); // ERROR "map index"
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug213.go b/gcc/testsuite/go.test/test/fixedbugs/bug213.go
index 07d9f9029d..4d81dbb4de 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug213.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug213.go
@@ -7,7 +7,7 @@
package main
func main() {
var v interface{} = 0;
- switch x := v.(type) {
+ switch v.(type) {
case int:
fallthrough; // ERROR "fallthrough"
default:
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug219.go b/gcc/testsuite/go.test/test/fixedbugs/bug219.go
index 21361a2aab..966d3fcf31 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug219.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug219.go
@@ -12,8 +12,8 @@ func f(func()) int { return 0 }
// bug219.go:16: syntax error near if
func g1() {
if x := f(func() {
- if {}
- }); {
+ if true {}
+ }); true {
_ = x;
}
}
@@ -21,8 +21,8 @@ func g1() {
// this works
func g2() {
if x := f(func() {
- //if {}
- }); {
+ //if true {}
+ }); true {
_ = x;
}
}
@@ -30,9 +30,9 @@ func g2() {
// this works
func g3() {
x := f(func() {
- if {}
+ if true {}
});
- if {
+ if true {
_ = x;
}
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug220.go b/gcc/testsuite/go.test/test/fixedbugs/bug220.go
deleted file mode 100644
index ff027ddc22..0000000000
--- a/gcc/testsuite/go.test/test/fixedbugs/bug220.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// $G $D/$F.go || echo BUG: bug220
-
-// Copyright 2009 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
-
-func main() {
- m := make(map[int]map[uint]float64)
-
- m[0] = make(map[uint]float64), false // 6g used to reject this
- m[1] = nil
-}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug226.dir/y.go b/gcc/testsuite/go.test/test/fixedbugs/bug226.dir/y.go
deleted file mode 100644
index 01e8b7b437..0000000000
--- a/gcc/testsuite/go.test/test/fixedbugs/bug226.dir/y.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2009 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 y
-
-import "./x"
-
-func f() {
- ok := new(x.T);
- var ok1 x.T;
- ok2 := &ok1;
- ok3 := &x.T{};
- ok4 := &x.T{Y:2};
- _ = x.T{};
- _ = x.T{Y:2};
-
- ok1.M(); // ERROR "assignment.*T"
- bad1 := *ok; // ERROR "assignment.*T"
- bad2 := ok1; // ERROR "assignment.*T"
- *ok4 = ok1; // ERROR "assignment.*T"
- *ok4 = *ok2; // ERROR "assignment.*T"
- ok1 = *ok4; // ERROR "assignment.*T"
- _ = bad1;
- _ = bad2;
- _ = ok4;
- _ = ok3;
- _ = ok2;
- _ = ok1;
- _ = ok;
-}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug228.go b/gcc/testsuite/go.test/test/fixedbugs/bug228.go
index 81bc908569..da335dbc05 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug228.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug228.go
@@ -8,7 +8,7 @@ package main
func f(x int, y ...int) // ok
-func g(x int, y float) (...) // ERROR "[.][.][.]"
+func g(x int, y float) (...) // ERROR "[.][.][.]" "final argument"
func h(x, y ...int) // ERROR "[.][.][.]"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug229.go b/gcc/testsuite/go.test/test/fixedbugs/bug229.go
index fe0f0d8c75..a70a926da1 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug229.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug229.go
@@ -12,9 +12,9 @@ func main() {
var t testing.T
// make sure error mentions that
- // ch is unexported, not just "ch not found".
+ // name is unexported, not just "name not found".
- t.ch = nil // ERROR "unexported"
+ t.name = nil // ERROR "unexported"
- println(testing.anyLowercaseName("asdf")) // ERROR "unexported"
+ println(testing.anyLowercaseName("asdf")) // ERROR "unexported" "undefined: testing.anyLowercaseName"
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug231.go b/gcc/testsuite/go.test/test/fixedbugs/bug231.go
index 91996d313c..9500e582bb 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug231.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug231.go
@@ -17,6 +17,6 @@ func main() {
var i I
i = m
- i = t // ERROR "not a method|has no methods"
+ i = t // ERROR "not a method|has no methods" "does not implement I"
_ = i
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug234.go b/gcc/testsuite/go.test/test/fixedbugs/bug234.go
index b806ca64e9..562109a058 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug234.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug234.go
@@ -14,6 +14,7 @@ func main() {
println("x=", x, " ok=", ok, " want 100, true")
panic("fail")
}
+ close(c)
x, ok = <-c
if x != 0 || ok {
println("x=", x, " ok=", ok, " want 0, false")
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug238.go b/gcc/testsuite/go.test/test/fixedbugs/bug238.go
index 7e8660d37e..4d5a905f05 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug238.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug238.go
@@ -19,4 +19,3 @@ const h bool = false
const i int = 2
const j float64 = 5
-func main() { println(a, b, c, d, e, f, g) }
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug242.go b/gcc/testsuite/go.test/test/fixedbugs/bug242.go
index 5c21eaaf00..d80ae76a21 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug242.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug242.go
@@ -93,7 +93,8 @@ func main() {
m[13] = 'B'
// 13 14
- m[gint()] = gbyte(), false
+ delete(m, gint())
+ gbyte()
if _, present := m[13]; present {
println("bad map removal")
panic("fail")
@@ -103,6 +104,7 @@ func main() {
c <- 'C'
// 15 16
*f(), p1 = <-e1(c, 16)
+ close(c)
// 17 18
*f(), p2 = <-e1(c, 18)
a[17] += '0'
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug243.go b/gcc/testsuite/go.test/test/fixedbugs/bug243.go
index 357f22eb27..e3ddf0e774 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug243.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug243.go
@@ -1,4 +1,3 @@
-// [ $GOOS != nacl ] || exit 0 # no network
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2010 The Go Authors. All rights reserved.
@@ -7,12 +6,14 @@
package main
-import (
- "net"
-)
+import "errors"
+
+// Issue 481: closures and var declarations
+// with multiple variables assigned from one
+// function call.
func main() {
- var listen, _ = net.Listen("tcp", "127.0.0.1:0")
+ var listen, _ = Listen("tcp", "127.0.0.1:0")
go func() {
for {
@@ -21,6 +22,30 @@ func main() {
}
}()
- var conn, _ = net.Dial("tcp", "", listen.Addr().String())
+ var conn, _ = Dial("tcp", "", listen.Addr().Error())
_ = conn
}
+
+// Simulated net interface to exercise bug
+// without involving a real network.
+type T chan int
+
+var global T
+
+func Listen(x, y string) (T, string) {
+ global = make(chan int)
+ return global, y
+}
+
+func (t T) Addr() error {
+ return errors.New("stringer")
+}
+
+func (t T) Accept() (int, string) {
+ return <-t, ""
+}
+
+func Dial(x, y, z string) (int, string) {
+ global <- 1
+ return 0, ""
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug248.dir/bug2.go b/gcc/testsuite/go.test/test/fixedbugs/bug248.dir/bug2.go
index 4ea187a4b1..adce366770 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug248.dir/bug2.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug248.dir/bug2.go
@@ -38,11 +38,11 @@ func main() {
// meaning that reflect data for v0, v1 didn't get confused.
// path is full (rooted) path name. check suffix for gc, prefix for gccgo
- if s := reflect.Typeof(v0).PkgPath(); !strings.HasSuffix(s, "/bug0") && !strings.HasPrefix(s, "bug0") {
+ if s := reflect.TypeOf(v0).PkgPath(); !strings.HasSuffix(s, "/bug0") && !strings.HasPrefix(s, "bug0") {
println("bad v0 path", len(s), s)
panic("fail")
}
- if s := reflect.Typeof(v1).PkgPath(); !strings.HasSuffix(s, "/bug1") && !strings.HasPrefix(s, "bug1") {
+ if s := reflect.TypeOf(v1).PkgPath(); !strings.HasSuffix(s, "/bug1") && !strings.HasPrefix(s, "bug1") {
println("bad v1 path", s)
panic("fail")
}
@@ -80,7 +80,7 @@ func main() {
case 2:
i = 3.14
}
- switch k := i.(type) {
+ switch i.(type) {
case p0.T:
if j != 0 {
println("type switch p0.T")
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug251.go b/gcc/testsuite/go.test/test/fixedbugs/bug251.go
index c94ad2abe2..fb7b98a016 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug251.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug251.go
@@ -12,7 +12,7 @@ type I1 interface {
}
type I2 interface {
- I1 // GC_ERROR "loop|interface"
+ I1 // ERROR "loop|interface"
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug252.go b/gcc/testsuite/go.test/test/fixedbugs/bug252.go
index 6df94241a0..a2c1dab9d3 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug252.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug252.go
@@ -11,5 +11,5 @@ func f(args ...int) {
}
func g(args ...interface{}) {
- f(args) // ERROR "[.][.][.]|incompatible"
+ f(args) // ERROR "cannot use|incompatible"
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug257.go b/gcc/testsuite/go.test/test/fixedbugs/bug257.go
index 713c42481f..1b32475003 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug257.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug257.go
@@ -20047,11 +20047,10 @@ var gettysburg = " Four score and seven years ago our fathers brought forth on\
"\n" +
"Abraham Lincoln, November 19, 1863, Gettysburg, Pennsylvania\n"
-
func main() {
m := md5.New()
io.WriteString(m, data)
- hash := fmt.Sprintf("%x", m.Sum())
+ hash := fmt.Sprintf("%x", m.Sum(nil))
if hash != "525f06bc62a65017cd2217d7584e5920" {
println("BUG a", hash)
return
@@ -20059,7 +20058,7 @@ func main() {
m = md5.New()
io.WriteString(m, gettysburg)
- hash = fmt.Sprintf("%x", m.Sum())
+ hash = fmt.Sprintf("%x", m.Sum(nil))
if hash != "d7ec5d9d47a4d166091e8d9ebd7ea0aa" {
println("BUG gettysburg", hash)
println(len(gettysburg))
diff --git a/gcc/testsuite/go.test/test/bugs/bug260.go b/gcc/testsuite/go.test/test/fixedbugs/bug260.go
index 6a6331e65b..91dc89f77a 100644
--- a/gcc/testsuite/go.test/test/bugs/bug260.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug260.go
@@ -10,17 +10,23 @@ import (
"strconv"
)
-type T1 struct { x uint8 }
-type T2 struct { x uint16 }
-type T4 struct { x uint32 }
+type T1 struct {
+ x uint8
+}
+type T2 struct {
+ x uint16
+}
+type T4 struct {
+ x uint32
+}
func main() {
report := len(os.Args) > 1
status := 0
var b1 [10]T1
- a0, _ := strconv.Btoui64(fmt.Sprintf("%p", &b1[0])[2:], 16)
- a1, _ := strconv.Btoui64(fmt.Sprintf("%p", &b1[1])[2:], 16)
- if a1 != a0 + 1 {
+ a0, _ := strconv.ParseUint(fmt.Sprintf("%p", &b1[0])[2:], 16, 64)
+ a1, _ := strconv.ParseUint(fmt.Sprintf("%p", &b1[1])[2:], 16, 64)
+ if a1 != a0+1 {
fmt.Println("FAIL")
if report {
fmt.Println("alignment should be 1, is", a1-a0)
@@ -28,9 +34,9 @@ func main() {
status = 1
}
var b2 [10]T2
- a0, _ = strconv.Btoui64(fmt.Sprintf("%p", &b2[0])[2:], 16)
- a1, _ = strconv.Btoui64(fmt.Sprintf("%p", &b2[1])[2:], 16)
- if a1 != a0 + 2 {
+ a0, _ = strconv.ParseUint(fmt.Sprintf("%p", &b2[0])[2:], 16, 64)
+ a1, _ = strconv.ParseUint(fmt.Sprintf("%p", &b2[1])[2:], 16, 64)
+ if a1 != a0+2 {
if status == 0 {
fmt.Println("FAIL")
status = 1
@@ -40,9 +46,9 @@ func main() {
}
}
var b4 [10]T4
- a0, _ = strconv.Btoui64(fmt.Sprintf("%p", &b4[0])[2:], 16)
- a1, _ = strconv.Btoui64(fmt.Sprintf("%p", &b4[1])[2:], 16)
- if a1 != a0 + 4 {
+ a0, _ = strconv.ParseUint(fmt.Sprintf("%p", &b4[0])[2:], 16, 64)
+ a1, _ = strconv.ParseUint(fmt.Sprintf("%p", &b4[1])[2:], 16, 64)
+ if a1 != a0+4 {
if status == 0 {
fmt.Println("FAIL")
status = 1
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug262.go b/gcc/testsuite/go.test/test/fixedbugs/bug262.go
index 66f580bd1c..ebca7905f9 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug262.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug262.go
@@ -7,7 +7,7 @@
package main
import (
- "os"
+ "errors"
"strconv"
)
@@ -18,9 +18,9 @@ func f() string {
return "abc"
}
-func g() *os.Error {
+func g() *error {
trace += "g"
- var x os.Error
+ var x error
return &x
}
@@ -35,7 +35,6 @@ func i() *int {
return &i
}
-
func main() {
m := make(map[string]int)
m[f()], *g() = strconv.Atoi(h())
@@ -43,9 +42,9 @@ func main() {
println("BUG", m["abc"], trace)
panic("fail")
}
- mm := make(map[string]os.Error)
+ mm := make(map[string]error)
trace = ""
- mm["abc"] = os.EINVAL
+ mm["abc"] = errors.New("invalid")
*i(), mm[f()] = strconv.Atoi(h())
if mm["abc"] != nil || trace != "ifh" {
println("BUG1", mm["abc"], trace)
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug268.go b/gcc/testsuite/go.test/test/fixedbugs/bug268.go
deleted file mode 100644
index a38d0545b1..0000000000
--- a/gcc/testsuite/go.test/test/fixedbugs/bug268.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// 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.
-
-// http://code.google.com/p/go/issues/detail?id=745
-
-package main
-
-type T1 struct {
- T2 *T2
-}
-
-type T2 struct {
- T3 *T3
-}
-
-type T3 struct {
- T4 []*T4
-}
-
-type T4 struct {
- X int
-}
-
-func f() *T1 {
- x := &T1{
- &T2{
- &T3{
- [1]*T4{
- &T4{5},
- }[0:],
- },
- },
- }
- return x
-}
-
-func g(x int) {
- if x == 0 {
- return
- }
- g(x-1)
-}
-
-func main() {
- x := f()
- g(100) // smash temporaries left over on stack
- if x.T2.T3.T4[0].X != 5 {
- println("BUG", x.T2.T3.T4[0].X)
- }
-}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug273.go b/gcc/testsuite/go.test/test/fixedbugs/bug273.go
index 816f69e8f1..dd5aaa7b8a 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug273.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug273.go
@@ -47,15 +47,6 @@ func bigcap() {
g1 = make([]int, 10, big)
}
-const (
- addrBits = 8*uint(unsafe.Sizeof((*byte)(nil)))
- sh = addrBits/2 - 2
-)
-var g2 [][1<<sh][1<<sh]byte
-func overflow() {
- g2 = make([][1<<sh][1<<sh]byte, 64)
-}
-
var g3 map[int]int
func badmapcap() {
g3 = make(map[int]int, minus1)
@@ -74,6 +65,8 @@ func bigchancap() {
g4 = make(chan int, big)
}
+const addrBits = unsafe.Sizeof((*byte)(nil))
+
var g5 chan [1<<15]byte
func overflowchan() {
if addrBits == 32 {
@@ -92,7 +85,6 @@ func main() {
shouldfail(badcap, "badcap")
shouldfail(badcap1, "badcap1")
shouldfail(bigcap, "bigcap")
- shouldfail(overflow, "overflow")
shouldfail(badmapcap, "badmapcap")
shouldfail(bigmapcap, "bigmapcap")
shouldfail(badchancap, "badchancap")
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug274.go b/gcc/testsuite/go.test/test/fixedbugs/bug274.go
index 621f31eed3..198544c3f5 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug274.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug274.go
@@ -24,6 +24,8 @@ func main() {
case 1:
L1: // ERROR "statement"
default:
- L2: // correct since no semicolon is required before a '}'
+ // correct since no semicolon is required before a '}'
+ goto L2
+ L2:
}
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug285.go b/gcc/testsuite/go.test/test/fixedbugs/bug285.go
index 544d3487ef..7eed8fb7ab 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug285.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug285.go
@@ -45,20 +45,6 @@ func main() {
mp[p] = 42
mp[&T{7}] = 42
- type F func(x int)
- f := func(x int) {}
- mf := make(map[F]int)
- mf[nil] = 42
- mf[f] = 42
- mf[func(x int) {}] = 42
-
- type M map[int]int
- m := make(M)
- mm := make(map[M]int)
- mm[nil] = 42
- mm[m] = 42
- mm[make(M)] = 42
-
type C chan int
c := make(C)
mc := make(map[C]int)
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug286.go b/gcc/testsuite/go.test/test/fixedbugs/bug286.go
index 94423be817..eb67838561 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug286.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug286.go
@@ -12,16 +12,14 @@ type I interface {
f()
}
-
var callee string
-var error bool
+var error_ bool
type T int
func (t *T) f() { callee = "f" }
func (i *T) g() { callee = "g" }
-
// test1 and test2 are the same except that in the interface J
// the entries are swapped. test2 and test3 are the same except
// that in test3 the interface J is declared outside the function.
@@ -36,11 +34,10 @@ func test1(x I) {
x.(J).f()
if callee != "f" {
println("test1 called", callee)
- error = true
+ error_ = true
}
}
-
func test2(x I) {
type J interface {
g()
@@ -49,11 +46,10 @@ func test2(x I) {
x.(J).f()
if callee != "f" {
println("test2 called", callee)
- error = true
+ error_ = true
}
}
-
type J interface {
g()
I
@@ -63,7 +59,7 @@ func test3(x I) {
x.(J).f()
if callee != "f" {
println("test3 called", callee)
- error = true
+ error_ = true
}
}
@@ -72,7 +68,7 @@ func main() {
test1(x)
test2(x)
test3(x)
- if error {
+ if error_ {
panic("wrong method called")
}
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug297.go b/gcc/testsuite/go.test/test/fixedbugs/bug297.go
index ba029427f2..8767cdfea5 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug297.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug297.go
@@ -11,5 +11,5 @@ package main
type ByteSize float64
const (
_ = iota; // ignore first value by assigning to blank identifier
- KB ByteSize = 1<<(10*X) // ERROR "undefined"
+ KB ByteSize = 1<<(10*X) // ERROR "undefined" "as type ByteSize"
)
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug298.go b/gcc/testsuite/go.test/test/fixedbugs/bug298.go
index fe4a99a780..c16c3f98af 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug298.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug298.go
@@ -7,5 +7,5 @@
package ddd
func Sum() int
- for i := range []int{} { return i } // ERROR "return outside function|expected"
+ for i := range []int{} { return i } // ERROR "statement outside function|expected"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug305.go b/gcc/testsuite/go.test/test/fixedbugs/bug305.go
new file mode 100644
index 0000000000..758fee2698
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug305.go
@@ -0,0 +1,24 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Use //line to set the line number of the next line to 20.
+//line fixedbugs/bug305.go:20
+
+package p
+
+// Introduce an error which should be reported on line 24.
+var a int = "bogus"
+
+// Line 15 of file.
+// 16
+// 17
+// 18
+// 19
+// 20
+// 21
+// 22
+// 23
+// ERROR "cannot|incompatible"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug226.dir/x.go b/gcc/testsuite/go.test/test/fixedbugs/bug306.dir/p1.go
index 64d7a29e7e..bf87ea1491 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug226.dir/x.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug306.dir/p1.go
@@ -1,9 +1,9 @@
-// Copyright 2009 The Go Authors. All rights reserved.
+// 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 x
+package p1
-type T struct { x, Y int }
+type T <-chan int
+var x = make(chan T)
-func (t T) M()
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug306.dir/p2.go b/gcc/testsuite/go.test/test/fixedbugs/bug306.dir/p2.go
new file mode 100644
index 0000000000..3f8bd9d49b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug306.dir/p2.go
@@ -0,0 +1,8 @@
+// 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 p2
+
+import _ "./p1"
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug226.go b/gcc/testsuite/go.test/test/fixedbugs/bug306.go
index 5457a64bc1..a0a43507dc 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug226.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug306.go
@@ -1,6 +1,6 @@
-// $G $D/$F.dir/x.go && errchk $G $D/$F.dir/y.go
+// $G $D/$F.dir/p1.go && $G $D/$F.dir/p2.go
-// Copyright 2009 The Go Authors. All rights reserved.
+// 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.
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug307.go b/gcc/testsuite/go.test/test/fixedbugs/bug307.go
new file mode 100644
index 0000000000..1b42c09ab1
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug307.go
@@ -0,0 +1,15 @@
+// $G $D/$F.go
+
+// 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.
+
+// Valid program, gccgo reported an error.
+// bug307.go:14:6: error: complex arguments must have identical types
+
+package main
+
+func main() {
+ var f float64
+ _ = complex(1/f, 0)
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug270.go b/gcc/testsuite/go.test/test/fixedbugs/bug308.go
index a9cda7bd7c..c2845f0421 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug270.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug308.go
@@ -4,18 +4,16 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// http://code.google.com/p/go/issues/detail?id=746
+// issue 1136
package main
-type I interface { F() }
+import "fmt"
-type T struct{}
-
-func (T) F() {}
+func log1(f string, argv ...interface{}) {
+ fmt.Printf("log: %s\n", fmt.Sprintf(f, argv...))
+}
func main() {
- switch I(T{}).(type) {
- case interface{}:
- }
+ log1("%d", 42)
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug309.go b/gcc/testsuite/go.test/test/fixedbugs/bug309.go
new file mode 100644
index 0000000000..d893916cd9
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug309.go
@@ -0,0 +1,21 @@
+// $G $D/$F.go
+
+// 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.
+
+// issue 1016
+
+package main
+
+func foo(t interface{}, c chan int) {
+ switch v := t.(type) {
+ case int:
+ select {
+ case <-c:
+ // bug was: internal compiler error: var without type, init: v
+ }
+ default:
+ _ = v
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug311.go b/gcc/testsuite/go.test/test/fixedbugs/bug311.go
new file mode 100644
index 0000000000..ed937a6747
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug311.go
@@ -0,0 +1,20 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+func main() {
+ m := make(map[string][1000]byte)
+ m["hi"] = [1000]byte{1}
+
+ v := m["hi"]
+
+ for k, vv := range m {
+ if k != "hi" || string(v[:]) != string(vv[:]) {
+ panic("bad iter")
+ }
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug312.go b/gcc/testsuite/go.test/test/fixedbugs/bug312.go
new file mode 100644
index 0000000000..70888dd410
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug312.go
@@ -0,0 +1,22 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// issue 1172
+
+package main
+
+func main() {
+ var i interface{}
+ c := make(chan int, 1)
+ c <- 1
+ select {
+ case i = <-c: // error on this line
+ }
+ if i != 1 {
+ println("bad i", i)
+ panic("BUG")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug313.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/bug313.dir/a.go
new file mode 100644
index 0000000000..cb4ca7256b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug313.dir/a.go
@@ -0,0 +1,11 @@
+// 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 main
+
+import "fmt"
+
+func a() {
+ fmt.DoesNotExist() // ERROR "undefined"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug313.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/bug313.dir/b.go
new file mode 100644
index 0000000000..7eda72b4f8
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug313.dir/b.go
@@ -0,0 +1,11 @@
+// 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 main
+
+import . "fmt"
+
+func b() {
+ Println()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug313.go b/gcc/testsuite/go.test/test/fixedbugs/bug313.go
new file mode 100644
index 0000000000..eb2a0223b6
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug313.go
@@ -0,0 +1,19 @@
+// errchk $G -e $D/$F.dir/[ab].go
+
+// 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.
+
+// Issue 1284
+
+package bug313
+
+/*
+6g bug313.dir/[ab].go
+
+Before:
+bug313.dir/b.go:7: internal compiler error: fault
+
+Now:
+bug313.dir/a.go:10: undefined: fmt.DoesNotExist
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug314.go b/gcc/testsuite/go.test/test/fixedbugs/bug314.go
new file mode 100644
index 0000000000..95d81d7951
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug314.go
@@ -0,0 +1,31 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug314
+
+// 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.
+
+// Used to call wrong methods; issue 1290.
+
+package main
+
+type S struct {
+}
+func (S) a() int{
+ return 0
+}
+func (S) b() int{
+ return 1
+}
+
+func main() {
+ var i interface {
+ b() int
+ a() int
+ } = S{}
+ if i.a() != 0 {
+ panic("wrong method called")
+ }
+ if i.b() != 1 {
+ panic("wrong method called")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug315.go b/gcc/testsuite/go.test/test/fixedbugs/bug315.go
new file mode 100644
index 0000000000..c59ef29e6c
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug315.go
@@ -0,0 +1,18 @@
+// $G $D/$F.go || echo BUG: bug315
+
+// 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.
+
+// Issue 1368.
+
+package main
+
+func main() {
+ a := complex(2, 2)
+ a /= 2
+}
+
+/*
+bug315.go:13: internal compiler error: optoas: no entry DIV-complex
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug316.go b/gcc/testsuite/go.test/test/fixedbugs/bug316.go
new file mode 100644
index 0000000000..2146408a1e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug316.go
@@ -0,0 +1,17 @@
+// $G $D/$F.go || echo BUG: bug316
+
+// 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.
+
+// Issue 1369.
+
+package main
+
+const (
+ c = complex(1, 2)
+ r = real(c) // was: const initializer must be constant
+ i = imag(c) // was: const initializer must be constant
+)
+
+func main() {}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug317.go b/gcc/testsuite/go.test/test/fixedbugs/bug317.go
new file mode 100644
index 0000000000..0cb26c29ba
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug317.go
@@ -0,0 +1,16 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug317
+
+// 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 main
+
+func main() {
+ x := []uint{0}
+ x[0] &^= f()
+}
+
+func f() uint {
+ return 1<<31 // doesn't panic with 1<<31 - 1
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug318.go b/gcc/testsuite/go.test/test/fixedbugs/bug318.go
new file mode 100644
index 0000000000..9c46a04269
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug318.go
@@ -0,0 +1,12 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 1411.
+
+package main
+
+const ui uint = 0
+const i int = ui // ERROR "type"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug319.go b/gcc/testsuite/go.test/test/fixedbugs/bug319.go
new file mode 100644
index 0000000000..f60eee4fb2
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug319.go
@@ -0,0 +1,22 @@
+// $G $D/$F.go
+
+// 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 main
+
+import "unsafe"
+
+func main() {
+ var x int
+
+ a := uint64(uintptr(unsafe.Pointer(&x)))
+ b := uint32(uintptr(unsafe.Pointer(&x)))
+ c := uint16(uintptr(unsafe.Pointer(&x)))
+ d := int64(uintptr(unsafe.Pointer(&x)))
+ e := int32(uintptr(unsafe.Pointer(&x)))
+ f := int16(uintptr(unsafe.Pointer(&x)))
+
+ _, _, _, _, _, _ = a, b, c, d, e, f
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug320.go b/gcc/testsuite/go.test/test/fixedbugs/bug320.go
new file mode 100644
index 0000000000..06d41f2ed8
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug320.go
@@ -0,0 +1,45 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+func main() {
+ c := make(chan int, 1)
+ dummy := make(chan int)
+ v := 0x12345678
+ for i := 0; i < 10; i++ {
+ // 6g had a bug that caused select to pass &t to
+ // selectrecv before allocating the memory for t,
+ // which caused non-deterministic crashes.
+ // This test looks for the bug by checking that the
+ // value received actually ends up in t.
+ // If the allocation happens after storing through
+ // whatever garbage &t holds, the later reference
+ // to t in the case body will use the new pointer and
+ // not see the received value.
+ v += 0x1020304
+ c <- v
+ select {
+ case t := <-c:
+ go func() {
+ f(t)
+ }()
+ escape(&t)
+ if t != v {
+ println(i, v, t)
+ panic("wrong values")
+ }
+ case dummy <- 1:
+ }
+ }
+}
+
+func escape(*int) {
+}
+
+func f(int) {
+}
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug321.go b/gcc/testsuite/go.test/test/fixedbugs/bug321.go
new file mode 100644
index 0000000000..d0595ff59b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug321.go
@@ -0,0 +1,30 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug321
+
+// 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.
+
+// Troublesome floating point constants. Issue 1463.
+
+package main
+
+import "fmt"
+
+func check(test string, got, want float64) bool {
+ if got != want {
+ fmt.Println(test, "got", got, "want", want)
+ return false
+ }
+ return true
+}
+
+func main() {
+ good := true
+ // http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
+ good = good && check("2.2250738585072012e-308", 2.2250738585072012e-308, 2.2250738585072014e-308)
+ // http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
+ good = good && check("2.2250738585072011e-308", 2.2250738585072011e-308, 2.225073858507201e-308)
+ if !good {
+ panic("fail")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug322.dir/lib.go b/gcc/testsuite/go.test/test/fixedbugs/bug322.dir/lib.go
new file mode 100644
index 0000000000..0de56d3d64
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug322.dir/lib.go
@@ -0,0 +1,15 @@
+// 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 lib
+
+type T struct {
+ x int // non-exported field
+}
+
+func (t T) M() {
+}
+
+func (t *T) PM() {
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug322.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug322.dir/main.go
new file mode 100644
index 0000000000..f403c7d32e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug322.dir/main.go
@@ -0,0 +1,40 @@
+// 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 main
+
+import "./lib"
+
+type I interface {
+ M()
+}
+
+type PI interface {
+ PM()
+}
+
+func main() {
+ var t lib.T
+ t.M()
+ t.PM()
+
+ // This is still an error.
+ // var i1 I = t
+ // i1.M()
+
+ // This combination is illegal because
+ // PM requires a pointer receiver.
+ // var pi1 PI = t
+ // pi1.PM()
+
+ var pt = &t
+ pt.M()
+ pt.PM()
+
+ var i2 I = pt
+ i2.M()
+
+ var pi2 PI = pt
+ pi2.PM()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug322.go b/gcc/testsuite/go.test/test/fixedbugs/bug322.go
new file mode 100644
index 0000000000..ad0e62dc8c
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug322.go
@@ -0,0 +1,8 @@
+// $G $D/$F.dir/lib.go && $G $D/$F.dir/main.go && $L main.$A && ./$A.out || echo BUG: fails incorrectly
+
+// 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 case for issue 1402.
+ignored
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug323.go b/gcc/testsuite/go.test/test/fixedbugs/bug323.go
new file mode 100644
index 0000000000..23e2be6603
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug323.go
@@ -0,0 +1,20 @@
+// errchk $G $D/$F.go
+
+// 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 main
+
+type T struct{}
+type P *T
+
+func (t *T) Meth() {}
+func (t T) Meth2() {}
+
+func main() {
+ t := &T{}
+ p := P(t)
+ p.Meth() // ERROR "undefined"
+ p.Meth2() // ERROR "undefined"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/main.go
new file mode 100644
index 0000000000..3ab61f3eb5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/main.go
@@ -0,0 +1,53 @@
+// 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 main
+
+import (
+ "./p"
+)
+
+type Exported interface {
+ private()
+}
+
+type Implementation struct{}
+
+func (p *Implementation) private() {}
+
+
+func main() {
+ // nothing unusual here
+ var x Exported
+ x = new(Implementation)
+ x.private() // main.Implementation.private()
+
+ // same here - should be and is legal
+ var px p.Exported
+ px = p.X
+
+ // this assignment is correctly illegal:
+ // px.private undefined (cannot refer to unexported field or method private)
+ // px.private()
+
+ // this assignment is correctly illegal:
+ // *Implementation does not implement p.Exported (missing p.private method)
+ // px = new(Implementation)
+
+ // this assignment is correctly illegal:
+ // p.Exported does not implement Exported (missing private method)
+ // x = px
+
+ // this assignment unexpectedly compiles and then executes
+ defer func() {
+ recover()
+ }()
+ x = px.(Exported)
+
+ println("should not get this far")
+
+ // this is a legitimate call, but because of the previous assignment,
+ // it invokes the method private in p!
+ x.private() // p.Implementation.private()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/p.go b/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/p.go
new file mode 100644
index 0000000000..d1e3b991aa
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug324.dir/p.go
@@ -0,0 +1,15 @@
+// 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 p
+
+type Exported interface {
+ private()
+}
+
+type Implementation struct{}
+
+func (p *Implementation) private() { println("p.Implementation.private()") }
+
+var X = new(Implementation)
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug324.go b/gcc/testsuite/go.test/test/fixedbugs/bug324.go
new file mode 100644
index 0000000000..3da75630ac
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug324.go
@@ -0,0 +1,8 @@
+// $G $D/$F.dir/p.go && $G $D/$F.dir/main.go && $L main.$A && ./$A.out
+
+// 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 case for issue 1550
+ignored
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug325.go b/gcc/testsuite/go.test/test/fixedbugs/bug325.go
new file mode 100644
index 0000000000..b86740fff9
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug325.go
@@ -0,0 +1,15 @@
+// errchk $G $D/$F.go
+
+// 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 main
+
+import "unsafe"
+
+func main() {
+ var x unsafe.Pointer
+ println(*x) // ERROR "invalid indirect.*unsafe.Pointer"
+ var _ = (unsafe.Pointer)(nil).foo // ERROR "foo"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug326.go b/gcc/testsuite/go.test/test/fixedbugs/bug326.go
new file mode 100644
index 0000000000..7e123e3a39
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug326.go
@@ -0,0 +1,39 @@
+// errchk $G $D/$F.go
+
+// 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 p
+
+func f() (_ int, err error) {
+ return
+}
+
+func g() (x int, _ error) {
+ return
+}
+
+func h() (_ int, _ error) {
+ return
+}
+
+func i() (int, error) {
+ return // ERROR "not enough arguments to return"
+}
+
+func f1() (_ int, err error) {
+ return 1, nil
+}
+
+func g1() (x int, _ error) {
+ return 1, nil
+}
+
+func h1() (_ int, _ error) {
+ return 1, nil
+}
+
+func ii() (int, error) {
+ return 1, nil
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug327.go b/gcc/testsuite/go.test/test/fixedbugs/bug327.go
new file mode 100644
index 0000000000..4ba5f6072e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug327.go
@@ -0,0 +1,24 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Conversion between identical interfaces.
+// Issue 1647.
+
+// The compiler used to not realize this was a no-op,
+// so it generated a call to the non-existent function runtime.convE2E.
+
+package main
+
+type (
+ a interface{}
+ b interface{}
+)
+
+func main() {
+ x := a(1)
+ z := b(x)
+ _ = z
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug328.go b/gcc/testsuite/go.test/test/fixedbugs/bug328.go
new file mode 100644
index 0000000000..825298371f
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug328.go
@@ -0,0 +1,14 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
+
+// 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 main
+
+import "unsafe"
+
+func main() {
+ var p unsafe.Pointer
+ println(p)
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug328.out b/gcc/testsuite/go.test/test/fixedbugs/bug328.out
new file mode 100644
index 0000000000..9982566dc0
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug328.out
@@ -0,0 +1 @@
+0x0
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug329.go b/gcc/testsuite/go.test/test/fixedbugs/bug329.go
new file mode 100644
index 0000000000..0b7074d62b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug329.go
@@ -0,0 +1,46 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+type Value struct {
+ X interface{}
+ Y int
+}
+
+type Struct struct {
+ X complex128
+}
+
+const magic = 1 + 2i
+
+func (Value) Complex(x complex128) {
+ if x != magic {
+ println(x)
+ panic("bad complex magic")
+ }
+}
+
+func f(x *byte, y, z int) complex128 {
+ return magic
+}
+
+func (Value) Struct(x Struct) {
+ if x.X != magic {
+ println(x.X)
+ panic("bad struct magic")
+ }
+}
+
+func f1(x *byte, y, z int) Struct {
+ return Struct{magic}
+}
+
+func main() {
+ var v Value
+ v.Struct(f1(nil, 0, 0)) // ok
+ v.Complex(f(nil, 0, 0)) // used to fail
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug330.go b/gcc/testsuite/go.test/test/fixedbugs/bug330.go
new file mode 100644
index 0000000000..114492aff8
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug330.go
@@ -0,0 +1,13 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+func main() {
+ x := ""
+ x = +"hello" // ERROR "invalid operation.*string|expected numeric"
+ x = +x // ERROR "invalid operation.*string|expected numeric"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug331.go b/gcc/testsuite/go.test/test/fixedbugs/bug331.go
new file mode 100644
index 0000000000..6c5acd1f4d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug331.go
@@ -0,0 +1,36 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug331
+
+// 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 main
+
+import "io"
+
+func f() (_ string, x float64, err error) {
+ return
+}
+
+func g() (_ string, x float64, err error) {
+ return "hello", 3.14, io.EOF
+}
+
+var _ func() (string, float64, error) = f
+var _ func() (string, float64, error) = g
+
+func main() {
+ x, y, z := g()
+ if x != "hello" || y != 3.14 || z != io.EOF {
+ println("wrong", x, len(x), y, z)
+ }
+}
+
+/*
+issue 1712
+
+bug331.go:12: cannot use "hello" (type string) as type float64 in assignment
+bug331.go:12: cannot use 0 (type float64) as type os.Error in assignment:
+ float64 does not implement os.Error (missing String method)
+bug331.go:12: error in shape across RETURN
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug332.go b/gcc/testsuite/go.test/test/fixedbugs/bug332.go
new file mode 100644
index 0000000000..be79286b81
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug332.go
@@ -0,0 +1,17 @@
+// errchk $G $D/$F.go
+
+// 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 main
+
+// type T int
+
+func main() {}
+
+// issue 1474
+
+// important: no newline on end of next line.
+// 6g used to print <epoch> instead of bug332.go:111
+func (t *T) F() {} // ERROR "bug332" \ No newline at end of file
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug333.go b/gcc/testsuite/go.test/test/fixedbugs/bug333.go
new file mode 100644
index 0000000000..515c1f3fab
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug333.go
@@ -0,0 +1,19 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Issue 1709
+
+package main
+
+func main() {
+ type Ts string
+ var ts Ts
+ _ = []byte(ts)
+}
+
+/*
+bug333.go:14: cannot use ts (type Ts) as type string in function argument
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug334.go b/gcc/testsuite/go.test/test/fixedbugs/bug334.go
new file mode 100644
index 0000000000..870c9ae24f
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug334.go
@@ -0,0 +1,31 @@
+// $G $D/$F.go || echo BUG: bug334
+
+// 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.
+
+// Issue 1716
+
+package main
+
+type (
+ cplx64 complex64
+ cplx128 complex128
+)
+
+func (c cplx64) Foo() {}
+func (c cplx128) Foo() {}
+
+func main() {
+ var c64 cplx128
+ var c128 cplx64
+ c64.Foo()
+ c128.Foo()
+}
+
+/*
+bug334.go:16: invalid receiver type cplx64
+bug334.go:17: invalid receiver type cplx128
+bug334.go:22: c64.Foo undefined (type cplx128 has no field or method Foo)
+bug334.go:23: c128.Foo undefined (type cplx64 has no field or method Foo)
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug335.dir/a.go b/gcc/testsuite/go.test/test/fixedbugs/bug335.dir/a.go
new file mode 100644
index 0000000000..5a8112a9de
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug335.dir/a.go
@@ -0,0 +1,9 @@
+// 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 a
+
+import "./b"
+
+var Bar = b.Foo
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug335.dir/b.go b/gcc/testsuite/go.test/test/fixedbugs/bug335.dir/b.go
new file mode 100644
index 0000000000..7428c2a918
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug335.dir/b.go
@@ -0,0 +1,11 @@
+// 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 b
+
+type T interface{}
+
+func f() T { return nil }
+
+var Foo T = f()
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug335.go b/gcc/testsuite/go.test/test/fixedbugs/bug335.go
new file mode 100644
index 0000000000..915b746578
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug335.go
@@ -0,0 +1,10 @@
+// $G $D/$F.dir/b.go && $G $D/$F.dir/a.go
+// rm -f a.$A b.$A
+
+// 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.
+
+// Issue 1705.
+
+unused (see script at top of file)
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug336.go b/gcc/testsuite/go.test/test/fixedbugs/bug336.go
new file mode 100644
index 0000000000..8de36898f8
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug336.go
@@ -0,0 +1,86 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+type T1 struct {
+ Next *T2
+}
+
+type T2 T1
+
+type T3 struct {
+ Next *T4
+}
+
+type T4 T5
+type T5 T6
+type T6 T7
+type T7 T8
+type T8 T9
+type T9 T3
+
+type T10 struct {
+ x struct {
+ y ***struct {
+ z *struct {
+ Next *T11
+ }
+ }
+ }
+}
+
+type T11 T10
+
+type T12 struct {
+ F1 *T15
+ F2 *T13
+ F3 *T16
+}
+
+type T13 T14
+type T14 T15
+type T15 T16
+type T16 T17
+type T17 T12
+
+// issue 1672
+type T18 *[10]T19
+type T19 T18
+
+func main() {
+ _ = &T1{&T2{}}
+ _ = &T2{&T2{}}
+ _ = &T3{&T4{}}
+ _ = &T4{&T4{}}
+ _ = &T5{&T4{}}
+ _ = &T6{&T4{}}
+ _ = &T7{&T4{}}
+ _ = &T8{&T4{}}
+ _ = &T9{&T4{}}
+ _ = &T12{&T15{}, &T13{}, &T16{}}
+
+ var (
+ tn struct{ Next *T11 }
+ tz struct{ z *struct{ Next *T11 } }
+ tpz *struct{ z *struct{ Next *T11 } }
+ tppz **struct{ z *struct{ Next *T11 } }
+ tpppz ***struct{ z *struct{ Next *T11 } }
+ ty struct {
+ y ***struct{ z *struct{ Next *T11 } }
+ }
+ )
+ tn.Next = &T11{}
+ tz.z = &tn
+ tpz = &tz
+ tppz = &tpz
+ tpppz = &tppz
+ ty.y = tpppz
+ _ = &T10{ty}
+
+ t19s := &[10]T19{}
+ _ = T18(t19s)
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug337.go b/gcc/testsuite/go.test/test/fixedbugs/bug337.go
new file mode 100644
index 0000000000..ca9b4b4536
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug337.go
@@ -0,0 +1,19 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 1722.
+
+// Check that the error messages says
+// bug337.go:16: len("foo") not used
+// and not
+// bug337.go:16: 3 not used
+
+package main
+
+func main() {
+ len("foo") // ERROR "len|value computed is not used"
+}
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug338.go b/gcc/testsuite/go.test/test/fixedbugs/bug338.go
new file mode 100644
index 0000000000..c368a7fadc
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug338.go
@@ -0,0 +1,22 @@
+// $G $D/$F.go
+
+// 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.
+
+// Issue 1787.
+
+package main
+
+import "unsafe"
+
+const x = unsafe.Sizeof([8]byte{})
+
+func main() {
+ var b [x]int
+ _ = b
+}
+
+/*
+bug338.go:14: array bound must be non-negative
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug339.go b/gcc/testsuite/go.test/test/fixedbugs/bug339.go
new file mode 100644
index 0000000000..eac7c5ee62
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug339.go
@@ -0,0 +1,20 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Issue 1608.
+// Size used to be -1000000000.
+
+package main
+
+import "unsafe"
+
+func main() {
+ var a interface{} = 0
+ size := unsafe.Sizeof(a)
+ if size != 2*unsafe.Sizeof((*int)(nil)) {
+ println("wrong size: ", size)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug340.go b/gcc/testsuite/go.test/test/fixedbugs/bug340.go
new file mode 100644
index 0000000000..34cc013151
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug340.go
@@ -0,0 +1,17 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 1606.
+
+package main
+
+func main() {
+ var x interface{}
+ switch t := x.(type) {
+ case 0: // ERROR "type"
+ t.x = 1 // ERROR "type interface \{\}|reference to undefined field or method"
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug341.go b/gcc/testsuite/go.test/test/fixedbugs/bug341.go
new file mode 100644
index 0000000000..8ee52e1ef0
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug341.go
@@ -0,0 +1,22 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug341
+
+// 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.
+
+// Used to panic because 8g was generating incorrect
+// code for converting a negative float to a uint64.
+
+package main
+
+func main() {
+ var x float32 = -2.5
+
+ _ = uint64(x)
+ _ = float32(0)
+}
+/*
+panic: runtime error: floating point error
+
+[signal 0x8 code=0x6 addr=0x8048c64 pc=0x8048c64]
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug342.go b/gcc/testsuite/go.test/test/fixedbugs/bug342.go
new file mode 100644
index 0000000000..0852cdd348
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug342.go
@@ -0,0 +1,24 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 1871.
+
+package p
+
+type a interface {
+ foo(x int) (x int) // ERROR "redeclared|redefinition"
+}
+
+var b interface {
+ bar(y int) (y int) // ERROR "redeclared|redefinition"
+}
+
+/*
+Previously:
+
+bug.go:1 x redclared in this block
+ previous declaration at bug.go:1
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug343.go b/gcc/testsuite/go.test/test/fixedbugs/bug343.go
new file mode 100644
index 0000000000..efc87e3d7a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug343.go
@@ -0,0 +1,33 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug343
+
+// 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.
+
+// issue 1900
+
+package main
+
+func getArgs(data map[string]interface{}, keys ...string) map[string]string {
+ ret := map[string]string{}
+ var ok bool
+ for _, k := range keys {
+ ret[k], ok = data[k].(string)
+ if !ok {}
+ }
+ return ret
+}
+
+func main() {
+ x := getArgs(map[string]interface{}{"x":"y"}, "x")
+ if x["x"] != "y" {
+ println("BUG bug343", x)
+ }
+}
+
+
+/*
+typecheck [1008592b0]
+. INDREG a(1) l(15) x(24) tc(2) runtime.ret G0 string
+bug343.go:15: internal compiler error: typecheck INDREG
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug344.go b/gcc/testsuite/go.test/test/fixedbugs/bug344.go
new file mode 100644
index 0000000000..ce953f7f2f
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug344.go
@@ -0,0 +1,24 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+import "fmt"
+
+func main() {
+ // invalid use of goto.
+ // do whatever you like, just don't crash.
+ i := 42
+ a := []*int{&i, &i, &i, &i}
+ x := a[0]
+ goto start // ERROR "jumps into block"
+ z := 1
+ _ = z
+ for _, x = range a { // GCCGO_ERROR "block"
+ start:
+ fmt.Sprint(*x)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug345.dir/io.go b/gcc/testsuite/go.test/test/fixedbugs/bug345.dir/io.go
new file mode 100644
index 0000000000..1d695c3045
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug345.dir/io.go
@@ -0,0 +1,15 @@
+// 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 io
+
+type Writer interface {
+ WrongWrite()
+}
+
+type SectionReader struct {
+ X int
+}
+
+func SR(*SectionReader) {}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug345.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug345.dir/main.go
new file mode 100644
index 0000000000..ddba8dad40
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug345.dir/main.go
@@ -0,0 +1,28 @@
+// 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 main
+
+import (
+ "bufio"
+ "./io"
+ goio "io"
+)
+
+func main() {
+ // The errors here complain that io.X != io.X
+ // for different values of io so they should be
+ // showing the full import path, which for the
+ // "./io" import is really ..../go/test/io.
+ // For example:
+ //
+ // main.go:25: cannot use w (type "/Users/rsc/g/go/test/fixedbugs/bug345.dir/io".Writer) as type "io".Writer in function argument:
+ // io.Writer does not implement io.Writer (missing Write method)
+ // main.go:27: cannot use &x (type *"io".SectionReader) as type *"/Users/rsc/g/go/test/fixedbugs/bug345.dir/io".SectionReader in function argument
+
+ var w io.Writer
+ bufio.NewWriter(w) // ERROR "test/io|has incompatible type"
+ var x goio.SectionReader
+ io.SR(&x) // ERROR "test/io|has incompatible type"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug345.go b/gcc/testsuite/go.test/test/fixedbugs/bug345.go
new file mode 100644
index 0000000000..874710ce88
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug345.go
@@ -0,0 +1,7 @@
+// $G $D/$F.dir/io.go && errchk $G -e $D/$F.dir/main.go
+
+// 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 ignored
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug346.go b/gcc/testsuite/go.test/test/fixedbugs/bug346.go
new file mode 100644
index 0000000000..31284c31a1
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug346.go
@@ -0,0 +1,19 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: issue2056
+
+// 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 main
+
+import "os"
+
+func main() {
+ x := 4
+ a, b, c, d := func(i int) (p int, q int, r int, s int) { return 1, i, 3, x }(2)
+
+ if a != 1 || b != 2 || c != 3 || d != 4 {
+ println("abcd: expected 1 2 3 4 got", a, b, c, d)
+ os.Exit(1)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug347.go b/gcc/testsuite/go.test/test/fixedbugs/bug347.go
new file mode 100644
index 0000000000..5532cee831
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug347.go
@@ -0,0 +1,49 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+import (
+ "runtime"
+ "strings"
+)
+
+var t *struct {
+ c chan int
+}
+
+var c chan int
+
+func f() {
+ select {
+ case <-t.c: // THIS IS LINE 22
+ break
+ case <-c:
+ break
+ }
+}
+
+func main() {
+ defer func() {
+ recover()
+ for i := 0;; i++ {
+ pc, file, line, ok := runtime.Caller(i)
+ if !ok {
+ print("BUG: bug347: cannot find caller\n")
+ return
+ }
+ if !strings.Contains(file, "bug347.go") || runtime.FuncForPC(pc).Name() != "main.f" {
+ // walk past runtime frames
+ continue
+ }
+ if line != 22 {
+ print("BUG: bug347: panic at ", file, ":", line, " in ", runtime.FuncForPC(pc).Name(), "\n")
+ }
+ return
+ }
+ }()
+ f()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug348.go b/gcc/testsuite/go.test/test/fixedbugs/bug348.go
new file mode 100644
index 0000000000..1a539aa3e4
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug348.go
@@ -0,0 +1,46 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+import (
+ "runtime"
+ "strings"
+)
+
+func f() {
+ var x *string
+
+ for _, i := range *x { // THIS IS LINE 17
+ println(i)
+ }
+}
+
+func g() {
+}
+
+func main() {
+ defer func() {
+ for i := 0;; i++ {
+ pc, file, line, ok := runtime.Caller(i)
+ if !ok {
+ print("BUG: bug348: cannot find caller\n")
+ return
+ }
+ if !strings.Contains(file, "bug348.go") || runtime.FuncForPC(pc).Name() != "main.f" {
+ // walk past runtime frames
+ continue
+ }
+ if line != 17 {
+ print("BUG: bug348: panic at ", file, ":", line, " in ", runtime.FuncForPC(pc).Name(), "\n")
+ return
+ }
+ recover()
+ return
+ }
+ }()
+ f()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug349.go b/gcc/testsuite/go.test/test/fixedbugs/bug349.go
new file mode 100644
index 0000000000..e7612edb77
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug349.go
@@ -0,0 +1,13 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 1192 - detail in error
+
+package main
+
+func foo() (a, b, c int) {
+ return 0, 1 2.01 // ERROR "unexpected literal 2.01|expected ';' or '}' or newline|not enough arguments to return"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug350.go b/gcc/testsuite/go.test/test/fixedbugs/bug350.go
new file mode 100644
index 0000000000..f8df3f58b9
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug350.go
@@ -0,0 +1,15 @@
+// errchk $G $D/$F.go
+
+// 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 main
+
+type T int
+
+func (T) m() {} // GCCGO_ERROR "previous"
+func (T) m() {} // ERROR "T[.]m redeclared|redefinition"
+
+func (*T) p() {} // GCCGO_ERROR "previous"
+func (*T) p() {} // ERROR "[(][*]T[)][.]p redeclared|redefinition"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug351.go b/gcc/testsuite/go.test/test/fixedbugs/bug351.go
new file mode 100644
index 0000000000..9625c6a501
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug351.go
@@ -0,0 +1,13 @@
+// errchk $G $D/$F.go
+
+// 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 main
+
+var x int
+
+func main() {
+ (x) := 0 // ERROR "non-name [(]x[)]|non-name on left side"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug352.go b/gcc/testsuite/go.test/test/fixedbugs/bug352.go
new file mode 100644
index 0000000000..62fd006c42
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug352.go
@@ -0,0 +1,19 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug352
+
+// 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 main
+
+var x [10][0]byte
+var y = make([]struct{}, 10)
+
+func main() {
+ if &x[1] != &x[2] {
+ println("BUG: bug352 [0]byte")
+ }
+ if &y[1] != &y[2] {
+ println("BUG: bug352 struct{}")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug353.go b/gcc/testsuite/go.test/test/fixedbugs/bug353.go
new file mode 100644
index 0000000000..b59d97f338
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug353.go
@@ -0,0 +1,30 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 2089 - internal compiler error
+
+package main
+
+import (
+ "io"
+ "os"
+)
+
+func echo(fd io.ReadWriterCloser) { // ERROR "undefined.*io.ReadWriterCloser"
+ var buf [1024]byte
+ for {
+ n, err := fd.Read(buf)
+ if err != nil {
+ break
+ }
+ fd.Write(buf[0:n])
+ }
+}
+
+func main() {
+ fd, _ := os.Open("a.txt")
+ echo(fd)
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug354.go b/gcc/testsuite/go.test/test/fixedbugs/bug354.go
new file mode 100644
index 0000000000..a95256e272
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug354.go
@@ -0,0 +1,22 @@
+// $G $D/$F.go || echo BUG: bug354
+
+// 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.
+
+// issue 2086
+// was calling makeclosure twice on the closure
+
+package main
+
+type Inner struct {
+ F func() error
+}
+
+type Outer struct {
+ Inners []Inner
+}
+
+// calls makeclosure twice on same closure
+
+var Foo = Outer{[]Inner{Inner{func() error { return nil }}}}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug001.go b/gcc/testsuite/go.test/test/fixedbugs/bug355.go
index 2df8791fff..a9cf0161b0 100644
--- a/gcc/testsuite/go.test/test/fixedbugs/bug001.go
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug355.go
@@ -1,11 +1,18 @@
// $G $D/$F.go && $L $F.$A && ./$A.out
-// Copyright 2009 The Go Authors. All rights reserved.
+// 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 main
+var f = func() int {
+ type S int
+ return 42
+}
+
func main() {
- if {} // compiles; should be an error (must be an expression)
+ if f() != 42 {
+ panic("BUG: bug355")
+ }
}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug356.go b/gcc/testsuite/go.test/test/fixedbugs/bug356.go
new file mode 100644
index 0000000000..d21f0cfac6
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug356.go
@@ -0,0 +1,41 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug344
+
+// 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.
+
+// issue 1808
+
+package main
+
+func main() {
+ var i uint64
+ var x int = 12345
+
+ if y := x << (i&5); y != 12345<<0 {
+ println("BUG bug344", y)
+ return
+ }
+
+ i++
+ if y := x << (i&5); y != 12345<<1 {
+ println("BUG bug344a", y)
+ }
+
+ i = 70
+ if y := x << i; y != 0 {
+ println("BUG bug344b", y)
+ }
+
+ i = 1<<32
+ if y := x << i; y != 0 {
+ println("BUG bug344c", y)
+ }
+}
+
+
+/*
+typecheck [1008592b0]
+. INDREG a(1) l(15) x(24) tc(2) runtime.ret G0 string
+bug343.go:15: internal compiler error: typecheck INDREG
+*/
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug357.go b/gcc/testsuite/go.test/test/fixedbugs/bug357.go
new file mode 100644
index 0000000000..448d982637
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug357.go
@@ -0,0 +1,26 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 1993.
+// error used to have last line number in file
+
+package main
+
+func bla1() bool {
+ return false
+}
+
+func bla5() bool {
+ _ = 1
+ false // ERROR "false not used|value computed is not used"
+ _ = 2
+ return false
+}
+
+func main() {
+ x := bla1()
+ _ = x
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug358.go b/gcc/testsuite/go.test/test/fixedbugs/bug358.go
new file mode 100644
index 0000000000..82fbf7f815
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug358.go
@@ -0,0 +1,26 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 1979
+// used to get internal compiler error too
+
+package main
+
+import (
+ "io/ioutil" // GCCGO_ERROR "imported and not used"
+ "net/http"
+ "os"
+)
+
+func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) // ERROR "syntax error|invalid use of type"
+}
+
+type Page struct {
+ Title string
+ Body []byte
+}
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug361.go b/gcc/testsuite/go.test/test/fixedbugs/bug361.go
new file mode 100644
index 0000000000..d2a64bcef4
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug361.go
@@ -0,0 +1,15 @@
+// $G $D/$F.go || echo BUG: bug360
+
+// 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.
+
+// issue 1908
+// unreasonable width used to be internal fatal error
+
+package test
+
+func main() {
+ buf := [1<<30]byte{}
+ _ = buf[:]
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug362.go b/gcc/testsuite/go.test/test/fixedbugs/bug362.go
new file mode 100644
index 0000000000..f38572c0d0
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug362.go
@@ -0,0 +1,16 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 1662
+// iota inside var
+
+package main
+
+var (
+ a = iota // ERROR "undefined: iota|iota is only defined in const"
+ b = iota // ERROR "undefined: iota|iota is only defined in const"
+ c = iota // ERROR "undefined: iota|iota is only defined in const"
+)
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug363.go b/gcc/testsuite/go.test/test/fixedbugs/bug363.go
new file mode 100644
index 0000000000..9347ec28b6
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug363.go
@@ -0,0 +1,21 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 1664
+
+package main
+
+func main() {
+ var i uint = 33
+ var a = (1<<i) + 4.5 // ERROR "shift of type float64|invalid.*shift"
+ println(a)
+
+ var b = (1<<i) + 4.0 // ERROR "shift of type float64|invalid.*shift"
+ println(b)
+
+ var c int64 = (1<<i) + 4.0 // ok - it's all int64
+ println(c)
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug364.go b/gcc/testsuite/go.test/test/fixedbugs/bug364.go
new file mode 100644
index 0000000000..a93312107e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug364.go
@@ -0,0 +1,31 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+import "fmt"
+
+var s string
+
+func accum(args ...interface{}) {
+ s += fmt.Sprintln(args...)
+}
+
+func f(){
+ v := 0.0
+ for i := 0; i < 3; i++ {
+ v += 0.1
+ defer accum(v)
+ }
+}
+
+func main() {
+ f()
+ if s != "0.30000000000000004\n0.2\n0.1\n" {
+ println("BUG: defer")
+ print(s)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug365.go b/gcc/testsuite/go.test/test/fixedbugs/bug365.go
new file mode 100644
index 0000000000..bc8c2c5e62
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug365.go
@@ -0,0 +1,22 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// check that compiler doesn't stop reading struct def
+// after first unknown type.
+
+// Fixes issue 2110.
+
+package main
+
+type S struct {
+ err foo.Bar // ERROR "undefined|expected package"
+ Num int
+}
+
+func main() {
+ s := S{}
+ _ = s.Num // no error here please
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug366.go b/gcc/testsuite/go.test/test/fixedbugs/bug366.go
new file mode 100644
index 0000000000..8c000f50a9
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug366.go
@@ -0,0 +1,37 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Issue 2206. Incorrect sign extension of div arguments.
+
+package main
+
+func five(x int64) {
+ if x != 5 {
+ panic(x)
+ }
+}
+
+func main() {
+ // 5
+ five(int64(5 / (5 / 3)))
+
+ // 5
+ five(int64(byte(5) / (byte(5) / byte(3))))
+
+ // 5
+ var a, b byte = 5, 3
+ five(int64(a / (a / b)))
+
+ // integer divide by zero in golang.org sandbox
+ // 0 on windows/amd64
+ x := [3]byte{2, 3, 5}
+ five(int64(x[2] / (x[2] / x[1])))
+
+ // integer divide by zero in golang.org sandbox
+ // crash on windows/amd64
+ y := x[1:3]
+ five(int64(y[1] / (y[1] / y[0])))
+} \ No newline at end of file
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/main.go b/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/main.go
new file mode 100644
index 0000000000..21e9a5002c
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/main.go
@@ -0,0 +1,24 @@
+package main
+
+import (
+ "./p"
+)
+
+type T struct{ *p.S }
+type I interface {
+ get()
+}
+
+func main() {
+ var t T
+ p.F(t)
+ var x interface{} = t
+ _, ok := x.(I)
+ if ok {
+ panic("should not satisfy main.I")
+ }
+ _, ok = x.(p.I)
+ if !ok {
+ panic("should satisfy p.I")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/p.go b/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/p.go
new file mode 100644
index 0000000000..c8772d2d05
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug367.dir/p.go
@@ -0,0 +1,15 @@
+package p
+
+type T struct{ x int }
+type S struct{}
+
+func (p *S) get() {
+}
+
+type I interface {
+ get()
+}
+
+func F(i I) {
+ i.get()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug367.go b/gcc/testsuite/go.test/test/fixedbugs/bug367.go
new file mode 100644
index 0000000000..25d11a1531
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug367.go
@@ -0,0 +1,7 @@
+// $G $D/$F.dir/p.go && $G $D/$F.dir/main.go && $L main.$A && ./$A.out || echo BUG: should not fail
+
+// 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 ignored
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug368.go b/gcc/testsuite/go.test/test/fixedbugs/bug368.go
new file mode 100644
index 0000000000..8d94f531c9
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug368.go
@@ -0,0 +1,26 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+// 5g bug used to set up the 0 for -f() before calling f,
+// and the call to f smashed the register.
+
+func f(n int) int {
+ s := 0
+ for i := 0; i < n; i++ {
+ s += i>>1
+ }
+ return s
+}
+
+func main() {
+ x := -f(100)
+ if x != -2450 {
+ println(x)
+ panic("broken")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug369.dir/pkg.go b/gcc/testsuite/go.test/test/fixedbugs/bug369.dir/pkg.go
new file mode 100644
index 0000000000..cf57041928
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug369.dir/pkg.go
@@ -0,0 +1,15 @@
+// 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 pkg
+
+func NonASCII(b []byte, i int) int {
+ for i = 0; i < len(b); i++ {
+ if b[i] >= 0x80 {
+ break
+ }
+ }
+ return i
+}
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug369.go b/gcc/testsuite/go.test/test/fixedbugs/bug369.go
new file mode 100644
index 0000000000..8eb23eecf1
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug369.go
@@ -0,0 +1,59 @@
+// $G -N -o slow.$A $D/bug369.dir/pkg.go &&
+// $G -o fast.$A $D/bug369.dir/pkg.go &&
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 that compiling with optimization turned on produces faster code.
+
+package main
+
+import (
+ "flag"
+ "os"
+ "runtime"
+ "testing"
+
+ fast "./fast"
+ slow "./slow"
+)
+
+var buf = make([]byte, 1048576)
+
+func BenchmarkFastNonASCII(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ fast.NonASCII(buf, 0)
+ }
+}
+
+func BenchmarkSlowNonASCII(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ slow.NonASCII(buf, 0)
+ }
+}
+
+func main() {
+ os.Args = []string{os.Args[0], "-test.benchtime=0.1"}
+ flag.Parse()
+
+ rslow := testing.Benchmark(BenchmarkSlowNonASCII)
+ rfast := testing.Benchmark(BenchmarkFastNonASCII)
+ tslow := rslow.NsPerOp()
+ tfast := rfast.NsPerOp()
+
+ // Optimization should be good for at least 2x, but be forgiving.
+ // On the ARM simulator we see closer to 1.5x.
+ speedup := float64(tslow)/float64(tfast)
+ want := 1.8
+ if runtime.GOARCH == "arm" {
+ want = 1.3
+ }
+ if speedup < want {
+ // TODO(rsc): doesn't work on linux-amd64 or darwin-amd64 builders, nor on
+ // a Lenovo x200 (linux-amd64) laptop.
+ //println("fast:", tfast, "slow:", tslow, "speedup:", speedup, "want:", want)
+ //println("not fast enough")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug370.go b/gcc/testsuite/go.test/test/fixedbugs/bug370.go
new file mode 100644
index 0000000000..9cb45f6e0d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug370.go
@@ -0,0 +1,18 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+// issue 2337
+// The program deadlocked.
+
+import "runtime"
+
+func main() {
+ runtime.GOMAXPROCS(2)
+ runtime.GC()
+ runtime.GOMAXPROCS(1)
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug371.go b/gcc/testsuite/go.test/test/fixedbugs/bug371.go
new file mode 100644
index 0000000000..bf993df068
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug371.go
@@ -0,0 +1,24 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 2343
+
+package main
+
+type T struct {}
+
+func (t *T) pm() {}
+func (t T) m() {}
+
+func main() {
+ p := &T{}
+ p.pm()
+ p.m()
+
+ q := &p
+ q.m() // ERROR "requires explicit dereference"
+ q.pm()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug372.go b/gcc/testsuite/go.test/test/fixedbugs/bug372.go
new file mode 100644
index 0000000000..a6f7208bbd
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug372.go
@@ -0,0 +1,28 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug372
+
+// 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.
+
+// Issue 2355
+package main
+
+type T struct {}
+func (T) m() string { return "T" }
+
+type TT struct {
+ T
+ m func() string
+}
+
+
+func ff() string { return "ff" }
+
+func main() {
+ var tt TT
+ tt.m = ff
+
+ if tt.m() != "ff" {
+ println(tt.m(), "!= \"ff\"")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug373.go b/gcc/testsuite/go.test/test/fixedbugs/bug373.go
new file mode 100644
index 0000000000..934a6c7328
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug373.go
@@ -0,0 +1,32 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 873, 2162
+
+package foo
+
+func f(x interface{}) {
+ switch t := x.(type) { // ERROR "declared and not used"
+ case int:
+ }
+}
+
+func g(x interface{}) {
+ switch t := x.(type) {
+ case int:
+ case float32:
+ println(t)
+ }
+}
+
+func h(x interface{}) {
+ switch t := x.(type) {
+ case int:
+ case float32:
+ default:
+ println(t)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug374.go b/gcc/testsuite/go.test/test/fixedbugs/bug374.go
new file mode 100644
index 0000000000..b55c5df456
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug374.go
@@ -0,0 +1,20 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 1556
+package foo
+
+type I interface {
+ m() int
+}
+
+type T int
+
+var _ I = T(0) // GCCGO_ERROR "incompatible"
+
+func (T) m(buf []byte) (a int, b xxxx) { // ERROR "xxxx"
+ return 0, nil
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug375.go b/gcc/testsuite/go.test/test/fixedbugs/bug375.go
new file mode 100644
index 0000000000..5273585263
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug375.go
@@ -0,0 +1,19 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug375
+
+// 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.
+
+// Issue 2423
+
+package main
+
+func main() {
+ var x interface{} = "hello"
+
+ switch x {
+ case "hello":
+ default:
+ println("FAIL")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug376.go b/gcc/testsuite/go.test/test/fixedbugs/bug376.go
new file mode 100644
index 0000000000..1efbeecf21
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug376.go
@@ -0,0 +1,11 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// issue 1951
+package foo
+import "unsafe"
+var v = unsafe.Sizeof // ERROR "must be called"
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug377.dir/one.go b/gcc/testsuite/go.test/test/fixedbugs/bug377.dir/one.go
new file mode 100644
index 0000000000..c9060756b1
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug377.dir/one.go
@@ -0,0 +1,6 @@
+package one
+
+func Foo() (n int64, _ *int) {
+ return 42, nil
+}
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug377.dir/two.go b/gcc/testsuite/go.test/test/fixedbugs/bug377.dir/two.go
new file mode 100644
index 0000000000..8a5346ab72
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug377.dir/two.go
@@ -0,0 +1,4 @@
+package two
+
+import _ "./one"
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug377.go b/gcc/testsuite/go.test/test/fixedbugs/bug377.go
new file mode 100644
index 0000000000..e905e34d68
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug377.go
@@ -0,0 +1,9 @@
+// $G $D/$F.dir/one.go && $G $D/$F.dir/two.go
+
+// 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.
+
+// Issue 1802
+
+package ignored
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug378.go b/gcc/testsuite/go.test/test/fixedbugs/bug378.go
new file mode 100644
index 0000000000..b393b3dc1e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug378.go
@@ -0,0 +1,19 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug378
+
+// 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.
+
+// Issue 2497
+
+package main
+
+type Header struct{}
+func (h Header) Method() {}
+
+var _ interface{} = Header{}
+
+func main() {
+ type X Header
+ var _ interface{} = X{}
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug379.go b/gcc/testsuite/go.test/test/fixedbugs/bug379.go
new file mode 100644
index 0000000000..3dd3d2983b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug379.go
@@ -0,0 +1,18 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2452.
+
+// Check that the error messages says
+// bug378.go:17: 1 + 2 not used
+// and not
+// bug378.go:17: 1 not used
+
+package main
+
+func main() {
+ 1 + 2 // ERROR "1 \+ 2 not used|value computed is not used"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug380.go b/gcc/testsuite/go.test/test/fixedbugs/bug380.go
new file mode 100644
index 0000000000..75b58064f5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug380.go
@@ -0,0 +1,11 @@
+// $G $D/$F.go
+
+// 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.
+
+// Used to cause a typechecking loop error.
+
+package pkg
+type T map[int]string
+var q = &T{}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug381.go b/gcc/testsuite/go.test/test/fixedbugs/bug381.go
new file mode 100644
index 0000000000..3f3232bf12
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug381.go
@@ -0,0 +1,20 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2276.
+
+// Check that the error messages says
+// bug378.go:19: unsafe.Alignof(0) not used
+// and not
+// bug378.go:19: 4 not used
+
+package main
+
+import "unsafe"
+
+func main() {
+ unsafe.Alignof(0) // ERROR "unsafe\.Alignof|value computed is not used"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug382.dir/pkg.go b/gcc/testsuite/go.test/test/fixedbugs/bug382.dir/pkg.go
new file mode 100644
index 0000000000..f8d75d4541
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug382.dir/pkg.go
@@ -0,0 +1,7 @@
+// 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 pkg
+type T struct {}
+var E T
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug382.go b/gcc/testsuite/go.test/test/fixedbugs/bug382.go
new file mode 100644
index 0000000000..6212fbf507
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug382.go
@@ -0,0 +1,10 @@
+// $G $D/$F.dir/pkg.go && $G $D/$F.go || echo "Bug 382"
+
+// Issue 2529
+
+package main
+import "./pkg"
+
+var x = pkg.E
+
+var fo = struct {F pkg.T}{F: x}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug383.go b/gcc/testsuite/go.test/test/fixedbugs/bug383.go
new file mode 100644
index 0000000000..181a897b63
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug383.go
@@ -0,0 +1,13 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2520
+
+package main
+func main() {
+ if 2e9 { } // ERROR "2e.09|expected bool"
+ if 3.14+1i { } // ERROR "3.14 . 1i|expected bool"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug384.go b/gcc/testsuite/go.test/test/fixedbugs/bug384.go
new file mode 100644
index 0000000000..b3d6466882
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug384.go
@@ -0,0 +1,12 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2500
+
+package foo
+
+// Check that we only get root cause message, no further complaints about r undefined
+func (r *indexWriter) foo() {} // ERROR "undefined.*indexWriter"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug385_32.go b/gcc/testsuite/go.test/test/fixedbugs/bug385_32.go
new file mode 100644
index 0000000000..a009f664e0
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug385_32.go
@@ -0,0 +1,14 @@
+// [ $O == 6 ] || errchk $G -e $D/$F.go
+
+// 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.
+
+// Issue 2444
+
+package main
+func main() {
+ var arr [1000200030]int // ERROR "type .* too large"
+ arr_bkup := arr
+ _ = arr_bkup
+} \ No newline at end of file
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug385_64.go b/gcc/testsuite/go.test/test/fixedbugs/bug385_64.go
new file mode 100644
index 0000000000..701be0d09a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug385_64.go
@@ -0,0 +1,15 @@
+// [ $O != 6 ] || errchk $G -e $D/$F.go
+
+// 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.
+
+// Issue 2444
+
+package main
+func main() { // ERROR "stack frame too large"
+ var arr [1000200030]int
+ arr_bkup := arr
+ _ = arr_bkup
+}
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug386.go b/gcc/testsuite/go.test/test/fixedbugs/bug386.go
new file mode 100644
index 0000000000..b42c07073b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug386.go
@@ -0,0 +1,12 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2451, 2452
+package foo
+
+func f() error { return 0 } // ERROR "cannot use 0 .type int.|has no methods"
+
+func g() error { return -1 } // ERROR "cannot use -1 .type int.|has no methods"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug387.go b/gcc/testsuite/go.test/test/fixedbugs/bug387.go
new file mode 100644
index 0000000000..c9db4aea89
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug387.go
@@ -0,0 +1,30 @@
+// $G $D/$F.go || echo "Bug387"
+
+// 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.
+
+// Issue 2549
+
+/* Used to die with
+missing typecheck: [7f5bf07b4438]
+
+. AS l(45)
+. . NAME-main.autotmp_0017 u(1) a(1) l(45) x(0+0) class(PAUTO)
+esc(N) tc(1) used(1) ARRAY-[2]string
+internal compiler error: missing typecheck
+*/
+package main
+
+import (
+ "fmt"
+ "path/filepath"
+)
+
+func main() {
+ switch _, err := filepath.Glob(filepath.Join(".", "vnc")); {
+ case err != nil:
+ fmt.Println(err)
+ }
+}
+
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug388.go b/gcc/testsuite/go.test/test/fixedbugs/bug388.go
new file mode 100644
index 0000000000..c17fd7ca23
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug388.go
@@ -0,0 +1,39 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2231
+
+package main
+import "runtime"
+
+func foo(runtime.UintType, i int) { // ERROR "cannot declare name runtime.UintType|named/anonymous mix|undefined identifier"
+ println(i, runtime.UintType) // GCCGO_ERROR "undefined identifier"
+}
+
+func bar(i int) {
+ runtime.UintType := i // ERROR "cannot declare name runtime.UintType|non-name on left side|undefined identifier"
+ println(runtime.UintType) // GCCGO_ERROR "invalid use of type|undefined identifier"
+}
+
+func baz() {
+ main.i := 1 // ERROR "non-name main.i|non-name on left side"
+ println(main.i) // GCCGO_ERROR "no fields or methods"
+}
+
+func qux() {
+ var main.i // ERROR "unexpected [.]|expected type"
+ println(main.i)
+}
+
+func corge() {
+ var foo.i int // ERROR "unexpected [.]|expected type"
+ println(foo.i)
+}
+
+func main() {
+ foo(42,43)
+ bar(1969)
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug389.go b/gcc/testsuite/go.test/test/fixedbugs/bug389.go
new file mode 100644
index 0000000000..ecbbbdd585
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug389.go
@@ -0,0 +1,12 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2563
+package foo
+
+func fn(a float32) {}
+
+var f func(arg int) = fn // ERROR "cannot use fn .type func.float32.. as type func.int. in assignment|different parameter types"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug390.go b/gcc/testsuite/go.test/test/fixedbugs/bug390.go
new file mode 100644
index 0000000000..31c4dd40ba
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug390.go
@@ -0,0 +1,16 @@
+// errchk $G -e $D/$F.go
+
+// 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.
+
+// Issue 2627 -- unsafe.Pointer type isn't handled nicely in some errors
+
+package main
+
+import "unsafe"
+
+func main() {
+ var x *int
+ _ = unsafe.Pointer(x) - unsafe.Pointer(x) // ERROR "operator - not defined on unsafe.Pointer|expected integer, floating, or complex type"
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug391.go b/gcc/testsuite/go.test/test/fixedbugs/bug391.go
new file mode 100644
index 0000000000..81507188b2
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug391.go
@@ -0,0 +1,14 @@
+// $G $D/$F.go || echo "Issue2576"
+
+// 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.
+
+// Issue 2576
+package bug
+
+type T struct { a int }
+
+func f(t T) {
+ switch _, _ = t.a, t.a; {}
+} \ No newline at end of file
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug392.dir/one.go b/gcc/testsuite/go.test/test/fixedbugs/bug392.dir/one.go
new file mode 100644
index 0000000000..a7017255e5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug392.dir/one.go
@@ -0,0 +1,22 @@
+// 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.
+
+// Functions that the inliner exported incorrectly.
+
+package one
+
+type T int
+
+// Issue 2678
+func F1(T *T) bool { return T == nil }
+
+// Issue 2682.
+func F2(c chan int) bool { return c == (<-chan int)(nil) }
+
+// Use of single named return value.
+func F3() (ret []int) { return append(ret, 1) }
+
+// Call of inlined method with blank receiver.
+func (_ *T) M() int { return 1 }
+func (t *T) MM() int { return t.M() }
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug392.dir/two.go b/gcc/testsuite/go.test/test/fixedbugs/bug392.dir/two.go
new file mode 100644
index 0000000000..b0ce26d39a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug392.dir/two.go
@@ -0,0 +1,20 @@
+// 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.
+
+// Use the functions in one.go so that the inlined
+// forms get type-checked.
+
+package two
+
+import "./one"
+
+func use() {
+ one.F1(nil)
+ one.F2(nil)
+ one.F3()
+
+ var t *one.T
+ t.M()
+ t.MM()
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug392.go b/gcc/testsuite/go.test/test/fixedbugs/bug392.go
new file mode 100644
index 0000000000..50af6006fb
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug392.go
@@ -0,0 +1,7 @@
+// $G $D/$F.dir/one.go && $G $D/$F.dir/two.go
+
+// 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 ignored
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug393.go b/gcc/testsuite/go.test/test/fixedbugs/bug393.go
new file mode 100644
index 0000000000..e21b9c4a41
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug393.go
@@ -0,0 +1,30 @@
+// $G $D/$F.go || echo BUG: bug393
+
+// 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 2672
+// was trying binary search with an interface type
+
+package main
+
+func f(x interface{}) int {
+ switch x {
+ case 1:
+ return 1
+ case 2:
+ return 2
+ case 3:
+ return 3
+ case 4:
+ return 4
+ case "5":
+ return 5
+ case "6":
+ return 6
+ default:
+ return 7
+ }
+ panic("switch")
+}
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug394.go b/gcc/testsuite/go.test/test/fixedbugs/bug394.go
new file mode 100644
index 0000000000..42c20e7a91
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug394.go
@@ -0,0 +1,10 @@
+// errchk $G $D/$F.go
+
+// 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.
+
+// Issue 2598
+package foo
+
+return nil // ERROR "non-declaration statement outside function body|expected declaration"
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug396.dir/one.go b/gcc/testsuite/go.test/test/fixedbugs/bug396.dir/one.go
new file mode 100644
index 0000000000..7902a07d53
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug396.dir/one.go
@@ -0,0 +1,9 @@
+// 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 one
+
+type T struct { int }
+
+func New(i int) T { return T{i} }
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug396.dir/two.go b/gcc/testsuite/go.test/test/fixedbugs/bug396.dir/two.go
new file mode 100644
index 0000000000..9b32508fd4
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug396.dir/two.go
@@ -0,0 +1,14 @@
+// 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.
+
+// Use the functions in one.go so that the inlined
+// forms get type-checked.
+
+package two
+
+import "./one"
+
+func use() {
+ _ = one.New(1)
+} \ No newline at end of file
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug396.go b/gcc/testsuite/go.test/test/fixedbugs/bug396.go
new file mode 100644
index 0000000000..50af6006fb
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug396.go
@@ -0,0 +1,7 @@
+// $G $D/$F.dir/one.go && $G $D/$F.dir/two.go
+
+// 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 ignored
diff --git a/gcc/testsuite/go.test/test/fixedbugs/bug397.go b/gcc/testsuite/go.test/test/fixedbugs/bug397.go
new file mode 100644
index 0000000000..0395701302
--- /dev/null
+++ b/gcc/testsuite/go.test/test/fixedbugs/bug397.go
@@ -0,0 +1,13 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+// Issue 2623
+var m = map[string]int {
+ "abc":1,
+ 1:2, // ERROR "cannot use 1.*as type string in map key|incompatible type"
+}
diff --git a/gcc/testsuite/go.test/test/float_lit.go b/gcc/testsuite/go.test/test/float_lit.go
index 3ffc5c1e4f..7b91d88e51 100644
--- a/gcc/testsuite/go.test/test/float_lit.go
+++ b/gcc/testsuite/go.test/test/float_lit.go
@@ -6,29 +6,19 @@
package main
-import "os"
-
-var deLim float64
var bad bool
-func
-init() {
- if os.Getenv("GOARCH") == "arm" {
- deLim = 1.0e-8
- } else {
- deLim = 10.e-14
+func pow10(pow int) float64 {
+ if pow < 0 {
+ return 1 / pow10(-pow)
+ }
+ if pow > 0 {
+ return pow10(pow-1) * 10
}
-}
-
-func
-pow10(pow int) float64 {
- if pow < 0 { return 1/pow10(-pow); }
- if pow > 0 { return pow10(pow-1)*10; }
return 1
}
-func
-close(da float64, ia, ib int64, pow int) bool {
+func close(da float64, ia, ib int64, pow int) bool {
db := float64(ia) / float64(ib)
db *= pow10(pow)
@@ -39,12 +29,12 @@ close(da float64, ia, ib int64, pow int) bool {
return false
}
- de := (da-db) /da
+ de := (da - db) / da
if de < 0 {
de = -de
}
- if de < deLim {
+ if de < 1e-14 {
return true
}
if !bad {
@@ -54,65 +44,154 @@ close(da float64, ia, ib int64, pow int) bool {
return false
}
-func
-main() {
- if !close(0., 0, 1, 0) { print("0. is ", 0., "\n"); }
- if !close(+10., 10, 1, 0) { print("+10. is ", +10., "\n"); }
- if !close(-210., -210, 1, 0) { print("-210. is ", -210., "\n"); }
+func main() {
+ if !close(0., 0, 1, 0) {
+ print("0. is ", 0., "\n")
+ }
+ if !close(+10., 10, 1, 0) {
+ print("+10. is ", +10., "\n")
+ }
+ if !close(-210., -210, 1, 0) {
+ print("-210. is ", -210., "\n")
+ }
- if !close(.0, 0, 1, 0) { print(".0 is ", .0, "\n"); }
- if !close(+.01, 1, 100, 0) { print("+.01 is ", +.01, "\n"); }
- if !close(-.012, -12, 1000, 0) { print("-.012 is ", -.012, "\n"); }
+ if !close(.0, 0, 1, 0) {
+ print(".0 is ", .0, "\n")
+ }
+ if !close(+.01, 1, 100, 0) {
+ print("+.01 is ", +.01, "\n")
+ }
+ if !close(-.012, -12, 1000, 0) {
+ print("-.012 is ", -.012, "\n")
+ }
- if !close(0.0, 0, 1, 0) { print("0.0 is ", 0.0, "\n"); }
- if !close(+10.01, 1001, 100, 0) { print("+10.01 is ", +10.01, "\n"); }
- if !close(-210.012, -210012, 1000, 0) { print("-210.012 is ", -210.012, "\n"); }
+ if !close(0.0, 0, 1, 0) {
+ print("0.0 is ", 0.0, "\n")
+ }
+ if !close(+10.01, 1001, 100, 0) {
+ print("+10.01 is ", +10.01, "\n")
+ }
+ if !close(-210.012, -210012, 1000, 0) {
+ print("-210.012 is ", -210.012, "\n")
+ }
- if !close(0E+1, 0, 1, 0) { print("0E+1 is ", 0E+1, "\n"); }
- if !close(+10e2, 10, 1, 2) { print("+10e2 is ", +10e2, "\n"); }
- if !close(-210e3, -210, 1, 3) { print("-210e3 is ", -210e3, "\n"); }
+ if !close(0E+1, 0, 1, 0) {
+ print("0E+1 is ", 0E+1, "\n")
+ }
+ if !close(+10e2, 10, 1, 2) {
+ print("+10e2 is ", +10e2, "\n")
+ }
+ if !close(-210e3, -210, 1, 3) {
+ print("-210e3 is ", -210e3, "\n")
+ }
- if !close(0E-1, 0, 1, 0) { print("0E-1 is ", 0E-1, "\n"); }
- if !close(+0e23, 0, 1, 1) { print("+0e23 is ", +0e23, "\n"); }
- if !close(-0e345, 0, 1, 1) { print("-0e345 is ", -0e345, "\n"); }
+ if !close(0E-1, 0, 1, 0) {
+ print("0E-1 is ", 0E-1, "\n")
+ }
+ if !close(+0e23, 0, 1, 1) {
+ print("+0e23 is ", +0e23, "\n")
+ }
+ if !close(-0e345, 0, 1, 1) {
+ print("-0e345 is ", -0e345, "\n")
+ }
- if !close(0E1, 0, 1, 1) { print("0E1 is ", 0E1, "\n"); }
- if !close(+10e23, 10, 1, 23) { print("+10e23 is ", +10e23, "\n"); }
- if !close(-210e34, -210, 1, 34) { print("-210e34 is ", -210e34, "\n"); }
+ if !close(0E1, 0, 1, 1) {
+ print("0E1 is ", 0E1, "\n")
+ }
+ if !close(+10e23, 10, 1, 23) {
+ print("+10e23 is ", +10e23, "\n")
+ }
+ if !close(-210e34, -210, 1, 34) {
+ print("-210e34 is ", -210e34, "\n")
+ }
- if !close(0.E1, 0, 1, 1) { print("0.E1 is ", 0.E1, "\n"); }
- if !close(+10.e+2, 10, 1, 2) { print("+10.e+2 is ", +10.e+2, "\n"); }
- if !close(-210.e-3, -210, 1, -3) { print("-210.e-3 is ", -210.e-3, "\n"); }
+ if !close(0.E1, 0, 1, 1) {
+ print("0.E1 is ", 0.E1, "\n")
+ }
+ if !close(+10.e+2, 10, 1, 2) {
+ print("+10.e+2 is ", +10.e+2, "\n")
+ }
+ if !close(-210.e-3, -210, 1, -3) {
+ print("-210.e-3 is ", -210.e-3, "\n")
+ }
- if !close(.0E1, 0, 1, 1) { print(".0E1 is ", .0E1, "\n"); }
- if !close(+.01e2, 1, 100, 2) { print("+.01e2 is ", +.01e2, "\n"); }
- if !close(-.012e3, -12, 1000, 3) { print("-.012e3 is ", -.012e3, "\n"); }
+ if !close(.0E1, 0, 1, 1) {
+ print(".0E1 is ", .0E1, "\n")
+ }
+ if !close(+.01e2, 1, 100, 2) {
+ print("+.01e2 is ", +.01e2, "\n")
+ }
+ if !close(-.012e3, -12, 1000, 3) {
+ print("-.012e3 is ", -.012e3, "\n")
+ }
- if !close(0.0E1, 0, 1, 0) { print("0.0E1 is ", 0.0E1, "\n"); }
- if !close(+10.01e2, 1001, 100, 2) { print("+10.01e2 is ", +10.01e2, "\n"); }
- if !close(-210.012e3, -210012, 1000, 3) { print("-210.012e3 is ", -210.012e3, "\n"); }
+ if !close(0.0E1, 0, 1, 0) {
+ print("0.0E1 is ", 0.0E1, "\n")
+ }
+ if !close(+10.01e2, 1001, 100, 2) {
+ print("+10.01e2 is ", +10.01e2, "\n")
+ }
+ if !close(-210.012e3, -210012, 1000, 3) {
+ print("-210.012e3 is ", -210.012e3, "\n")
+ }
- if !close(0.E+12, 0, 1, 0) { print("0.E+12 is ", 0.E+12, "\n"); }
- if !close(+10.e23, 10, 1, 23) { print("+10.e23 is ", +10.e23, "\n"); }
- if !close(-210.e33, -210, 1, 33) { print("-210.e33 is ", -210.e33, "\n"); }
+ if !close(0.E+12, 0, 1, 0) {
+ print("0.E+12 is ", 0.E+12, "\n")
+ }
+ if !close(+10.e23, 10, 1, 23) {
+ print("+10.e23 is ", +10.e23, "\n")
+ }
+ if !close(-210.e33, -210, 1, 33) {
+ print("-210.e33 is ", -210.e33, "\n")
+ }
- if !close(.0E-12, 0, 1, 0) { print(".0E-12 is ", .0E-12, "\n"); }
- if !close(+.01e23, 1, 100, 23) { print("+.01e23 is ", +.01e23, "\n"); }
- if !close(-.012e34, -12, 1000, 34) { print("-.012e34 is ", -.012e34, "\n"); }
+ if !close(.0E-12, 0, 1, 0) {
+ print(".0E-12 is ", .0E-12, "\n")
+ }
+ if !close(+.01e23, 1, 100, 23) {
+ print("+.01e23 is ", +.01e23, "\n")
+ }
+ if !close(-.012e34, -12, 1000, 34) {
+ print("-.012e34 is ", -.012e34, "\n")
+ }
- if !close(0.0E12, 0, 1, 12) { print("0.0E12 is ", 0.0E12, "\n"); }
- if !close(+10.01e23, 1001, 100, 23) { print("+10.01e23 is ", +10.01e23, "\n"); }
- if !close(-210.012e33, -210012, 1000, 33) { print("-210.012e33 is ", -210.012e33, "\n"); }
+ if !close(0.0E12, 0, 1, 12) {
+ print("0.0E12 is ", 0.0E12, "\n")
+ }
+ if !close(+10.01e23, 1001, 100, 23) {
+ print("+10.01e23 is ", +10.01e23, "\n")
+ }
+ if !close(-210.012e33, -210012, 1000, 33) {
+ print("-210.012e33 is ", -210.012e33, "\n")
+ }
- if !close(0.E123, 0, 1, 123) { print("0.E123 is ", 0.E123, "\n"); }
- if !close(+10.e+23, 10, 1, 23) { print("+10.e+234 is ", +10.e+234, "\n"); }
- if !close(-210.e-35, -210, 1, -35) { print("-210.e-35 is ", -210.e-35, "\n"); }
+ if !close(0.E123, 0, 1, 123) {
+ print("0.E123 is ", 0.E123, "\n")
+ }
+ if !close(+10.e+23, 10, 1, 23) {
+ print("+10.e+234 is ", +10.e+234, "\n")
+ }
+ if !close(-210.e-35, -210, 1, -35) {
+ print("-210.e-35 is ", -210.e-35, "\n")
+ }
- if !close(.0E123, 0, 1, 123) { print(".0E123 is ", .0E123, "\n"); }
- if !close(+.01e29, 1, 100, 29) { print("+.01e29 is ", +.01e29, "\n"); }
- if !close(-.012e29, -12, 1000, 29) { print("-.012e29 is ", -.012e29, "\n"); }
+ if !close(.0E123, 0, 1, 123) {
+ print(".0E123 is ", .0E123, "\n")
+ }
+ if !close(+.01e29, 1, 100, 29) {
+ print("+.01e29 is ", +.01e29, "\n")
+ }
+ if !close(-.012e29, -12, 1000, 29) {
+ print("-.012e29 is ", -.012e29, "\n")
+ }
- if !close(0.0E123, 0, 1, 123) { print("0.0E123 is ", 0.0E123, "\n"); }
- if !close(+10.01e31, 1001, 100, 31) { print("+10.01e31 is ", +10.01e31, "\n"); }
- if !close(-210.012e19, -210012, 1000, 19) { print("-210.012e19 is ", -210.012e19, "\n"); }
+ if !close(0.0E123, 0, 1, 123) {
+ print("0.0E123 is ", 0.0E123, "\n")
+ }
+ if !close(+10.01e31, 1001, 100, 31) {
+ print("+10.01e31 is ", +10.01e31, "\n")
+ }
+ if !close(-210.012e19, -210012, 1000, 19) {
+ print("-210.012e19 is ", -210.012e19, "\n")
+ }
}
diff --git a/gcc/testsuite/go.test/test/func2.go b/gcc/testsuite/go.test/test/func2.go
index 5a6d7d0e10..87e78194ef 100644
--- a/gcc/testsuite/go.test/test/func2.go
+++ b/gcc/testsuite/go.test/test/func2.go
@@ -5,7 +5,6 @@
// license that can be found in the LICENSE file.
package main
-import os "os"
type t1 int
type t2 int
@@ -23,7 +22,7 @@ func f8(os int) int
func f9(os int) int {
return os
}
-func f10(err os.Error) os.Error {
+func f10(err error) error {
return err
}
func f11(t1 string) string {
diff --git a/gcc/testsuite/go.test/test/func4.go b/gcc/testsuite/go.test/test/func4.go
index 69ce56a197..2a1a932de9 100644
--- a/gcc/testsuite/go.test/test/func4.go
+++ b/gcc/testsuite/go.test/test/func4.go
@@ -11,4 +11,5 @@ var notmain func()
func main() {
var x = &main // ERROR "address of|invalid"
main = notmain // ERROR "assign to|invalid"
+ _ = x
}
diff --git a/gcc/testsuite/go.test/test/func6.go b/gcc/testsuite/go.test/test/func6.go
new file mode 100644
index 0000000000..1356b6aa8b
--- /dev/null
+++ b/gcc/testsuite/go.test/test/func6.go
@@ -0,0 +1,14 @@
+// $G $D/$F.go
+
+// 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 main
+
+func main() {
+ if func() bool { return true }() {} // 6g used to say this was a syntax error
+ if (func() bool { return true })() {}
+ if (func() bool { return true }()) {}
+}
+
diff --git a/gcc/testsuite/go.test/test/func7.go b/gcc/testsuite/go.test/test/func7.go
new file mode 100644
index 0000000000..e38b008cc0
--- /dev/null
+++ b/gcc/testsuite/go.test/test/func7.go
@@ -0,0 +1,29 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+var calledf = false
+
+func f() int {
+ calledf = true
+ return 1
+}
+
+func g() int {
+ if !calledf {
+ println("BUG: func7 - called g before f")
+ }
+ return 0
+}
+
+func main() {
+ // 6g, 8g, 5g all used to evaluate g() before f().
+ if f() < g() {
+ panic("wrong answer")
+ }
+}
+
diff --git a/gcc/testsuite/go.test/test/gc2.go b/gcc/testsuite/go.test/test/gc2.go
new file mode 100644
index 0000000000..772f9810da
--- /dev/null
+++ b/gcc/testsuite/go.test/test/gc2.go
@@ -0,0 +1,44 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Check that buffered channels are garbage collected properly.
+// An interesting case because they have finalizers and used to
+// have self loops that kept them from being collected.
+// (Cyclic data with finalizers is never finalized, nor collected.)
+
+package main
+
+import (
+ "fmt"
+ "os"
+ "runtime"
+)
+
+func main() {
+ const N = 10000
+ st := new(runtime.MemStats)
+ memstats := new(runtime.MemStats)
+ runtime.ReadMemStats(st)
+ for i := 0; i < N; i++ {
+ c := make(chan int, 10)
+ _ = c
+ if i%100 == 0 {
+ for j := 0; j < 4; j++ {
+ runtime.GC()
+ runtime.Gosched()
+ runtime.GC()
+ runtime.Gosched()
+ }
+ }
+ }
+
+ runtime.ReadMemStats(memstats)
+ obj := memstats.HeapObjects - st.HeapObjects
+ if obj > N/5 {
+ fmt.Println("too many objects left:", obj)
+ os.Exit(1)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/golden-arm.out b/gcc/testsuite/go.test/test/golden-arm.out
deleted file mode 100644
index 41829fb036..0000000000
--- a/gcc/testsuite/go.test/test/golden-arm.out
+++ /dev/null
@@ -1,131 +0,0 @@
-
-=========== ./cmp2.go
-panic: runtime error: comparing uncomparable type []int
-
-panic PC=xxx
-
-=========== ./cmp3.go
-panic: runtime error: comparing uncomparable type []int
-
-panic PC=xxx
-
-=========== ./cmp4.go
-panic: runtime error: hash of unhashable type []int
-
-panic PC=xxx
-
-=========== ./cmp5.go
-panic: runtime error: hash of unhashable type []int
-
-panic PC=xxx
-
-=========== ./deferprint.go
-printing: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
-42 true false true +1.500000e+000 world 0x0 [0/0]0x0 0x0 0x0 255
-
-=========== ./helloworld.go
-hello, world
-
-=========== ./peano.go
-0! = 1
-1! = 1
-2! = 2
-3! = 6
-4! = 24
-5! = 120
-6! = 720
-7! = 5040
-8! = 40320
-9! = 362880
-
-=========== ./printbig.go
--9223372036854775808
-9223372036854775807
-
-=========== ./sigchld.go
-survived SIGCHLD
-
-=========== ./sinit.go
-FAIL
-
-=========== ./turing.go
-Hello World!
-
-=========== ken/intervar.go
- print 1 bio 2 file 3 -- abc
-
-=========== ken/label.go
-100
-
-=========== ken/rob1.go
-9876543210
-
-=========== ken/rob2.go
-(defn foo (add 12 34))
-
-=========== ken/simpprint.go
-hello world
-
-=========== ken/simpswitch.go
-0out01out12out2aout34out4fiveout56out6aout78out89out9
-
-=========== ken/string.go
-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz
-
-=========== chan/doubleselect.go
-PASS
-
-=========== chan/nonblock.go
-PASS
-
-=========== interface/fail.go
-panic: interface conversion: *main.S is not main.I: missing method Foo
-
-panic PC=xxx
-
-=========== interface/returntype.go
-panic: interface conversion: *main.S is not main.I2: missing method Name
-
-panic PC=xxx
-
-=========== fixedbugs/bug016.go
-fixedbugs/bug016.go:11: constant -3 overflows uint
-
-=========== fixedbugs/bug027.go
-hi
-0 44444
-1 3333
-2 222
-3 11
-4 0
-0 44444
-1 3333
-2 222
-3 11
-4 0
-
-=========== fixedbugs/bug067.go
-ok
-
-=========== fixedbugs/bug070.go
-outer loop top k 0
-inner loop top i 0
-do break
-broke
-
-=========== fixedbugs/bug081.go
-fixedbugs/bug081.go:9: typechecking loop
-
-=========== fixedbugs/bug093.go
-M
-
-=========== fixedbugs/bug113.go
-panic: interface conversion: interface is int, not int32
-
-panic PC=xxx
-
-=========== fixedbugs/bug148.go
-2 3
-panic: interface conversion: interface is main.T, not main.T
-
-panic PC=xxx
diff --git a/gcc/testsuite/go.test/test/golden.out b/gcc/testsuite/go.test/test/golden.out
index 49bca4b874..e0b4cf6e2a 100644
--- a/gcc/testsuite/go.test/test/golden.out
+++ b/gcc/testsuite/go.test/test/golden.out
@@ -1,179 +1,19 @@
== ./
-=========== ./cmp2.go
-panic: runtime error: comparing uncomparable type []int
-
-panic PC=xxx
-
-=========== ./cmp3.go
-panic: runtime error: comparing uncomparable type []int
-
-panic PC=xxx
-
-=========== ./cmp4.go
-panic: runtime error: hash of unhashable type []int
-
-panic PC=xxx
-
-=========== ./cmp5.go
-panic: runtime error: hash of unhashable type []int
-
-panic PC=xxx
-
-=========== ./deferprint.go
-printing: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
-42 true false true +1.500000e+000 world 0x0 [0/0]0x0 0x0 0x0 255
-
-=========== ./helloworld.go
-hello, world
-
-=========== ./peano.go
-0! = 1
-1! = 1
-2! = 2
-3! = 6
-4! = 24
-5! = 120
-6! = 720
-7! = 5040
-8! = 40320
-9! = 362880
-
-=========== ./printbig.go
--9223372036854775808
-9223372036854775807
-
-=========== ./sigchld.go
-survived SIGCHLD
-
-=========== ./sinit.go
-FAIL
-
-=========== ./turing.go
-Hello World!
-
== ken/
-=========== ken/cplx0.go
-(+5.000000e+000+6.000000e+000i)
-(+5.000000e+000+6.000000e+000i)
-(+5.000000e+000+6.000000e+000i)
-(+5.000000e+000+6.000000e+000i)
-
-=========== ken/cplx3.go
-(+1.292308e+000-1.384615e-001i)
-(+1.292308e+000-1.384615e-001i)
-64
-
-=========== ken/cplx4.go
-c = (-5.000000-6.000000i)
-c = (5.000000+6.000000i)
-c = (5.000000+6.000000i)
-c = (5.000000+6.000000i)
-c = (5+6i)
-c = (13+7i)
-
-=========== ken/cplx5.go
-(+5.000000e+000-5.000000e+000i)
-(+5.000000e+000-5.000000e+000i)
-(+5.000000e+000-5.000000e+000i)
-(+5.000000e+000-5.000000e+000i)
-(+5.000000e+000-5.000000e+000i)
-(+5.000000e+000-5.000000e+000i)
-(+5.000000e+000-5.000000e+000i)
-
-=========== ken/intervar.go
- print 1 bio 2 file 3 -- abc
-
-=========== ken/label.go
-100
-
-=========== ken/rob1.go
-9876543210
-
-=========== ken/rob2.go
-(defn foo (add 12 34))
-
-=========== ken/simpprint.go
-hello world
-
-=========== ken/simpswitch.go
-0out01out12out2aout34out4fiveout56out6aout78out89out9
-
-=========== ken/string.go
-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz
-
== chan/
-=========== chan/doubleselect.go
-PASS
-
-=========== chan/nonblock.go
-PASS
-
== interface/
-=========== interface/fail.go
-panic: interface conversion: *main.S is not main.I: missing method Foo
-
-panic PC=xxx
-
-=========== interface/returntype.go
-panic: interface conversion: *main.S is not main.I2: missing method Name
-
-panic PC=xxx
-
-== nilptr/
-
== syntax/
-== fixedbugs/
-
-=========== fixedbugs/bug016.go
-fixedbugs/bug016.go:11: constant -3 overflows uint
-
-=========== fixedbugs/bug027.go
-hi
-0 44444
-1 3333
-2 222
-3 11
-4 0
-0 44444
-1 3333
-2 222
-3 11
-4 0
-
-=========== fixedbugs/bug067.go
-ok
-
-=========== fixedbugs/bug070.go
-outer loop top k 0
-inner loop top i 0
-do break
-broke
-
-=========== fixedbugs/bug081.go
-fixedbugs/bug081.go:9: typechecking loop
+== dwarf/
-=========== fixedbugs/bug093.go
-M
-
-=========== fixedbugs/bug113.go
-panic: interface conversion: interface is int, not int32
-
-panic PC=xxx
-
-=========== fixedbugs/bug148.go
-2 3
-panic: interface conversion: interface is main.T, not main.T
-
-panic PC=xxx
+== fixedbugs/
== bugs/
-=========== bugs/bug260.go
-FAIL
-BUG: bug260 failed
+=========== bugs/bug395.go
+bug395 is broken
diff --git a/gcc/testsuite/go.test/test/goprint.go b/gcc/testsuite/go.test/test/goprint.go
new file mode 100644
index 0000000000..53ed055a07
--- /dev/null
+++ b/gcc/testsuite/go.test/test/goprint.go
@@ -0,0 +1,14 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
+
+// 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 main
+
+import "time"
+
+func main() {
+ go println(42, true, false, true, 1.5, "world", (chan int)(nil), []int(nil), (map[string]int)(nil), (func())(nil), byte(255))
+ time.Sleep(1e6)
+}
diff --git a/gcc/testsuite/go.test/test/goprint.out b/gcc/testsuite/go.test/test/goprint.out
new file mode 100644
index 0000000000..da3919ed64
--- /dev/null
+++ b/gcc/testsuite/go.test/test/goprint.out
@@ -0,0 +1 @@
+42 true false true +1.500000e+000 world 0x0 [0/0]0x0 0x0 0x0 255
diff --git a/gcc/testsuite/go.test/test/goto.go b/gcc/testsuite/go.test/test/goto.go
new file mode 100644
index 0000000000..1fccb314c8
--- /dev/null
+++ b/gcc/testsuite/go.test/test/goto.go
@@ -0,0 +1,535 @@
+// errchk $G -e $D/$F.go
+
+// 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.
+
+// Each test is in a separate function just so that if the
+// compiler stops processing after one error, we don't
+// lose other ones.
+
+package main
+
+var (
+ i, n int
+ x []int
+ c chan int
+ m map[int]int
+ s string
+)
+
+// goto after declaration okay
+func _() {
+ x := 1
+ goto L
+L:
+ _ = x
+}
+
+// goto before declaration okay
+func _() {
+ goto L
+L:
+ x := 1
+ _ = x
+}
+
+// goto across declaration not okay
+func _() {
+ goto L // ERROR "goto L jumps over declaration of x at LINE+1|goto jumps over declaration"
+ x := 1 // GCCGO_ERROR "defined here"
+ _ = x
+L:
+}
+
+// goto across declaration in inner scope okay
+func _() {
+ goto L
+ {
+ x := 1
+ _ = x
+ }
+L:
+}
+
+// goto across declaration after inner scope not okay
+func _() {
+ goto L // ERROR "goto L jumps over declaration of x at LINE+5|goto jumps over declaration"
+ {
+ x := 1
+ _ = x
+ }
+ x := 1 // GCCGO_ERROR "defined here"
+ _ = x
+L:
+}
+
+// goto across declaration in reverse okay
+func _() {
+L:
+ x := 1
+ _ = x
+ goto L
+}
+
+// error shows first offending variable
+func _() {
+ goto L // ERROR "goto L jumps over declaration of x at LINE+1|goto jumps over declaration"
+ x := 1 // GCCGO_ERROR "defined here"
+ _ = x
+ y := 1
+ _ = y
+L:
+}
+
+// goto not okay even if code path is dead
+func _() {
+ goto L // ERROR "goto L jumps over declaration of x at LINE+1|goto jumps over declaration"
+ x := 1 // GCCGO_ERROR "defined here"
+ _ = x
+ y := 1
+ _ = y
+ return
+L:
+}
+
+// goto into outer block okay
+func _() {
+ {
+ goto L
+ }
+L:
+}
+
+// goto backward into outer block okay
+func _() {
+L:
+ {
+ goto L
+ }
+}
+
+// goto into inner block not okay
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ { // GCCGO_ERROR "block starts here"
+ L:
+ }
+}
+
+// goto backward into inner block still not okay
+func _() {
+ { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+// error shows first (outermost) offending block
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ {
+ {
+ { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ }
+ }
+}
+
+// error prefers block diagnostic over declaration diagnostic
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+3|goto jumps into block"
+ x := 1
+ _ = x
+ { // GCCGO_ERROR "block starts here"
+ L:
+ }
+}
+
+// many kinds of blocks, all invalid to jump into or among,
+// but valid to jump out of
+
+// if
+
+func _() {
+L:
+ if true {
+ goto L
+ }
+}
+
+func _() {
+L:
+ if true {
+ goto L
+ } else {
+ }
+}
+
+func _() {
+L:
+ if false {
+ } else {
+ goto L
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ if true { // GCCGO_ERROR "block starts here"
+ L:
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ if true { // GCCGO_ERROR "block starts here"
+ L:
+ } else {
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ if true {
+ } else { // GCCGO_ERROR "block starts here"
+ L:
+ }
+}
+
+func _() {
+ if false { // GCCGO_ERROR "block starts here"
+ L:
+ } else {
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+ }
+}
+
+func _() {
+ if true {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ } else { // GCCGO_ERROR "block starts here"
+ L:
+ }
+}
+
+func _() {
+ if true {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ } else if false { // GCCGO_ERROR "block starts here"
+ L:
+ }
+}
+
+func _() {
+ if true {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ } else if false { // GCCGO_ERROR "block starts here"
+ L:
+ } else {
+ }
+}
+
+func _() {
+ // This one is tricky. There is an implicit scope
+ // starting at the second if statement, and it contains
+ // the final else, so the outermost offending scope
+ // really is LINE+1 (like in the previous test),
+ // even though it looks like it might be LINE+3 instead.
+ if true {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ } else if false {
+ } else { // GCCGO_ERROR "block starts here"
+ L:
+ }
+}
+
+/* Want to enable these tests but gofmt mangles them. Issue 1972.
+
+func _() {
+ // This one is okay, because the else is in the
+ // implicit whole-if block and has no inner block
+ // (no { }) around it.
+ if true {
+ goto L
+ } else
+ L:
+}
+
+func _() {
+ // Still not okay.
+ if true { //// GCCGO_ERROR "block starts here"
+ L:
+ } else
+ goto L //// ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+*/
+
+// for
+
+func _() {
+ for {
+ goto L
+ }
+L:
+}
+
+func _() {
+ for {
+ goto L
+ L:
+ }
+}
+
+func _() {
+ for { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+func _() {
+ for { // GCCGO_ERROR "block starts here"
+ goto L
+ L1:
+ }
+L:
+ goto L1 // ERROR "goto L1 jumps into block starting at LINE-5|goto jumps into block"
+}
+
+func _() {
+ for i < n { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+func _() {
+ for i = 0; i < n; i++ { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+func _() {
+ for i = range x { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+func _() {
+ for i = range c { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+func _() {
+ for i = range m { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+func _() {
+ for i = range s { // GCCGO_ERROR "block starts here"
+ L:
+ }
+ goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
+}
+
+// switch
+
+func _() {
+L:
+ switch i {
+ case 0:
+ goto L
+ }
+}
+
+func _() {
+L:
+ switch i {
+ case 0:
+
+ default:
+ goto L
+ }
+}
+
+func _() {
+ switch i {
+ case 0:
+
+ default:
+ L:
+ goto L
+ }
+}
+
+func _() {
+ switch i {
+ case 0:
+
+ default:
+ goto L
+ L:
+ }
+}
+
+func _() {
+ switch i {
+ case 0:
+ goto L
+ L:
+ ;
+ default:
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ switch i {
+ case 0:
+ L: // GCCGO_ERROR "block starts here"
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ switch i {
+ case 0:
+ L: // GCCGO_ERROR "block starts here"
+ ;
+ default:
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ switch i {
+ case 0:
+ default:
+ L: // GCCGO_ERROR "block starts here"
+ }
+}
+
+func _() {
+ switch i {
+ default:
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ case 0:
+ L: // GCCGO_ERROR "block starts here"
+ }
+}
+
+func _() {
+ switch i {
+ case 0:
+ L: // GCCGO_ERROR "block starts here"
+ ;
+ default:
+ goto L // ERROR "goto L jumps into block starting at LINE-4|goto jumps into block"
+ }
+}
+
+// select
+// different from switch. the statement has no implicit block around it.
+
+func _() {
+L:
+ select {
+ case <-c:
+ goto L
+ }
+}
+
+func _() {
+L:
+ select {
+ case c <- 1:
+
+ default:
+ goto L
+ }
+}
+
+func _() {
+ select {
+ case <-c:
+
+ default:
+ L:
+ goto L
+ }
+}
+
+func _() {
+ select {
+ case c <- 1:
+
+ default:
+ goto L
+ L:
+ }
+}
+
+func _() {
+ select {
+ case <-c:
+ goto L
+ L:
+ ;
+ default:
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+2|goto jumps into block"
+ select {
+ case c <- 1:
+ L: // GCCGO_ERROR "block starts here"
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+2|goto jumps into block"
+ select {
+ case c <- 1:
+ L: // GCCGO_ERROR "block starts here"
+ ;
+ default:
+ }
+}
+
+func _() {
+ goto L // ERROR "goto L jumps into block starting at LINE+3|goto jumps into block"
+ select {
+ case <-c:
+ default:
+ L: // GCCGO_ERROR "block starts here"
+ }
+}
+
+func _() {
+ select {
+ default:
+ goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
+ case <-c:
+ L: // GCCGO_ERROR "block starts here"
+ }
+}
+
+func _() {
+ select {
+ case <-c:
+ L: // GCCGO_ERROR "block starts here"
+ ;
+ default:
+ goto L // ERROR "goto L jumps into block starting at LINE-4|goto jumps into block"
+ }
+}
diff --git a/gcc/testsuite/go.test/test/hashmap.go b/gcc/testsuite/go.test/test/hashmap.go
index 096ece0a53..0a4d7ab61e 100755
--- a/gcc/testsuite/go.test/test/hashmap.go
+++ b/gcc/testsuite/go.test/test/hashmap.go
@@ -21,7 +21,7 @@ func ASSERT(p bool) {
type KeyType interface {
Hash() uint32
- Match(other *KeyType) bool
+ Match(other KeyType) bool
}
@@ -31,8 +31,8 @@ type ValueType interface {
type Entry struct {
- key *KeyType
- value *ValueType
+ key KeyType
+ value ValueType
}
@@ -68,7 +68,7 @@ func (m *HashMap) Initialize (initial_log2_capacity uint32) {
}
-func (m *HashMap) Probe (key *KeyType) *Entry {
+func (m *HashMap) Probe (key KeyType) *Entry {
ASSERT(key != nil)
var i uint32 = key.Hash() % m.capacity()
@@ -86,7 +86,7 @@ func (m *HashMap) Probe (key *KeyType) *Entry {
}
-func (m *HashMap) Lookup (key *KeyType, insert bool) *Entry {
+func (m *HashMap) Lookup (key KeyType, insert bool) *Entry {
// Find a matching entry.
var p *Entry = m.Probe(key)
if p.key != nil {
@@ -145,7 +145,7 @@ func (n *Number) Hash() uint32 {
}
-func (n *Number) Match(other *KeyType) bool {
+func (n *Number) Match(other KeyType) bool {
// var y *Number = other
// return n.x == y.x
return false
diff --git a/gcc/testsuite/go.test/test/helloworld.go b/gcc/testsuite/go.test/test/helloworld.go
index e55a74bbd3..16c95f0068 100644
--- a/gcc/testsuite/go.test/test/helloworld.go
+++ b/gcc/testsuite/go.test/test/helloworld.go
@@ -1,4 +1,4 @@
-// $G $F.go && $L $F.$A && ./$A.out
+// $G $F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
diff --git a/gcc/testsuite/go.test/test/helloworld.out b/gcc/testsuite/go.test/test/helloworld.out
new file mode 100644
index 0000000000..4b5fa63702
--- /dev/null
+++ b/gcc/testsuite/go.test/test/helloworld.out
@@ -0,0 +1 @@
+hello, world
diff --git a/gcc/testsuite/go.test/test/if.go b/gcc/testsuite/go.test/test/if.go
index db1fe8b790..18a6715d7e 100644
--- a/gcc/testsuite/go.test/test/if.go
+++ b/gcc/testsuite/go.test/test/if.go
@@ -45,18 +45,6 @@ func main() {
assertequal(count, 0, "if false one")
count = 0
- if {
- count = count + 1
- }
- assertequal(count, 1, "if empty")
-
- count = 0
- if one := 1; true {
- count = count + one
- }
- assertequal(count, 1, "if empty one")
-
- count = 0
if i5 < i7 {
count = count + 1
}
@@ -65,25 +53,28 @@ func main() {
count = 0
if true {
count = count + 1
- } else
+ } else {
count = count - 1
+ }
assertequal(count, 1, "if else true")
count = 0
if false {
count = count + 1
- } else
+ } else {
count = count - 1
+ }
assertequal(count, -1, "if else false")
count = 0
- if t:=1; false {
+ if t := 1; false {
count = count + 1
_ = t
t := 7
_ = t
- } else
+ } else {
count = count - t
+ }
assertequal(count, -1, "if else false var")
count = 0
@@ -92,8 +83,9 @@ func main() {
count = count + 1
t := 7
_ = t
- } else
+ } else {
count = count - t
+ }
_ = t
assertequal(count, -1, "if else false var outside")
}
diff --git a/gcc/testsuite/go.test/test/if1.go b/gcc/testsuite/go.test/test/if1.go
deleted file mode 100644
index 061c36411e..0000000000
--- a/gcc/testsuite/go.test/test/if1.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// $G $F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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 "os"
-
-func main() {
- count := 7
- if one := 1; {
- count = count + one
- }
- if count != 8 {
- print(count, " should be 8\n")
- os.Exit(1)
- }
-}
diff --git a/gcc/testsuite/go.test/test/import.go b/gcc/testsuite/go.test/test/import.go
index 96330340df..bd83dc3bdd 100644
--- a/gcc/testsuite/go.test/test/import.go
+++ b/gcc/testsuite/go.test/test/import.go
@@ -13,13 +13,12 @@ import _os_ "os"
import "os"
import . "os"
-func f(e os.Error)
+func f(e *os.File)
func main() {
- var _e_ _os_.Error
- var dot Error
+ var _e_ *_os_.File
+ var dot *File
f(_e_)
f(dot)
}
-
diff --git a/gcc/testsuite/go.test/test/import1.go b/gcc/testsuite/go.test/test/import1.go
index 8bb2a94a24..ebd704ef99 100644
--- a/gcc/testsuite/go.test/test/import1.go
+++ b/gcc/testsuite/go.test/test/import1.go
@@ -9,9 +9,9 @@
package main
import "bufio" // GCCGO_ERROR "previous|not used"
-import bufio "os" // ERROR "redeclared|redefinition|incompatible"
+import bufio "os" // ERROR "redeclared|redefinition|incompatible" "imported and not used"
import (
"fmt" // GCCGO_ERROR "previous|not used"
- fmt "math" // ERROR "redeclared|redefinition|incompatible"
+ fmt "math" // ERROR "redeclared|redefinition|incompatible" "imported and not used"
)
diff --git a/gcc/testsuite/go.test/test/index.go b/gcc/testsuite/go.test/test/index.go
index a91294cffb..38aa33dd30 100644
--- a/gcc/testsuite/go.test/test/index.go
+++ b/gcc/testsuite/go.test/test/index.go
@@ -1,8 +1,8 @@
// $G $D/$F.go && $L $F.$A &&
-// ./$A.out -pass 0 >tmp.go && $G tmp.go && $L -o tmp1.$A tmp.$A && ./tmp1.$A &&
+// ./$A.out -pass 0 >tmp.go && $G tmp.go && $L -o $A.out1 tmp.$A && ./$A.out1 &&
// ./$A.out -pass 1 >tmp.go && errchk $G -e tmp.go &&
// ./$A.out -pass 2 >tmp.go && errchk $G -e tmp.go
-// rm -f tmp.go
+// rm -f tmp.go $A.out1
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
diff --git a/gcc/testsuite/go.test/test/indirect1.go b/gcc/testsuite/go.test/test/indirect1.go
index 0fd5c19d4d..ecb4f138ac 100644
--- a/gcc/testsuite/go.test/test/indirect1.go
+++ b/gcc/testsuite/go.test/test/indirect1.go
@@ -65,4 +65,5 @@ func f() {
cap(b2)+ // ERROR "illegal|invalid|must be"
cap(b3)+
cap(b4) // ERROR "illegal|invalid|must be"
+ _ = x
}
diff --git a/gcc/testsuite/go.test/test/init.go b/gcc/testsuite/go.test/test/init.go
new file mode 100644
index 0000000000..74c2d5c261
--- /dev/null
+++ b/gcc/testsuite/go.test/test/init.go
@@ -0,0 +1,18 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+import "runtime"
+
+func init() {
+}
+
+func main() {
+ init() // ERROR "undefined.*init"
+ runtime.init() // ERROR "unexported.*runtime\.init"
+ var _ = init // ERROR "undefined.*init"
+}
diff --git a/gcc/testsuite/go.test/test/init1.go b/gcc/testsuite/go.test/test/init1.go
new file mode 100644
index 0000000000..9ce3c12ee6
--- /dev/null
+++ b/gcc/testsuite/go.test/test/init1.go
@@ -0,0 +1,44 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 that goroutines and garbage collection run during init.
+
+package main
+
+import "runtime"
+
+var x []byte
+
+func init() {
+ c := make(chan int)
+ go send(c)
+ <-c
+
+ const chunk = 1<<20
+ runtime.UpdateMemStats()
+ sys := runtime.MemStats.Sys
+ b := make([]byte, chunk)
+ for i := range b {
+ b[i] = byte(i%10 + '0')
+ }
+ s := string(b)
+ for i := 0; i < 1000; i++ {
+ x = []byte(s)
+ }
+ runtime.UpdateMemStats()
+ sys1 := runtime.MemStats.Sys
+ if sys1-sys > chunk*50 {
+ println("allocated 1000 chunks of", chunk, "and used ", sys1-sys, "memory")
+ }
+}
+
+func send(c chan int) {
+ c <- 1
+}
+
+func main() {
+}
+
diff --git a/gcc/testsuite/go.test/test/initializerr.go b/gcc/testsuite/go.test/test/initializerr.go
index 37f8a602db..e7f8b0e92f 100644
--- a/gcc/testsuite/go.test/test/initializerr.go
+++ b/gcc/testsuite/go.test/test/initializerr.go
@@ -17,7 +17,7 @@ type T struct {
var x = 1
var a1 = S { 0, X: 1 } // ERROR "mixture|undefined"
var a2 = S { Y: 3, Z: 2, Y: 3 } // ERROR "duplicate"
-var a3 = T { 1, 2, 3, 4, 5, 6 } // ERROR "convert|too many"
+var a3 = T { S{}, 2, 3, 4, 5, 6 } // ERROR "convert|too many"
var a4 = [5]byte{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } // ERROR "index|too many"
var a5 = []byte { x: 2 } // ERROR "index"
diff --git a/gcc/testsuite/go.test/test/initsyscall.go b/gcc/testsuite/go.test/test/initsyscall.go
index b5e5812b64..d0c26d2a83 100644
--- a/gcc/testsuite/go.test/test/initsyscall.go
+++ b/gcc/testsuite/go.test/test/initsyscall.go
@@ -19,9 +19,8 @@ func f() {
func init() {
go f()
- time.Nanoseconds()
+ time.Now()
}
func main() {
}
-
diff --git a/gcc/testsuite/go.test/test/interface/embed.go b/gcc/testsuite/go.test/test/interface/embed.go
index 4a702398c6..2fddee1905 100644
--- a/gcc/testsuite/go.test/test/interface/embed.go
+++ b/gcc/testsuite/go.test/test/interface/embed.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.
-// Check methods derived from embedded interface and *interface values.
+// Check methods derived from embedded interface values.
package main
@@ -19,18 +19,12 @@ func (t T) M() int64 { return int64(t) }
var t = T(Value)
var pt = &t
var ti Inter = t
-var pti = &ti
type S struct { Inter }
var s = S{ ti }
var ps = &s
-type SP struct { *Inter }
-var sp = SP{ &ti }
-var psp = &sp
-
var i Inter
-var pi = &i
var ok = true
@@ -45,35 +39,20 @@ func main() {
check("t.M()", t.M())
check("pt.M()", pt.M())
check("ti.M()", ti.M())
- check("pti.M()", pti.M())
check("s.M()", s.M())
check("ps.M()", ps.M())
- check("sp.M()", sp.M())
- check("psp.M()", psp.M())
i = t
check("i = t; i.M()", i.M())
- check("i = t; pi.M()", pi.M())
i = pt
check("i = pt; i.M()", i.M())
- check("i = pt; pi.M()", pi.M())
i = s
check("i = s; i.M()", i.M())
- check("i = s; pi.M()", pi.M())
i = ps
check("i = ps; i.M()", i.M())
- check("i = ps; pi.M()", pi.M())
-
- i = sp
- check("i = sp; i.M()", i.M())
- check("i = sp; pi.M()", pi.M())
-
- i = psp
- check("i = psp; i.M()", i.M())
- check("i = psp; pi.M()", pi.M())
if !ok {
println("BUG: interface10")
diff --git a/gcc/testsuite/go.test/test/interface/embed2.go b/gcc/testsuite/go.test/test/interface/embed2.go
new file mode 100644
index 0000000000..c18a1fecec
--- /dev/null
+++ b/gcc/testsuite/go.test/test/interface/embed2.go
@@ -0,0 +1,70 @@
+// errchk $G -e $D/$F.go
+
+// Copyright 2009 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.
+
+// Check methods derived from embedded interface and *interface values.
+
+package main
+
+import "os"
+
+const Value = 1e12
+
+type Inter interface { M() int64 }
+
+type T int64
+func (t T) M() int64 { return int64(t) }
+var t = T(Value)
+var pt = &t
+var ti Inter = t
+var pti = &ti
+
+type S struct { Inter }
+var s = S{ ti }
+var ps = &s
+
+type SP struct { *Inter } // ERROR "interface"
+
+var i Inter
+var pi = &i
+
+var ok = true
+
+func check(s string, v int64) {
+ if v != Value {
+ println(s, v)
+ ok = false
+ }
+}
+
+func main() {
+ check("t.M()", t.M())
+ check("pt.M()", pt.M())
+ check("ti.M()", ti.M())
+ check("pti.M()", pti.M()) // ERROR "method"
+ check("s.M()", s.M())
+ check("ps.M()", ps.M())
+
+ i = t
+ check("i = t; i.M()", i.M())
+ check("i = t; pi.M()", pi.M()) // ERROR "method"
+
+ i = pt
+ check("i = pt; i.M()", i.M())
+ check("i = pt; pi.M()", pi.M()) // ERROR "method"
+
+ i = s
+ check("i = s; i.M()", i.M())
+ check("i = s; pi.M()", pi.M()) // ERROR "method"
+
+ i = ps
+ check("i = ps; i.M()", i.M())
+ check("i = ps; pi.M()", pi.M()) // ERROR "method"
+
+ if !ok {
+ println("BUG: interface10")
+ os.Exit(1)
+ }
+}
diff --git a/gcc/testsuite/go.test/test/interface/explicit.go b/gcc/testsuite/go.test/test/interface/explicit.go
index b6a582fffb..daae59b361 100644
--- a/gcc/testsuite/go.test/test/interface/explicit.go
+++ b/gcc/testsuite/go.test/test/interface/explicit.go
@@ -48,7 +48,7 @@ func main() {
i2 = I2(i) // ERROR "invalid|missing N method"
e = E(t) // ok
- t = T(e) // ERROR "need explicit|need type assertion|incompatible"
+ t = T(e) // ERROR "need explicit|need type assertion|incompatible" "as type [*]T"
}
type M interface {
diff --git a/gcc/testsuite/go.test/test/interface/fail.go b/gcc/testsuite/go.test/test/interface/fail.go
index 3e741d3f91..0c20bcf756 100644
--- a/gcc/testsuite/go.test/test/interface/fail.go
+++ b/gcc/testsuite/go.test/test/interface/fail.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && ! ./$A.out
+// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -13,6 +13,10 @@ type I interface {
}
func main() {
+ shouldPanic(p1)
+}
+
+func p1() {
var s *S
var i I
var e interface {}
@@ -21,6 +25,14 @@ func main() {
_ = i
}
-// hide S down here to avoid static warning
type S struct {
}
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("function should panic")
+ }
+ }()
+ f()
+}
diff --git a/gcc/testsuite/go.test/test/interface/fake.go b/gcc/testsuite/go.test/test/interface/fake.go
index 5cf3be052c..ddb8325427 100644
--- a/gcc/testsuite/go.test/test/interface/fake.go
+++ b/gcc/testsuite/go.test/test/interface/fake.go
@@ -12,20 +12,20 @@ package main
import "reflect"
type T struct {
- f float32
- g float32
+ F float32
+ G float32
- s string
- t string
+ S string
+ T string
- u uint32
- v uint32
+ U uint32
+ V uint32
- w uint32
- x uint32
+ W uint32
+ X uint32
- y uint32
- z uint32
+ Y uint32
+ Z uint32
}
func add(s, t string) string {
@@ -40,40 +40,40 @@ func assert(b bool) {
func main() {
var x T
- x.f = 1.0
- x.g = x.f
- x.s = add("abc", "def")
- x.t = add("abc", "def")
- x.u = 1
- x.v = 2
- x.w = 1<<28
- x.x = 2<<28
- x.y = 0x12345678
- x.z = x.y
+ x.F = 1.0
+ x.G = x.F
+ x.S = add("abc", "def")
+ x.T = add("abc", "def")
+ x.U = 1
+ x.V = 2
+ x.W = 1 << 28
+ x.X = 2 << 28
+ x.Y = 0x12345678
+ x.Z = x.Y
// check mem and string
- v := reflect.NewValue(x)
- i := v.(*reflect.StructValue).Field(0)
- j := v.(*reflect.StructValue).Field(1)
+ v := reflect.ValueOf(x)
+ i := v.Field(0)
+ j := v.Field(1)
assert(i.Interface() == j.Interface())
- s := v.(*reflect.StructValue).Field(2)
- t := v.(*reflect.StructValue).Field(3)
+ s := v.Field(2)
+ t := v.Field(3)
assert(s.Interface() == t.Interface())
// make sure different values are different.
// make sure whole word is being compared,
// not just a single byte.
- i = v.(*reflect.StructValue).Field(4)
- j = v.(*reflect.StructValue).Field(5)
+ i = v.Field(4)
+ j = v.Field(5)
assert(i.Interface() != j.Interface())
- i = v.(*reflect.StructValue).Field(6)
- j = v.(*reflect.StructValue).Field(7)
+ i = v.Field(6)
+ j = v.Field(7)
assert(i.Interface() != j.Interface())
- i = v.(*reflect.StructValue).Field(8)
- j = v.(*reflect.StructValue).Field(9)
+ i = v.Field(8)
+ j = v.Field(9)
assert(i.Interface() == j.Interface())
}
diff --git a/gcc/testsuite/go.test/test/interface/noeq.go b/gcc/testsuite/go.test/test/interface/noeq.go
new file mode 100644
index 0000000000..3c2ea5975a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/interface/noeq.go
@@ -0,0 +1,39 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: interface/noeq
+
+// 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.
+
+// Interface values containing types that cannot be compared for equality.
+
+package main
+
+func main() {
+ cmp(1)
+
+ var (
+ m map[int]int
+ s struct{ x []int }
+ f func()
+ )
+ noCmp(m)
+ noCmp(s)
+ noCmp(f)
+}
+
+func cmp(x interface{}) bool {
+ return x == x
+}
+
+func noCmp(x interface{}) {
+ shouldPanic(func() { cmp(x) })
+}
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("function should panic")
+ }
+ }()
+ f()
+}
diff --git a/gcc/testsuite/go.test/test/interface/pointer.go b/gcc/testsuite/go.test/test/interface/pointer.go
index e628b558ea..f1e363cbff 100644
--- a/gcc/testsuite/go.test/test/interface/pointer.go
+++ b/gcc/testsuite/go.test/test/interface/pointer.go
@@ -33,4 +33,5 @@ func main() {
print("call addinst\n")
var x Inst = AddInst(new(Start)) // ERROR "pointer to interface"
print("return from addinst\n")
+ var y *Inst = new(Start) // ERROR "pointer to interface|incompatible type"
}
diff --git a/gcc/testsuite/go.test/test/interface/private.go b/gcc/testsuite/go.test/test/interface/private.go
new file mode 100644
index 0000000000..37890c923a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/interface/private.go
@@ -0,0 +1,32 @@
+// $G $D/${F}1.go && errchk $G $D/$F.go
+
+// 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 main
+
+import "./private1"
+
+type Exported interface {
+ private()
+}
+
+type Implementation struct{}
+
+func (p *Implementation) private() {}
+
+func main() {
+ var x Exported
+ x = new(Implementation)
+ x.private()
+
+ var px p.Exported
+ px = p.X
+
+ px.private() // ERROR "private"
+
+ px = new(Implementation) // ERROR "private"
+
+ x = px // ERROR "private"
+}
diff --git a/gcc/testsuite/go.test/test/interface/private1.go b/gcc/testsuite/go.test/test/interface/private1.go
new file mode 100644
index 0000000000..3173fbef41
--- /dev/null
+++ b/gcc/testsuite/go.test/test/interface/private1.go
@@ -0,0 +1,18 @@
+// true # used by private.go
+
+// 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 p
+
+type Exported interface {
+ private()
+}
+
+type Implementation struct{}
+
+func (p *Implementation) private() {}
+
+var X = new(Implementation)
+
diff --git a/gcc/testsuite/go.test/test/interface/recursive1.go b/gcc/testsuite/go.test/test/interface/recursive1.go
new file mode 100644
index 0000000000..2c93a28363
--- /dev/null
+++ b/gcc/testsuite/go.test/test/interface/recursive1.go
@@ -0,0 +1,15 @@
+// true # used by recursive2
+
+// 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 p
+
+type I1 interface {
+ F() I2
+}
+
+type I2 interface {
+ I1
+}
diff --git a/gcc/testsuite/go.test/test/interface/recursive2.go b/gcc/testsuite/go.test/test/interface/recursive2.go
new file mode 100644
index 0000000000..a7f9ab5dbd
--- /dev/null
+++ b/gcc/testsuite/go.test/test/interface/recursive2.go
@@ -0,0 +1,22 @@
+// $G $D/recursive1.go && $G $D/$F.go
+
+// 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.
+
+// Check that the mutually recursive types in recursive1.go made it
+// intact and with the same meaning, by assigning to or using them.
+
+package main
+
+import "./recursive1"
+
+func main() {
+ var i1 p.I1
+ var i2 p.I2
+ i1 = i2
+ i2 = i1
+ i1 = i2.F()
+ i2 = i1.F()
+ _, _ = i1, i2
+}
diff --git a/gcc/testsuite/go.test/test/interface/returntype.go b/gcc/testsuite/go.test/test/interface/returntype.go
index c526b3b0ec..5cf0836178 100644
--- a/gcc/testsuite/go.test/test/interface/returntype.go
+++ b/gcc/testsuite/go.test/test/interface/returntype.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && (! ./$A.out || echo BUG: should not succeed)
+// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -18,8 +18,21 @@ type I1 interface { Name() int8 }
type I2 interface { Name() int64 }
func main() {
+ shouldPanic(p1)
+}
+
+func p1() {
var i1 I1
var s *S
i1 = s
print(i1.(I2).Name())
}
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("function should panic")
+ }
+ }()
+ f()
+}
diff --git a/gcc/testsuite/go.test/test/ken/convert.go b/gcc/testsuite/go.test/test/ken/convert.go
new file mode 100644
index 0000000000..3780ec886a
--- /dev/null
+++ b/gcc/testsuite/go.test/test/ken/convert.go
@@ -0,0 +1,431 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// near-exhaustive test of converting numbers between types.
+
+package main
+
+var i8 int8;
+var u8 uint8;
+var i16 int16;
+var u16 uint16;
+var i32 int32;
+var u32 uint32;
+var i64 int64;
+var u64 uint64;
+var f32 float32;
+var f64 float64;
+
+type big float64
+
+type t struct {
+ from, to int
+ val big
+}
+
+const (
+ ti8 = iota+1
+ tu8
+ ti16
+ tu16
+ ti32
+ tu32
+ ti64
+ tu64
+ tf32
+ tf64
+)
+
+var x = []t{
+
+ /* value good in all types (10) */
+ { ti8, ti8, 10 }, { ti8, tu8, 10 }, { ti8, ti16, 10 }, { ti8, tu16, 10 },
+ { ti8, ti32, 10 }, { ti8, tu32, 10 }, { ti8, ti64, 10 }, { ti8, tu64, 10 },
+ { ti8, tf32, 10 }, { ti8, tf64, 10 },
+
+ { tu8, ti8, 10 }, { tu8, tu8, 10 }, { tu8, ti16, 10 }, { tu8, tu16, 10 },
+ { tu8, ti32, 10 }, { tu8, tu32, 10 }, { tu8, ti64, 10 }, { tu8, tu64, 10 },
+ { tu8, tf32, 10 }, { tu8, tf64, 10 },
+
+ { ti16, ti8, 10 }, { ti16, tu8, 10 }, { ti16, ti16, 10 }, { ti16, tu16, 10 },
+ { ti16, ti32, 10 }, { ti16, tu32, 10 }, { ti16, ti64, 10 }, { ti16, tu64, 10 },
+ { ti16, tf32, 10 }, { ti16, tf64, 10 },
+
+ { tu16, ti8, 10 }, { tu16, tu8, 10 }, { tu16, ti16, 10 }, { tu16, tu16, 10 },
+ { tu16, ti32, 10 }, { tu16, tu32, 10 }, { tu16, ti64, 10 }, { tu16, tu64, 10 },
+ { tu16, tf32, 10 }, { tu16, tf64, 10 },
+
+ { ti32, ti8, 10 }, { ti32, tu8, 10 }, { ti32, ti16, 10 }, { ti32, tu16, 10 },
+ { ti32, ti32, 10 }, { ti32, tu32, 10 }, { ti32, ti64, 10 }, { ti32, tu64, 10 },
+ { ti32, tf32, 10 }, { ti32, tf64, 10 },
+
+ { tu32, ti8, 10 }, { tu32, tu8, 10 }, { tu32, ti16, 10 }, { tu32, tu16, 10 },
+ { tu32, ti32, 10 }, { tu32, tu32, 10 }, { tu32, ti64, 10 }, { tu32, tu64, 10 },
+ { tu32, tf32, 10 }, { tu32, tf64, 10 },
+
+ { ti64, ti8, 10 }, { ti64, tu8, 10 }, { ti64, ti16, 10 }, { ti64, tu16, 10 },
+ { ti64, ti32, 10 }, { ti64, tu32, 10 }, { ti64, ti64, 10 }, { ti64, tu64, 10 },
+ { ti64, tf32, 10 }, { ti64, tf64, 10 },
+
+ { tu64, ti8, 10 }, { tu64, tu8, 10 }, { tu64, ti16, 10 }, { tu64, tu16, 10 },
+ { tu64, ti32, 10 }, { tu64, tu32, 10 }, { tu64, ti64, 10 }, { tu64, tu64, 10 },
+ { tu64, tf32, 10 }, { tu64, tf64, 10 },
+
+ { tf32, ti8, 10 }, { tf32, tu8, 10 }, { tf32, ti16, 10 }, { tf32, tu16, 10 },
+ { tf32, ti32, 10 }, { tf32, tu32, 10 }, { tf32, ti64, 10 }, { tf32, tu64, 10 },
+ { tf32, tf32, 10 }, { tf32, tf64, 10 },
+
+ { tf64, ti8, 10 }, { tf64, tu8, 10 }, { tf64, ti16, 10 }, { tf64, tu16, 10 },
+ { tf64, ti32, 10 }, { tf64, tu32, 10 }, { tf64, ti64, 10 }, { tf64, tu64, 10 },
+ { tf64, tf32, 10 }, { tf64, tf64, 10 },
+
+ /* value good in all signed types (-4) */
+ { ti8, ti8, -4 }, { ti8, ti16, -4 },
+ { ti8, ti32, -4 }, { ti8, ti64, -4 },
+ { ti8, tf32, -4 }, { ti8, tf64, -4 },
+
+ { ti16, ti8, -4 }, { ti16, ti16, -4 },
+ { ti16, ti32, -4 }, { ti16, ti64, -4 },
+ { ti16, tf32, -4 },
+
+ { ti32, ti8, -4 }, { ti32, ti16, -4 },
+ { ti32, ti32, -4 }, { ti32, ti64, -4 },
+ { ti32, tf32, -4 }, { ti32, tf64, -4 },
+
+ { ti64, ti8, -4 }, { ti64, ti16, -4 },
+ { ti64, ti32, -4 }, { ti64, ti64, -4 },
+ { ti64, tf32, -4 },
+
+ { tf32, ti8, -4 }, { tf32, ti16, -4 },
+ { tf32, ti32, -4 }, { tf32, ti64, -4 },
+ { tf32, tf32, -4 },
+
+ { tf64, ti8, -4 }, { tf64, ti16, -4 },
+ { tf64, ti32, -4 }, { tf64, ti64, -4 },
+ { tf64, tf32, -4 }, { tf64, tf64, -4 },
+
+ /* value good in u8 and up (175) */
+ { tu8, tu8, 175 }, { tu8, ti16, 175 }, { tu8, tu16, 175 },
+ { tu8, ti32, 175 }, { tu8, tu32, 175 }, { tu8, ti64, 175 }, { tu8, tu64, 175 },
+ { tu8, tf32, 175 }, { tu8, tf64, 175 },
+
+ { ti16, tu8, 175 }, { ti16, ti16, 175 }, { ti16, tu16, 175 },
+ { ti16, ti32, 175 }, { ti16, tu32, 175 }, { ti16, ti64, 175 }, { ti16, tu64, 175 },
+ { ti16, tf32, 175 }, { ti16, tf64, 175 },
+
+ { tu16, tu8, 175 }, { tu16, ti16, 175 }, { tu16, tu16, 175 },
+ { tu16, ti32, 175 }, { tu16, tu32, 175 }, { tu16, ti64, 175 }, { tu16, tu64, 175 },
+ { tu16, tf32, 175 }, { tu16, tf64, 175 },
+
+ { ti32, tu8, 175 }, { ti32, ti16, 175 }, { ti32, tu16, 175 },
+ { ti32, ti32, 175 }, { ti32, tu32, 175 }, { ti32, ti64, 175 }, { ti32, tu64, 175 },
+ { ti32, tf32, 175 }, { ti32, tf64, 175 },
+
+ { tu32, tu8, 175 }, { tu32, ti16, 175 }, { tu32, tu16, 175 },
+ { tu32, ti32, 175 }, { tu32, tu32, 175 }, { tu32, ti64, 175 }, { tu32, tu64, 175 },
+ { tu32, tf32, 175 }, { tu32, tf64, 175 },
+
+ { ti64, tu8, 175 }, { ti64, ti16, 175 }, { ti64, tu16, 175 },
+ { ti64, ti32, 175 }, { ti64, tu32, 175 }, { ti64, ti64, 175 }, { ti64, tu64, 175 },
+ { ti64, tf32, 175 }, { ti64, tf64, 175 },
+
+ { tu64, tu8, 175 }, { tu64, ti16, 175 }, { tu64, tu16, 175 },
+ { tu64, ti32, 175 }, { tu64, tu32, 175 }, { tu64, ti64, 175 }, { tu64, tu64, 175 },
+ { tu64, tf32, 175 }, { tu64, tf64, 175 },
+
+ { tf32, tu8, 175 }, { tf32, ti16, 175 }, { tf32, tu16, 175 },
+ { tf32, ti32, 175 }, { tf32, tu32, 175 }, { tf32, ti64, 175 }, { tf32, tu64, 175 },
+ { tf32, tf32, 175 }, { tf32, tf64, 175 },
+
+ { tf64, tu8, 175 }, { tf64, ti16, 175 }, { tf64, tu16, 175 },
+ { tf64, ti32, 175 }, { tf64, tu32, 175 }, { tf64, ti64, 175 }, { tf64, tu64, 175 },
+ { tf64, tf32, 175 }, { tf64, tf64, 175 },
+
+ /* value good in u16 and up (41259) */
+ { tu16, tu16, 41259 },
+ { tu16, ti32, 41259 }, { tu16, ti64, 41259 }, { tu16, tu64, 41259 },
+ { tu16, tf32, 41259 }, { tu16, tf64, 41259 },
+
+ { ti32, tu16, 41259 },
+ { ti32, ti32, 41259 }, { ti32, tu32, 41259 }, { ti32, ti64, 41259 }, { ti32, tu64, 41259 },
+ { ti32, tf32, 41259 }, { ti32, tf64, 41259 },
+
+ { tu32, tu16, 41259 },
+ { tu32, ti32, 41259 }, { tu32, tu32, 41259 }, { tu32, ti64, 41259 }, { tu32, tu64, 41259 },
+ { tu32, tf32, 41259 }, { tu32, tf64, 41259 },
+
+ { ti64, tu16, 41259 },
+ { ti64, ti32, 41259 }, { ti64, tu32, 41259 }, { ti64, ti64, 41259 }, { ti64, tu64, 41259 },
+ { ti64, tf32, 41259 }, { ti64, tf64, 41259 },
+
+ { tu64, tu16, 41259 },
+ { tu64, ti32, 41259 }, { tu64, tu32, 41259 }, { tu64, ti64, 41259 }, { tu64, tu64, 41259 },
+ { tu64, tf32, 41259 }, { tu64, tf64, 41259 },
+
+ { tf32, tu16, 41259 },
+ { tf32, ti32, 41259 }, { tf32, tu32, 41259 }, { tf32, ti64, 41259 }, { tf32, tu64, 41259 },
+ { tf32, tf32, 41259 }, { tf32, tf64, 41259 },
+
+ { tf64, tu16, 41259 },
+ { tf64, ti32, 41259 }, { tf64, tu32, 41259 }, { tf64, ti64, 41259 }, { tf64, tu64, 41259 },
+ { tf64, tf32, 41259 }, { tf64, tf64, 41259 },
+
+ /* value good in u32 and up (3758096384) */
+ { tu32, tu32, 3758096384 }, { tu32, ti64, 3758096384 }, { tu32, tu64, 3758096384 },
+ { tu32, tf32, 3758096384 }, { tu32, tf64, 3758096384 },
+
+ { ti64, tu32, 3758096384 }, { ti64, ti64, 3758096384 }, { ti64, tu64, 3758096384 },
+ { ti64, tf32, 3758096384 }, { ti64, tf64, 3758096384 },
+
+ { tu64, tu32, 3758096384 }, { tu64, ti64, 3758096384 }, { tu64, tu64, 3758096384 },
+ { tu64, tf32, 3758096384 }, { tu64, tf64, 3758096384 },
+
+ { tf32, tu32, 3758096384 }, { tf32, ti64, 3758096384 }, { tf32, tu64, 3758096384 },
+ { tf32, tf32, 3758096384 }, { tf32, tf64, 3758096384 },
+
+ { tf64, tu32, 3758096384 }, { tf64, ti64, 3758096384 }, { tf64, tu64, 3758096384 },
+ { tf64, tf32, 3758096384 }, { tf64, tf64, 3758096384 },
+
+ /* value good in u64 and up (16717361816799281152) */
+ { tu64, tu64, 16717361816799281152 },
+ { tu64, tf32, 16717361816799281152 }, { tu64, tf64, 16717361816799281152 },
+
+ { tf32, tu64, 16717361816799281152 },
+ { tf32, tf32, 16717361816799281152 }, { tf32, tf64, 16717361816799281152 },
+
+ { tf64, tu64, 16717361816799281152 },
+ { tf64, tf32, 16717361816799281152 }, { tf64, tf64, 16717361816799281152 },
+}
+
+func main() {
+ for i:=0; i<len(x); i++ {
+ v := x[i].val // input value
+ w := big(0) // output value
+ f := x[i].from // input type
+ t := x[i].to // output type
+
+ i8 = 0; u8 = 0; i16 = 0; u16 = 0
+ i32 = 0; u32 = 0; i64 = 0; u64 = 0
+ f32 = 0; f64 = 0
+
+ switch f*100 + t {
+ default:
+ println("missing case", i, v, f, t)
+ w = v
+
+ case ti8*100 + ti8:
+ i8 = int8(v); i8 = int8(i8); w = big(i8)
+ case ti8*100 + tu8:
+ i8 = int8(v); u8 = uint8(i8); w = big(u8)
+ case ti8*100 + ti16:
+ i8 = int8(v); i16 = int16(i8); w = big(i16)
+ case ti8*100 + tu16:
+ i8 = int8(v); u16 = uint16(i8); w = big(u16)
+ case ti8*100 + ti32:
+ i8 = int8(v); i32 = int32(i8); w = big(i32)
+ case ti8*100 + tu32:
+ i8 = int8(v); u32 = uint32(i8); w = big(u32)
+ case ti8*100 + ti64:
+ i8 = int8(v); i64 = int64(i8); w = big(i64)
+ case ti8*100 + tu64:
+ i8 = int8(v); u64 = uint64(i8); w = big(u64)
+ case ti8*100 + tf32:
+ i8 = int8(v); f32 = float32(i8); w = big(f32)
+ case ti8*100 + tf64:
+ i8 = int8(v); f64 = float64(i8); w = big(f64)
+
+ case tu8*100 + ti8:
+ u8 = uint8(v); i8 = int8(u8); w = big(i8)
+ case tu8*100 + tu8:
+ u8 = uint8(v); u8 = uint8(u8); w = big(u8)
+ case tu8*100 + ti16:
+ u8 = uint8(v); i16 = int16(u8); w = big(i16)
+ case tu8*100 + tu16:
+ u8 = uint8(v); u16 = uint16(u8); w = big(u16)
+ case tu8*100 + ti32:
+ u8 = uint8(v); i32 = int32(u8); w = big(i32)
+ case tu8*100 + tu32:
+ u8 = uint8(v); u32 = uint32(u8); w = big(u32)
+ case tu8*100 + ti64:
+ u8 = uint8(v); i64 = int64(u8); w = big(i64)
+ case tu8*100 + tu64:
+ u8 = uint8(v); u64 = uint64(u8); w = big(u64)
+ case tu8*100 + tf32:
+ u8 = uint8(v); f32 = float32(u8); w = big(f32)
+ case tu8*100 + tf64:
+ u8 = uint8(v); f64 = float64(u8); w = big(f64)
+
+ case ti16*100 + ti8:
+ i16 = int16(v); i8 = int8(i16); w = big(i8)
+ case ti16*100 + tu8:
+ i16 = int16(v); u8 = uint8(i16); w = big(u8)
+ case ti16*100 + ti16:
+ i16 = int16(v); i16 = int16(i16); w = big(i16)
+ case ti16*100 + tu16:
+ i16 = int16(v); u16 = uint16(i16); w = big(u16)
+ case ti16*100 + ti32:
+ i16 = int16(v); i32 = int32(i16); w = big(i32)
+ case ti16*100 + tu32:
+ i16 = int16(v); u32 = uint32(i16); w = big(u32)
+ case ti16*100 + ti64:
+ i16 = int16(v); i64 = int64(i16); w = big(i64)
+ case ti16*100 + tu64:
+ i16 = int16(v); u64 = uint64(i16); w = big(u64)
+ case ti16*100 + tf32:
+ i16 = int16(v); f32 = float32(i16); w = big(f32)
+ case ti16*100 + tf64:
+ i16 = int16(v); f64 = float64(i16); w = big(f64)
+
+ case tu16*100 + ti8:
+ u16 = uint16(v); i8 = int8(u16); w = big(i8)
+ case tu16*100 + tu8:
+ u16 = uint16(v); u8 = uint8(u16); w = big(u8)
+ case tu16*100 + ti16:
+ u16 = uint16(v); i16 = int16(u16); w = big(i16)
+ case tu16*100 + tu16:
+ u16 = uint16(v); u16 = uint16(u16); w = big(u16)
+ case tu16*100 + ti32:
+ u16 = uint16(v); i32 = int32(u16); w = big(i32)
+ case tu16*100 + tu32:
+ u16 = uint16(v); u32 = uint32(u16); w = big(u32)
+ case tu16*100 + ti64:
+ u16 = uint16(v); i64 = int64(u16); w = big(i64)
+ case tu16*100 + tu64:
+ u16 = uint16(v); u64 = uint64(u16); w = big(u64)
+ case tu16*100 + tf32:
+ u16 = uint16(v); f32 = float32(u16); w = big(f32)
+ case tu16*100 + tf64:
+ u16 = uint16(v); f64 = float64(u16); w = big(f64)
+
+ case ti32*100 + ti8:
+ i32 = int32(v); i8 = int8(i32); w = big(i8)
+ case ti32*100 + tu8:
+ i32 = int32(v); u8 = uint8(i32); w = big(u8)
+ case ti32*100 + ti16:
+ i32 = int32(v); i16 = int16(i32); w = big(i16)
+ case ti32*100 + tu16:
+ i32 = int32(v); u16 = uint16(i32); w = big(u16)
+ case ti32*100 + ti32:
+ i32 = int32(v); i32 = int32(i32); w = big(i32)
+ case ti32*100 + tu32:
+ i32 = int32(v); u32 = uint32(i32); w = big(u32)
+ case ti32*100 + ti64:
+ i32 = int32(v); i64 = int64(i32); w = big(i64)
+ case ti32*100 + tu64:
+ i32 = int32(v); u64 = uint64(i32); w = big(u64)
+ case ti32*100 + tf32:
+ i32 = int32(v); f32 = float32(i32); w = big(f32)
+ case ti32*100 + tf64:
+ i32 = int32(v); f64 = float64(i32); w = big(f64)
+
+ case tu32*100 + ti8:
+ u32 = uint32(v); i8 = int8(u32); w = big(i8)
+ case tu32*100 + tu8:
+ u32 = uint32(v); u8 = uint8(u32); w = big(u8)
+ case tu32*100 + ti16:
+ u32 = uint32(v); i16 = int16(u32); w = big(i16)
+ case tu32*100 + tu16:
+ u32 = uint32(v); u16 = uint16(u32); w = big(u16)
+ case tu32*100 + ti32:
+ u32 = uint32(v); i32 = int32(u32); w = big(i32)
+ case tu32*100 + tu32:
+ u32 = uint32(v); u32 = uint32(u32); w = big(u32)
+ case tu32*100 + ti64:
+ u32 = uint32(v); i64 = int64(u32); w = big(i64)
+ case tu32*100 + tu64:
+ u32 = uint32(v); u64 = uint64(u32); w = big(u64)
+ case tu32*100 + tf32:
+ u32 = uint32(v); f32 = float32(u32); w = big(f32)
+ case tu32*100 + tf64:
+ u32 = uint32(v); f64 = float64(u32); w = big(f64)
+
+ case ti64*100 + ti8:
+ i64 = int64(v); i8 = int8(i64); w = big(i8)
+ case ti64*100 + tu8:
+ i64 = int64(v); u8 = uint8(i64); w = big(u8)
+ case ti64*100 + ti16:
+ i64 = int64(v); i16 = int16(i64); w = big(i16)
+ case ti64*100 + tu16:
+ i64 = int64(v); u16 = uint16(i64); w = big(u16)
+ case ti64*100 + ti32:
+ i64 = int64(v); i32 = int32(i64); w = big(i32)
+ case ti64*100 + tu32:
+ i64 = int64(v); u32 = uint32(i64); w = big(u32)
+ case ti64*100 + ti64:
+ i64 = int64(v); i64 = int64(i64); w = big(i64)
+ case ti64*100 + tu64:
+ i64 = int64(v); u64 = uint64(i64); w = big(u64)
+ case ti64*100 + tf32:
+ i64 = int64(v); f32 = float32(i64); w = big(f32)
+ case ti64*100 + tf64:
+ i64 = int64(v); f64 = float64(i64); w = big(f64)
+
+ case tu64*100 + ti8:
+ u64 = uint64(v); i8 = int8(u64); w = big(i8)
+ case tu64*100 + tu8:
+ u64 = uint64(v); u8 = uint8(u64); w = big(u8)
+ case tu64*100 + ti16:
+ u64 = uint64(v); i16 = int16(u64); w = big(i16)
+ case tu64*100 + tu16:
+ u64 = uint64(v); u16 = uint16(u64); w = big(u16)
+ case tu64*100 + ti32:
+ u64 = uint64(v); i32 = int32(u64); w = big(i32)
+ case tu64*100 + tu32:
+ u64 = uint64(v); u32 = uint32(u64); w = big(u32)
+ case tu64*100 + ti64:
+ u64 = uint64(v); i64 = int64(u64); w = big(i64)
+ case tu64*100 + tu64:
+ u64 = uint64(v); u64 = uint64(u64); w = big(u64)
+ case tu64*100 + tf32:
+ u64 = uint64(v); f32 = float32(u64); w = big(f32)
+ case tu64*100 + tf64:
+ u64 = uint64(v); f64 = float64(u64); w = big(f64)
+
+ case tf32*100 + ti8:
+ f32 = float32(v); i8 = int8(f32); w = big(i8)
+ case tf32*100 + tu8:
+ f32 = float32(v); u8 = uint8(f32); w = big(u8)
+ case tf32*100 + ti16:
+ f32 = float32(v); i16 = int16(f32); w = big(i16)
+ case tf32*100 + tu16:
+ f32 = float32(v); u16 = uint16(f32); w = big(u16)
+ case tf32*100 + ti32:
+ f32 = float32(v); i32 = int32(f32); w = big(i32)
+ case tf32*100 + tu32:
+ f32 = float32(v); u32 = uint32(f32); w = big(u32)
+ case tf32*100 + ti64:
+ f32 = float32(v); i64 = int64(f32); w = big(i64)
+ case tf32*100 + tu64:
+ f32 = float32(v); u64 = uint64(f32); w = big(u64)
+ case tf32*100 + tf32:
+ f32 = float32(v); f32 = float32(f32); w = big(f32)
+ case tf32*100 + tf64:
+ f32 = float32(v); f64 = float64(f32); w = big(f64)
+
+ case tf64*100 + ti8:
+ f64 = float64(v); i8 = int8(f64); w = big(i8)
+ case tf64*100 + tu8:
+ f64 = float64(v); u8 = uint8(f64); w = big(u8)
+ case tf64*100 + ti16:
+ f64 = float64(v); i16 = int16(f64); w = big(i16)
+ case tf64*100 + tu16:
+ f64 = float64(v); u16 = uint16(f64); w = big(u16)
+ case tf64*100 + ti32:
+ f64 = float64(v); i32 = int32(f64); w = big(i32)
+ case tf64*100 + tu32:
+ f64 = float64(v); u32 = uint32(f64); w = big(u32)
+ case tf64*100 + ti64:
+ f64 = float64(v); i64 = int64(f64); w = big(i64)
+ case tf64*100 + tu64:
+ f64 = float64(v); u64 = uint64(f64); w = big(u64)
+ case tf64*100 + tf32:
+ f64 = float64(v); f32 = float32(f64); w = big(f32)
+ case tf64*100 + tf64:
+ f64 = float64(v); f64 = float64(f64); w = big(f64)
+ }
+ if v != w { println(i, v, w, f, t) }
+ }
+}
diff --git a/gcc/testsuite/go.test/test/ken/cplx0.go b/gcc/testsuite/go.test/test/ken/cplx0.go
index ba1fa196fd..f38ce5b65d 100644
--- a/gcc/testsuite/go.test/test/ken/cplx0.go
+++ b/gcc/testsuite/go.test/test/ken/cplx0.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// $G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
diff --git a/gcc/testsuite/go.test/test/ken/cplx0.out b/gcc/testsuite/go.test/test/ken/cplx0.out
new file mode 100644
index 0000000000..7627c28df7
--- /dev/null
+++ b/gcc/testsuite/go.test/test/ken/cplx0.out
@@ -0,0 +1,4 @@
+(+5.000000e+000+6.000000e+000i)
+(+5.000000e+000+6.000000e+000i)
+(+5.000000e+000+6.000000e+000i)
+(+5.000000e+000+6.000000e+000i)
diff --git a/gcc/testsuite/go.test/test/ken/cplx2.go b/gcc/testsuite/go.test/test/ken/cplx2.go
index 5a66dc9a95..89f4a04181 100644
--- a/gcc/testsuite/go.test/test/ken/cplx2.go
+++ b/gcc/testsuite/go.test/test/ken/cplx2.go
@@ -28,13 +28,13 @@ const (
func main() {
- r := 5 + 0i
+ var r complex64 = 5 + 0i
if r != R {
println("opcode 1", r, R)
panic("fail")
}
- i := 6i
+ var i complex64 = 6i
if i != I {
println("opcode 2", i, I)
panic("fail")
@@ -105,4 +105,16 @@ func main() {
println("opcode x", ce, Ce)
panic("fail")
}
+
+ r32 := real(complex64(ce))
+ if r32 != float32(real(Ce)) {
+ println("real(complex64(ce))", r32, real(Ce))
+ panic("fail")
+ }
+
+ r64 := real(complex128(ce))
+ if r64 != real(Ce) {
+ println("real(complex128(ce))", r64, real(Ce))
+ panic("fail")
+ }
}
diff --git a/gcc/testsuite/go.test/test/ken/cplx3.go b/gcc/testsuite/go.test/test/ken/cplx3.go
index 83acc15ff7..048c93eef6 100644
--- a/gcc/testsuite/go.test/test/ken/cplx3.go
+++ b/gcc/testsuite/go.test/test/ken/cplx3.go
@@ -19,15 +19,34 @@ const (
func main() {
c0 := C1
c0 = (c0 + c0 + c0) / (c0 + c0 + 3i)
- println(c0)
+ r, i := real(c0), imag(c0)
+ d := r - 1.292308
+ if d < 0 {
+ d = - d
+ }
+ if d > 1e-6 {
+ println(r, "!= 1.292308")
+ panic(0)
+ }
+ d = i + 0.1384615
+ if d < 0 {
+ d = - d
+ }
+ if d > 1e-6 {
+ println(i, "!= -0.1384615")
+ panic(0)
+ }
c := *(*complex128)(unsafe.Pointer(&c0))
- println(c)
+ if c != c0 {
+ println(c, "!=", c)
+ panic(0)
+ }
var a interface{}
- switch c := reflect.NewValue(a).(type) {
- case *reflect.ComplexValue:
- v := c.Get()
+ switch c := reflect.ValueOf(a); c.Kind() {
+ case reflect.Complex64, reflect.Complex128:
+ v := c.Complex()
_, _ = complex128(v), true
}
}
diff --git a/gcc/testsuite/go.test/test/ken/cplx4.go b/gcc/testsuite/go.test/test/ken/cplx4.go
index 8524e47aec..738afcd2ca 100644
--- a/gcc/testsuite/go.test/test/ken/cplx4.go
+++ b/gcc/testsuite/go.test/test/ken/cplx4.go
@@ -15,30 +15,44 @@ const (
C1 = R + I // ADD(5,6)
)
-func doprint(c complex128) { fmt.Printf("c = %f\n", c) }
+func want(s, w string) {
+ if s != w {
+ panic(s + " != " + w)
+ }
+}
+
+func doprint(c complex128, w string) {
+ s := fmt.Sprintf("%f", c)
+ want(s, w)
+}
func main() {
// constants
- fmt.Printf("c = %f\n", -C1)
- doprint(C1)
+ s := fmt.Sprintf("%f", -C1)
+ want(s, "(-5.000000-6.000000i)")
+ doprint(C1, "(5.000000+6.000000i)")
// variables
c1 := C1
- fmt.Printf("c = %f\n", c1)
- doprint(c1)
+ s = fmt.Sprintf("%f", c1)
+ want(s, "(5.000000+6.000000i)")
+ doprint(c1, "(5.000000+6.000000i)")
// 128
c2 := complex128(C1)
- fmt.Printf("c = %G\n", c2)
+ s = fmt.Sprintf("%G", c2)
+ want(s, "(5+6i)")
// real, imag, complex
c3 := complex(real(c2)+3, imag(c2)-5) + c2
- fmt.Printf("c = %G\n", c3)
+ s = fmt.Sprintf("%G", c3)
+ want(s, "(13+7i)")
// compiler used to crash on nested divide
c4 := complex(real(c3/2), imag(c3/2))
if c4 != c3/2 {
fmt.Printf("BUG: c3 = %G != c4 = %G\n", c3, c4)
+ panic(0)
}
}
diff --git a/gcc/testsuite/go.test/test/ken/cplx5.go b/gcc/testsuite/go.test/test/ken/cplx5.go
index d425a7c4c0..e6696674b0 100644
--- a/gcc/testsuite/go.test/test/ken/cplx5.go
+++ b/gcc/testsuite/go.test/test/ken/cplx5.go
@@ -19,36 +19,52 @@ func main() {
for i := 0; i < len(a); i++ {
a[i] = complex(float64(i), float64(-i))
}
- println(a[5])
+ if a[5] != 5-5i {
+ panic(a[5])
+ }
// slice of complex128
s = make([]complex128, len(a))
for i := 0; i < len(s); i++ {
s[i] = a[i]
}
- println(s[5])
+ if s[5] != 5-5i {
+ panic(s[5])
+ }
// chan
c = make(chan complex128)
go chantest(c)
- println(<-c)
+ vc := <-c
+ if vc != 5-5i {
+ panic(vc)
+ }
// pointer of complex128
v := a[5]
pv := &v
- println(*pv)
+ if *pv != 5-5i {
+ panic(*pv)
+ }
// field of complex128
f.c = a[5]
- println(f.c)
+ if f.c != 5-5i {
+ panic(f.c)
+ }
// map of complex128
m = make(map[complex128]complex128)
for i := 0; i < len(s); i++ {
m[-a[i]] = a[i]
}
- println(m[5i-5])
- println(m[complex(-5, 5)])
+ if m[5i-5] != 5-5i {
+ panic(m[5i-5])
+ }
+ vm := m[complex(-5, 5)]
+ if vm != 5-5i {
+ panic(vm)
+ }
}
func chantest(c chan complex128) { c <- a[5] }
diff --git a/gcc/testsuite/go.test/test/ken/divconst.go b/gcc/testsuite/go.test/test/ken/divconst.go
index c3b9092cdc..5a64d16b49 100644
--- a/gcc/testsuite/go.test/test/ken/divconst.go
+++ b/gcc/testsuite/go.test/test/ken/divconst.go
@@ -6,7 +6,7 @@
package main
-import "rand"
+import "math/rand"
const Count = 1e5
diff --git a/gcc/testsuite/go.test/test/ken/intervar.go b/gcc/testsuite/go.test/test/ken/intervar.go
index c2aaaa8705..73d1b0660b 100644
--- a/gcc/testsuite/go.test/test/ken/intervar.go
+++ b/gcc/testsuite/go.test/test/ken/intervar.go
@@ -7,7 +7,7 @@
package main
type Iputs interface {
- puts (s string);
+ puts (s string) string;
}
// ---------
@@ -17,9 +17,9 @@ type Print struct {
put Iputs;
}
-func (p *Print) dop() {
- print(" print ", p.whoami);
- p.put.puts("abc");
+func (p *Print) dop() string {
+ r := " print " + string(p.whoami + '0')
+ return r + p.put.puts("abc");
}
// ---------
@@ -29,9 +29,9 @@ type Bio struct {
put Iputs;
}
-func (b *Bio) puts(s string) {
- print(" bio ", b.whoami);
- b.put.puts(s);
+func (b *Bio) puts(s string) string {
+ r := " bio " + string(b.whoami + '0')
+ return r + b.put.puts(s);
}
// ---------
@@ -41,8 +41,8 @@ type File struct {
put Iputs;
}
-func (f *File) puts(s string) {
- print(" file ", f.whoami, " -- ", s);
+func (f *File) puts(s string) string {
+ return " file " + string(f.whoami + '0') + " -- " + s
}
func
@@ -59,6 +59,9 @@ main() {
f.whoami = 3;
- p.dop();
- print("\n");
+ r := p.dop();
+ expected := " print 1 bio 2 file 3 -- abc"
+ if r != expected {
+ panic(r + " != " + expected)
+ }
}
diff --git a/gcc/testsuite/go.test/test/ken/label.go b/gcc/testsuite/go.test/test/ken/label.go
index 770f33e39f..7a509f0484 100644
--- a/gcc/testsuite/go.test/test/ken/label.go
+++ b/gcc/testsuite/go.test/test/ken/label.go
@@ -4,33 +4,29 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-
package main
-func
-main() {
- i := 0;
+func main() {
+ i := 0
if false {
- goto gogoloop;
+ goto gogoloop
}
if false {
- goto gogoloop;
+ goto gogoloop
}
if false {
- goto gogoloop;
+ goto gogoloop
}
- goto gogoloop;
+ goto gogoloop
-// backward declared
+ // backward declared
loop:
- i = i+1;
+ i = i + 1
if i < 100 {
- goto loop;
+ goto loop
}
- print(i);
- print("\n");
- return;
+ return
gogoloop:
- goto loop;
+ goto loop
}
diff --git a/gcc/testsuite/go.test/test/ken/modconst.go b/gcc/testsuite/go.test/test/ken/modconst.go
index acb8831ef7..c2603a0a09 100644
--- a/gcc/testsuite/go.test/test/ken/modconst.go
+++ b/gcc/testsuite/go.test/test/ken/modconst.go
@@ -6,7 +6,7 @@
package main
-import "rand"
+import "math/rand"
const Count = 1e5
diff --git a/gcc/testsuite/go.test/test/ken/rob1.go b/gcc/testsuite/go.test/test/ken/rob1.go
index 03350662a2..a5854b93e2 100644
--- a/gcc/testsuite/go.test/test/ken/rob1.go
+++ b/gcc/testsuite/go.test/test/ken/rob1.go
@@ -7,61 +7,64 @@
package main
type Item interface {
- Print();
+ Print() string
}
type ListItem struct {
- item Item;
- next *ListItem;
+ item Item
+ next *ListItem
}
type List struct {
- head *ListItem;
+ head *ListItem
}
func (list *List) Init() {
- list.head = nil;
+ list.head = nil
}
func (list *List) Insert(i Item) {
- item := new(ListItem);
- item.item = i;
- item.next = list.head;
- list.head = item;
+ item := new(ListItem)
+ item.item = i
+ item.next = list.head
+ list.head = item
}
-func (list *List) Print() {
- i := list.head;
+func (list *List) Print() string {
+ r := ""
+ i := list.head
for i != nil {
- i.item.Print();
- i = i.next;
+ r += i.item.Print()
+ i = i.next
}
+ return r
}
// Something to put in a list
type Integer struct {
- val int;
+ val int
}
func (this *Integer) Init(i int) *Integer {
- this.val = i;
- return this;
+ this.val = i
+ return this
}
-func (this *Integer) Print() {
- print(this.val);
+func (this *Integer) Print() string {
+ return string(this.val + '0')
}
-func
-main() {
- list := new(List);
- list.Init();
+func main() {
+ list := new(List)
+ list.Init()
for i := 0; i < 10; i = i + 1 {
- integer := new(Integer);
- integer.Init(i);
- list.Insert(integer);
+ integer := new(Integer)
+ integer.Init(i)
+ list.Insert(integer)
}
- list.Print();
- print("\n");
+ r := list.Print()
+ if r != "9876543210" {
+ panic(r)
+ }
}
diff --git a/gcc/testsuite/go.test/test/ken/rob2.go b/gcc/testsuite/go.test/test/ken/rob2.go
index af63e4d9f6..d13e2441d4 100644
--- a/gcc/testsuite/go.test/test/ken/rob2.go
+++ b/gcc/testsuite/go.test/test/ken/rob2.go
@@ -4,269 +4,274 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-
package main
-const nilchar = 0;
+import "fmt"
+
+const nilchar = 0
type Atom struct {
- str string;
- integer int;
- next *Slist; /* in hash bucket */
+ str string
+ integer int
+ next *Slist /* in hash bucket */
}
type List struct {
- car *Slist;
- cdr*Slist;
+ car *Slist
+ cdr *Slist
}
type Slist struct {
- isatom bool;
- isstring bool;
+ isatom bool
+ isstring bool
//union {
- atom Atom;
- list List;
+ atom Atom
+ list List
//} u;
}
func (this *Slist) Car() *Slist {
- return this.list.car;
+ return this.list.car
}
func (this *Slist) Cdr() *Slist {
- return this.list.cdr;
+ return this.list.cdr
}
func (this *Slist) String() string {
- return this.atom.str;
+ return this.atom.str
}
func (this *Slist) Integer() int {
- return this.atom.integer;
+ return this.atom.integer
}
func (slist *Slist) Free() {
if slist == nil {
- return;
+ return
}
if slist.isatom {
-// free(slist.String());
+ // free(slist.String());
} else {
- slist.Car().Free();
- slist.Cdr().Free();
+ slist.Car().Free()
+ slist.Cdr().Free()
}
-// free(slist);
+ // free(slist);
}
//Slist* atom(byte *s, int i);
-var token int;
-var peekc int = -1;
-var lineno int32 = 1;
+var token int
+var peekc int = -1
+var lineno int32 = 1
-var input string;
-var inputindex int = 0;
-var tokenbuf [100]byte;
-var tokenlen int = 0;
+var input string
+var inputindex int = 0
+var tokenbuf [100]byte
+var tokenlen int = 0
-const EOF int = -1;
+const EOF int = -1
func main() {
- var list *Slist;
+ var list *Slist
- OpenFile();
- for ;; {
- list = Parse();
+ OpenFile()
+ for {
+ list = Parse()
if list == nil {
- break;
+ break
+ }
+ r := list.Print()
+ list.Free()
+ if r != "(defn foo (add 12 34))" {
+ panic(r)
}
- list.Print();
- list.Free();
- break;
+ break
}
}
-func (slist *Slist) PrintOne(doparen bool) {
+func (slist *Slist) PrintOne(doparen bool) string {
if slist == nil {
- return;
+ return ""
}
+ var r string
if slist.isatom {
if slist.isstring {
- print(slist.String());
+ r = slist.String()
} else {
- print(slist.Integer());
+ r = fmt.Sprintf("%v", slist.Integer())
}
} else {
if doparen {
- print("(" );
+ r += "("
}
- slist.Car().PrintOne(true);
+ r += slist.Car().PrintOne(true)
if slist.Cdr() != nil {
- print(" ");
- slist.Cdr().PrintOne(false);
+ r += " "
+ r += slist.Cdr().PrintOne(false)
}
if doparen {
- print(")");
+ r += ")"
}
}
+ return r
}
-func (slist *Slist) Print() {
- slist.PrintOne(true);
- print("\n");
+func (slist *Slist) Print() string {
+ return slist.PrintOne(true)
}
func Get() int {
- var c int;
+ var c int
if peekc >= 0 {
- c = peekc;
- peekc = -1;
+ c = peekc
+ peekc = -1
} else {
- c = int(input[inputindex]);
- inputindex++;
+ c = int(input[inputindex])
+ inputindex++
if c == '\n' {
- lineno = lineno + 1;
+ lineno = lineno + 1
}
if c == nilchar {
- inputindex = inputindex - 1;
- c = EOF;
+ inputindex = inputindex - 1
+ c = EOF
}
}
- return c;
+ return c
}
func WhiteSpace(c int) bool {
- return c == ' ' || c == '\t' || c == '\r' || c == '\n';
+ return c == ' ' || c == '\t' || c == '\r' || c == '\n'
}
func NextToken() {
- var i, c int;
+ var i, c int
- tokenbuf[0] = nilchar; // clear previous token
- c = Get();
+ tokenbuf[0] = nilchar // clear previous token
+ c = Get()
for WhiteSpace(c) {
- c = Get();
+ c = Get()
}
switch c {
case EOF:
- token = EOF;
+ token = EOF
case '(', ')':
- token = c;
- break;
+ token = c
+ break
default:
- for i = 0; i < 100 - 1; { // sizeof tokenbuf - 1
- tokenbuf[i] = byte(c);
- i = i + 1;
- c = Get();
+ for i = 0; i < 100-1; { // sizeof tokenbuf - 1
+ tokenbuf[i] = byte(c)
+ i = i + 1
+ c = Get()
if c == EOF {
- break;
+ break
}
if WhiteSpace(c) || c == ')' {
- peekc = c;
- break;
+ peekc = c
+ break
}
}
- if i >= 100 - 1 { // sizeof tokenbuf - 1
- panic("atom too long\n");
+ if i >= 100-1 { // sizeof tokenbuf - 1
+ panic("atom too long\n")
}
- tokenlen = i;
- tokenbuf[i] = nilchar;
+ tokenlen = i
+ tokenbuf[i] = nilchar
if '0' <= tokenbuf[0] && tokenbuf[0] <= '9' {
- token = '0';
+ token = '0'
} else {
- token = 'A';
+ token = 'A'
}
}
}
func Expect(c int) {
if token != c {
- print("parse error: expected ", c, "\n");
- panic("parse");
+ print("parse error: expected ", c, "\n")
+ panic("parse")
}
- NextToken();
+ NextToken()
}
// Parse a non-parenthesized list up to a closing paren or EOF
func ParseList() *Slist {
- var slist, retval *Slist;
-
- slist = new(Slist);
- slist.list.car = nil;
- slist.list.cdr = nil;
- slist.isatom = false;
- slist.isstring = false;
-
- retval = slist;
- for ;; {
- slist.list.car = Parse();
- if token == ')' || token == EOF { // empty cdr
- break;
+ var slist, retval *Slist
+
+ slist = new(Slist)
+ slist.list.car = nil
+ slist.list.cdr = nil
+ slist.isatom = false
+ slist.isstring = false
+
+ retval = slist
+ for {
+ slist.list.car = Parse()
+ if token == ')' || token == EOF { // empty cdr
+ break
}
- slist.list.cdr = new(Slist);
- slist = slist.list.cdr;
+ slist.list.cdr = new(Slist)
+ slist = slist.list.cdr
}
- return retval;
+ return retval
}
-func atom(i int) *Slist { // BUG: uses tokenbuf; should take argument)
- var slist *Slist;
+func atom(i int) *Slist { // BUG: uses tokenbuf; should take argument)
+ var slist *Slist
- slist = new(Slist);
+ slist = new(Slist)
if token == '0' {
- slist.atom.integer = i;
- slist.isstring = false;
+ slist.atom.integer = i
+ slist.isstring = false
} else {
- slist.atom.str = string(tokenbuf[0:tokenlen]);
- slist.isstring = true;
+ slist.atom.str = string(tokenbuf[0:tokenlen])
+ slist.isstring = true
}
- slist.isatom = true;
- return slist;
+ slist.isatom = true
+ return slist
}
-func atoi() int { // BUG: uses tokenbuf; should take argument)
- var v int = 0;
+func atoi() int { // BUG: uses tokenbuf; should take argument)
+ var v int = 0
for i := 0; i < tokenlen && '0' <= tokenbuf[i] && tokenbuf[i] <= '9'; i = i + 1 {
- v = 10 * v + int(tokenbuf[i] - '0');
+ v = 10*v + int(tokenbuf[i]-'0')
}
- return v;
+ return v
}
func Parse() *Slist {
- var slist *Slist;
+ var slist *Slist
if token == EOF || token == ')' {
- return nil;
+ return nil
}
if token == '(' {
- NextToken();
- slist = ParseList();
- Expect(')');
- return slist;
+ NextToken()
+ slist = ParseList()
+ Expect(')')
+ return slist
} else {
// Atom
switch token {
case EOF:
- return nil;
+ return nil
case '0':
- slist = atom(atoi());
+ slist = atom(atoi())
case '"', 'A':
- slist = atom(0);
+ slist = atom(0)
default:
- slist = nil;
- print("unknown token: ", token, "\n");
+ slist = nil
+ print("unknown token: ", token, "\n")
}
- NextToken();
- return slist;
+ NextToken()
+ return slist
}
- return nil;
+ return nil
}
func OpenFile() {
- input = "(defn foo (add 12 34))\n\x00";
- inputindex = 0;
- peekc = -1; // BUG
- NextToken();
+ input = "(defn foo (add 12 34))\n\x00"
+ inputindex = 0
+ peekc = -1 // BUG
+ NextToken()
}
diff --git a/gcc/testsuite/go.test/test/ken/robif.go b/gcc/testsuite/go.test/test/ken/robif.go
deleted file mode 100644
index b6fe4e4330..0000000000
--- a/gcc/testsuite/go.test/test/ken/robif.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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
-
-func assertequal(is, shouldbe int, msg string) {
- if is != shouldbe {
- print("assertion fail" + msg + "\n");
- panic(1);
- }
-}
-
-func main() {
- i5 := 5;
- i7 := 7;
-
- var count int;
-
- count = 0;
- if true {
- count = count + 1;
- }
- assertequal(count, 1, "if true");
-
- count = 0;
- if false {
- count = count + 1;
- }
- assertequal(count, 0, "if false");
-
- count = 0;
- if one := 1; true {
- count = count + one;
- }
- assertequal(count, 1, "if true one");
-
- count = 0;
- if one := 1; false {
- _ = one;
- count = count + 1;
- }
- assertequal(count, 0, "if false one");
-
- count = 0;
- if {
- count = count + 1;
- }
- assertequal(count, 1, "if empty");
-
- count = 0;
- if one := 1; {
- count = count + one;
- }
- assertequal(count, 1, "if empty one");
-
- count = 0;
- if i5 < i7 {
- count = count + 1;
- }
- assertequal(count, 1, "if cond");
-
- count = 0;
- if true {
- count = count + 1;
- } else
- count = count - 1;
- assertequal(count, 1, "if else true");
-
- count = 0;
- if false {
- count = count + 1;
- } else
- count = count - 1;
- assertequal(count, -1, "if else false");
-
- count = 0;
- if t:=1; false {
- count = count + 1;
- t := 7;
- _ = t;
- } else
- count = count - t;
- assertequal(count, -1, "if else false var");
-
- count = 0;
- t := 1;
- if false {
- count = count + 1;
- t := 7;
- _ = t;
- } else
- count = count - t;
- assertequal(count, -1, "if else false var outside");
-}
diff --git a/gcc/testsuite/go.test/test/ken/simpprint.go b/gcc/testsuite/go.test/test/ken/simpprint.go
deleted file mode 100644
index 6077f7eb02..0000000000
--- a/gcc/testsuite/go.test/test/ken/simpprint.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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
-
-func
-main() {
- print("hello world\n");
-}
diff --git a/gcc/testsuite/go.test/test/ken/simpswitch.go b/gcc/testsuite/go.test/test/ken/simpswitch.go
index ab5dd356b3..710af2e08c 100644
--- a/gcc/testsuite/go.test/test/ken/simpswitch.go
+++ b/gcc/testsuite/go.test/test/ken/simpswitch.go
@@ -6,19 +6,21 @@
package main
-func
-main() {
- a := 3;
- for i:=0; i<10; i=i+1 {
- switch(i) {
+func main() {
+ r := ""
+ a := 3
+ for i := 0; i < 10; i = i + 1 {
+ switch i {
case 5:
- print("five");
- case a,7:
- print("a");
+ r += "five"
+ case a, 7:
+ r += "a"
default:
- print(i);
+ r += string(i + '0')
}
- print("out", i);
+ r += "out" + string(i+'0')
+ }
+ if r != "0out01out12out2aout34out4fiveout56out6aout78out89out9" {
+ panic(r)
}
- print("\n");
}
diff --git a/gcc/testsuite/go.test/test/ken/string.go b/gcc/testsuite/go.test/test/ken/string.go
index cbedad4e88..e051082429 100644
--- a/gcc/testsuite/go.test/test/ken/string.go
+++ b/gcc/testsuite/go.test/test/ken/string.go
@@ -1,4 +1,4 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// $G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -71,16 +71,14 @@ func main() {
/* create string with integer constant */
c = string('x')
if c != "x" {
- print("create int ", c)
- panic("fail")
+ panic("create int " + c)
}
/* create string with integer variable */
v := 'x'
c = string(v)
if c != "x" {
- print("create int ", c)
- panic("fail")
+ panic("create int " + c)
}
/* create string with byte array */
@@ -90,19 +88,17 @@ func main() {
z1[2] = 'c'
c = string(z1[0:])
if c != "abc" {
- print("create byte array ", c)
- panic("fail")
+ panic("create byte array " + c)
}
/* create string with int array */
- var z2 [3]int
+ var z2 [3]rune
z2[0] = 'a'
z2[1] = '\u1234'
z2[2] = 'c'
c = string(z2[0:])
if c != "a\u1234c" {
- print("create int array ", c)
- panic("fail")
+ panic("create int array " + c)
}
/* create string with byte array pointer */
@@ -112,7 +108,6 @@ func main() {
z3[2] = 'c'
c = string(z3[0:])
if c != "abc" {
- print("create array pointer ", c)
- panic("fail")
+ panic("create array pointer " + c)
}
}
diff --git a/gcc/testsuite/go.test/test/ken/string.out b/gcc/testsuite/go.test/test/ken/string.out
new file mode 100644
index 0000000000..8bc36bc6f5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/ken/string.out
@@ -0,0 +1 @@
+abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz-abcxyz
diff --git a/gcc/testsuite/go.test/test/label.go b/gcc/testsuite/go.test/test/label.go
new file mode 100644
index 0000000000..e3d853266e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/label.go
@@ -0,0 +1,60 @@
+// errchk $G -e $D/$F.go
+
+// 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.
+
+// Pass 1 label errors.
+
+package main
+
+var x int
+
+func f() {
+L1: // ERROR "label .*L1.* defined and not used"
+ for {
+ }
+L2: // ERROR "label .*L2.* defined and not used"
+ select {
+ }
+L3: // ERROR "label .*L3.* defined and not used"
+ switch {
+ }
+L4: // ERROR "label .*L4.* defined and not used"
+ if true {
+ }
+L5: // ERROR "label .*L5.* defined and not used"
+ f()
+L6: // GCCGO_ERROR "previous"
+ f()
+L6: // ERROR "label .*L6.* already defined"
+ f()
+ if x == 20 {
+ goto L6
+ }
+
+L7:
+ for {
+ break L7
+ }
+
+L8:
+ for {
+ if x == 21 {
+ continue L8
+ }
+ }
+
+L9:
+ switch {
+ case true:
+ break L9
+ defalt: // ERROR "label .*defalt.* defined and not used"
+ }
+
+L10:
+ select {
+ default:
+ break L10
+ }
+}
diff --git a/gcc/testsuite/go.test/test/label1.go b/gcc/testsuite/go.test/test/label1.go
new file mode 100644
index 0000000000..656daaeea5
--- /dev/null
+++ b/gcc/testsuite/go.test/test/label1.go
@@ -0,0 +1,85 @@
+// errchk $G -e $D/$F.go
+
+// 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.
+
+// Pass 2 label errors.
+
+package main
+
+var x int
+
+func f() {
+L1:
+ for {
+ if x == 0 {
+ break L1
+ }
+ if x == 1 {
+ continue L1
+ }
+ goto L1
+ }
+
+L2:
+ select {
+ default:
+ if x == 0 {
+ break L2
+ }
+ if x == 1 {
+ continue L2 // ERROR "invalid continue label .*L2"
+ }
+ goto L2
+ }
+
+L3:
+ switch {
+ case x > 10:
+ if x == 11 {
+ break L3
+ }
+ if x == 12 {
+ continue L3 // ERROR "invalid continue label .*L3"
+ }
+ goto L3
+ }
+
+L4:
+ if true {
+ if x == 13 {
+ break L4 // ERROR "invalid break label .*L4"
+ }
+ if x == 14 {
+ continue L4 // ERROR "invalid continue label .*L4"
+ }
+ if x == 15 {
+ goto L4
+ }
+ }
+
+L5:
+ f()
+ if x == 16 {
+ break L5 // ERROR "invalid break label .*L5"
+ }
+ if x == 17 {
+ continue L5 // ERROR "invalid continue label .*L5"
+ }
+ if x == 18 {
+ goto L5
+ }
+
+ for {
+ if x == 19 {
+ break L1 // ERROR "invalid break label .*L1"
+ }
+ if x == 20 {
+ continue L1 // ERROR "invalid continue label .*L1"
+ }
+ if x == 21 {
+ goto L1
+ }
+ }
+}
diff --git a/gcc/testsuite/go.test/test/malloc1.go b/gcc/testsuite/go.test/test/malloc1.go
deleted file mode 100644
index 146976467b..0000000000
--- a/gcc/testsuite/go.test/test/malloc1.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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.
-
-// trivial malloc test
-
-package main
-
-import (
- "flag"
- "fmt"
- "runtime"
-)
-
-var chatty = flag.Bool("v", false, "chatty")
-
-func main() {
- runtime.Free(runtime.Alloc(1))
- if *chatty {
- fmt.Printf("%+v %v\n", runtime.MemStats, uint64(0))
- }
-}
diff --git a/gcc/testsuite/go.test/test/mallocfin.go b/gcc/testsuite/go.test/test/mallocfin.go
index dc6d74bad6..ff62392473 100644
--- a/gcc/testsuite/go.test/test/mallocfin.go
+++ b/gcc/testsuite/go.test/test/mallocfin.go
@@ -47,18 +47,28 @@ func finalB(b *B) {
nfinal++
}
+func nofinalB(b *B) {
+ panic("nofinalB run")
+}
+
func main() {
runtime.GOMAXPROCS(4)
for i = 0; i < N; i++ {
b := &B{i}
a := &A{b, i}
+ c := new(B)
+ runtime.SetFinalizer(c, nofinalB)
runtime.SetFinalizer(b, finalB)
runtime.SetFinalizer(a, finalA)
+ runtime.SetFinalizer(c, nil)
}
for i := 0; i < N; i++ {
runtime.GC()
runtime.Gosched()
time.Sleep(1e6)
+ if nfinal >= N*8/10 {
+ break
+ }
}
if nfinal < N*8/10 {
println("not enough finalizing:", nfinal, "/", N)
diff --git a/gcc/testsuite/go.test/test/mallocrand.go b/gcc/testsuite/go.test/test/mallocrand.go
deleted file mode 100644
index e6b422e224..0000000000
--- a/gcc/testsuite/go.test/test/mallocrand.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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.
-
-// Random malloc test.
-
-package main
-
-import (
- "flag"
- "rand"
- "runtime"
- "unsafe"
-)
-
-var chatty = flag.Bool("v", false, "chatty")
-
-var footprint uint64
-var allocated uint64
-
-func bigger() {
- if f := runtime.MemStats.Sys; footprint < f {
- footprint = f
- if *chatty {
- println("Footprint", footprint, " for ", allocated)
- }
- if footprint > 1e9 {
- println("too big")
- panic("fail")
- }
- }
-}
-
-// Prime the data structures by allocating one of
-// each block in order. After this, there should be
-// little reason to ask for more memory from the OS.
-func prime() {
- for i := 0; i < 16; i++ {
- b := runtime.Alloc(1 << uint(i))
- runtime.Free(b)
- }
- for i := uintptr(0); i < 256; i++ {
- b := runtime.Alloc(i << 12)
- runtime.Free(b)
- }
-}
-
-func memset(b *byte, c byte, n uintptr) {
- np := uintptr(n)
- for i := uintptr(0); i < np; i++ {
- *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(b)) + i)) = c
- }
-}
-
-func main() {
- flag.Parse()
- // prime()
- var blocks [1]struct {
- base *byte
- siz uintptr
- }
- for i := 0; i < 1<<10; i++ {
- if i%(1<<10) == 0 && *chatty {
- println(i)
- }
- b := rand.Int() % len(blocks)
- if blocks[b].base != nil {
- // println("Free", blocks[b].siz, blocks[b].base)
- runtime.Free(blocks[b].base)
- blocks[b].base = nil
- allocated -= uint64(blocks[b].siz)
- continue
- }
- siz := uintptr(rand.Int() >> (11 + rand.Uint32()%20))
- base := runtime.Alloc(siz)
- // ptr := uintptr(syscall.BytePtr(base))+uintptr(siz/2)
- // obj, size, ref, ok := allocator.find(ptr)
- // if obj != base || *ref != 0 || !ok {
- // println("find", siz, obj, ref, ok)
- // panic("fail")
- // }
- blocks[b].base = base
- blocks[b].siz = siz
- allocated += uint64(siz)
- // println("Alloc", siz, base)
- memset(base, 0xbb, siz)
- bigger()
- }
-}
diff --git a/gcc/testsuite/go.test/test/mallocrep.go b/gcc/testsuite/go.test/test/mallocrep.go
deleted file mode 100644
index 762f3754f5..0000000000
--- a/gcc/testsuite/go.test/test/mallocrep.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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.
-
-// Repeated malloc test.
-
-package main
-
-import (
- "flag"
- "runtime"
-)
-
-var chatty = flag.Bool("v", false, "chatty")
-
-var oldsys uint64
-
-func bigger() {
- if st := runtime.MemStats; oldsys < st.Sys {
- oldsys = st.Sys
- if *chatty {
- println(st.Sys, " system bytes for ", st.Alloc, " Go bytes")
- }
- if st.Sys > 1e9 {
- println("too big")
- panic("fail")
- }
- }
-}
-
-func main() {
- runtime.GC() // clean up garbage from init
- runtime.MemProfileRate = 0 // disable profiler
- runtime.MemStats.Alloc = 0 // ignore stacks
- flag.Parse()
- for i := 0; i < 1<<7; i++ {
- for j := 1; j <= 1<<22; j <<= 1 {
- if i == 0 && *chatty {
- println("First alloc:", j)
- }
- if a := runtime.MemStats.Alloc; a != 0 {
- println("no allocations but stats report", a, "bytes allocated")
- panic("fail")
- }
- b := runtime.Alloc(uintptr(j))
- during := runtime.MemStats.Alloc
- runtime.Free(b)
- if a := runtime.MemStats.Alloc; a != 0 {
- println("allocated ", j, ": wrong stats: during=", during, " after=", a, " (want 0)")
- panic("fail")
- }
- bigger()
- }
- if i%(1<<10) == 0 && *chatty {
- println(i)
- }
- if i == 0 {
- if *chatty {
- println("Primed", i)
- }
- // runtime.frozen = true
- }
- }
-}
diff --git a/gcc/testsuite/go.test/test/mallocrep1.go b/gcc/testsuite/go.test/test/mallocrep1.go
deleted file mode 100644
index eb67bed86b..0000000000
--- a/gcc/testsuite/go.test/test/mallocrep1.go
+++ /dev/null
@@ -1,138 +0,0 @@
-// $G $D/$F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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.
-
-// Repeated malloc test.
-
-package main
-
-import (
- "flag"
- "fmt"
- "runtime"
- "strconv"
-)
-
-var chatty = flag.Bool("v", false, "chatty")
-var reverse = flag.Bool("r", false, "reverse")
-var longtest = flag.Bool("l", false, "long test")
-
-var b []*byte
-var stats = &runtime.MemStats
-
-func OkAmount(size, n uintptr) bool {
- if n < size {
- return false
- }
- if size < 16*8 {
- if n > size+16 {
- return false
- }
- } else {
- if n > size*9/8 {
- return false
- }
- }
- return true
-}
-
-func AllocAndFree(size, count int) {
- if *chatty {
- fmt.Printf("size=%d count=%d ...\n", size, count)
- }
- n1 := stats.Alloc
- for i := 0; i < count; i++ {
- b[i] = runtime.Alloc(uintptr(size))
- base, n := runtime.Lookup(b[i])
- if base != b[i] || !OkAmount(uintptr(size), n) {
- println("lookup failed: got", base, n, "for", b[i])
- panic("fail")
- }
- if runtime.MemStats.Sys > 1e9 {
- println("too much memory allocated")
- panic("fail")
- }
- }
- n2 := stats.Alloc
- if *chatty {
- fmt.Printf("size=%d count=%d stats=%+v\n", size, count, *stats)
- }
- n3 := stats.Alloc
- for j := 0; j < count; j++ {
- i := j
- if *reverse {
- i = count - 1 - j
- }
- alloc := uintptr(stats.Alloc)
- base, n := runtime.Lookup(b[i])
- if base != b[i] || !OkAmount(uintptr(size), n) {
- println("lookup failed: got", base, n, "for", b[i])
- panic("fail")
- }
- runtime.Free(b[i])
- if stats.Alloc != uint64(alloc-n) {
- println("free alloc got", stats.Alloc, "expected", alloc-n, "after free of", n)
- panic("fail")
- }
- if runtime.MemStats.Sys > 1e9 {
- println("too much memory allocated")
- panic("fail")
- }
- }
- n4 := stats.Alloc
-
- if *chatty {
- fmt.Printf("size=%d count=%d stats=%+v\n", size, count, *stats)
- }
- if n2-n1 != n3-n4 {
- println("wrong alloc count: ", n2-n1, n3-n4)
- panic("fail")
- }
-}
-
-func atoi(s string) int {
- i, _ := strconv.Atoi(s)
- return i
-}
-
-func main() {
- runtime.MemProfileRate = 0 // disable profiler
- flag.Parse()
- b = make([]*byte, 10000)
- if flag.NArg() > 0 {
- AllocAndFree(atoi(flag.Arg(0)), atoi(flag.Arg(1)))
- return
- }
- maxb := 1 << 22
- if !*longtest {
- maxb = 1 << 19
- }
- for j := 1; j <= maxb; j <<= 1 {
- n := len(b)
- max := uintptr(1 << 28)
- if !*longtest {
- max = uintptr(maxb)
- }
- if uintptr(j)*uintptr(n) > max {
- n = int(max / uintptr(j))
- }
- if n < 10 {
- n = 10
- }
- for m := 1; m <= n; {
- AllocAndFree(j, m)
- if m == n {
- break
- }
- m = 5 * m / 4
- if m < 4 {
- m++
- }
- if m > n {
- m = n
- }
- }
- }
-}
diff --git a/gcc/testsuite/go.test/test/map1.go b/gcc/testsuite/go.test/test/map1.go
new file mode 100644
index 0000000000..6af10565cd
--- /dev/null
+++ b/gcc/testsuite/go.test/test/map1.go
@@ -0,0 +1,41 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+func main() {}
+
+type v bool
+
+var (
+ // valid
+ _ map[int8]v
+ _ map[uint8]v
+ _ map[int16]v
+ _ map[uint16]v
+ _ map[int32]v
+ _ map[uint32]v
+ _ map[int64]v
+ _ map[uint64]v
+ _ map[int]v
+ _ map[uint]v
+ _ map[uintptr]v
+ _ map[float32]v
+ _ map[float64]v
+ _ map[complex64]v
+ _ map[complex128]v
+ _ map[bool]v
+ _ map[string]v
+ _ map[chan int]v
+ _ map[*int]v
+ _ map[struct{}]v
+ _ map[[10]int]v
+
+ // invalid
+ _ map[[]int]v // ERROR "invalid map key"
+ _ map[func()]v // ERROR "invalid map key"
+ _ map[map[int]int]v // ERROR "invalid map key"
+)
diff --git a/gcc/testsuite/go.test/test/method.go b/gcc/testsuite/go.test/test/method.go
index c751c1f1b5..b5a02c6873 100644
--- a/gcc/testsuite/go.test/test/method.go
+++ b/gcc/testsuite/go.test/test/method.go
@@ -19,7 +19,7 @@ func (s S) val() int { return 1 }
func (s *S1) val() int { return 2 }
func (i I) val() int { return 3 }
func (i *I1) val() int { return 4 }
-//func (t T) val() int { return 7 }
+func (t T) val() int { return 7 }
func (t *T1) val() int { return 8 }
type Val interface {
@@ -34,6 +34,8 @@ func main() {
var i I
var pi *I1
var pt *T1
+ var t T
+ var v Val
if s.val() != 1 {
println("s.val:", s.val())
@@ -75,7 +77,10 @@ func main() {
println("(*I1).val(pi):", (*I1).val(pi))
panic("fail")
}
- // if t.val() != 7 { prinln("t.val:", t.val()); panic("fail") }
+ if t.val() != 7 {
+ println("t.val:", t.val())
+ panic("fail")
+ }
if pt.val() != 8 {
println("pt.val:", pt.val())
panic("fail")
@@ -101,11 +106,22 @@ func main() {
println("pi.val:", val(pi))
panic("fail")
}
- // if val(t) != 7 { println("t.val:", val(t)); panic("fail") }
+ if val(t) != 7 {
+ println("t.val:", val(t))
+ panic("fail")
+ }
if val(pt) != 8 {
println("pt.val:", val(pt))
panic("fail")
}
- // if Val.val(i) != 3 { println("Val.val(i):", Val.val(i)); panic("fail") }
+ if Val.val(i) != 3 {
+ println("Val.val(i):", Val.val(i))
+ panic("fail")
+ }
+ v = i
+ if Val.val(v) != 3 {
+ println("Val.val(v):", Val.val(v))
+ panic("fail")
+ }
}
diff --git a/gcc/testsuite/go.test/test/method2.go b/gcc/testsuite/go.test/test/method2.go
index 3ee0ae1364..039779efbe 100644
--- a/gcc/testsuite/go.test/test/method2.go
+++ b/gcc/testsuite/go.test/test/method2.go
@@ -6,9 +6,28 @@
package main
-type T struct {a int}
+type T struct {
+ a int
+}
type P *T
type P1 *T
-func (p P) val() int { return 1 } // ERROR "receiver"
-func (p *P1) val() int { return 1 } // ERROR "receiver"
+func (p P) val() int { return 1 } // ERROR "receiver.* pointer|invalid pointer or interface receiver"
+func (p *P1) val() int { return 1 } // ERROR "receiver.* pointer|invalid pointer or interface receiver"
+
+type I interface{}
+type I1 interface{}
+
+func (p I) val() int { return 1 } // ERROR "receiver.*interface|invalid pointer or interface receiver"
+func (p *I1) val() int { return 1 } // ERROR "receiver.*interface|invalid pointer or interface receiver"
+
+type Val interface {
+ val() int
+}
+
+var _ = (*Val).val // ERROR "method"
+
+var v Val
+var pv = &v
+
+var _ = pv.val() // ERROR "method"
diff --git a/gcc/testsuite/go.test/test/named1.go b/gcc/testsuite/go.test/test/named1.go
index 600e502f9e..561d84a43d 100644
--- a/gcc/testsuite/go.test/test/named1.go
+++ b/gcc/testsuite/go.test/test/named1.go
@@ -37,18 +37,10 @@ func main() {
asBool(true)
asBool(*&b)
asBool(Bool(true))
- asBool(1 != 2) // ERROR "cannot use.*type bool.*as type Bool"
- asBool(i < j) // ERROR "cannot use.*type bool.*as type Bool"
+ asBool(1 != 2) // ok now
+ asBool(i < j) // ok now
_, b = m[2] // ERROR "cannot .* bool.*type Bool"
- m[2] = 1, b // ERROR "cannot use.*type Bool.*as type bool"
-
- b = c <- 1 // ERROR "cannot use.*type bool.*type Bool"
- _ = b
- asBool(c <- 1) // ERROR "cannot use.*type bool.*as type Bool"
-
- _, b = <-c // ERROR "cannot .* bool.*type Bool"
- _ = b
var inter interface{}
_, b = inter.(Map) // ERROR "cannot .* bool.*type Bool"
@@ -60,9 +52,10 @@ func main() {
_, b = minter.(Map) // ERROR "cannot .* bool.*type Bool"
_ = b
- asBool(closed(c)) // ERROR "cannot use.*type bool.*as type Bool"
- b = closed(c) // ERROR "cannot use.*type bool.*type Bool"
+ _, bb := <-c
+ asBool(bb) // ERROR "cannot use.*type bool.*as type Bool"
+ _, b = <-c // ERROR "cannot .* bool.*type Bool"
_ = b
- asString(String(slice)) // ERROR "cannot .*type Slice.*type String"
+ asString(String(slice)) // ok
}
diff --git a/gcc/testsuite/go.test/test/nil.go b/gcc/testsuite/go.test/test/nil.go
index 4f4c755276..efcf4f7822 100644
--- a/gcc/testsuite/go.test/test/nil.go
+++ b/gcc/testsuite/go.test/test/nil.go
@@ -6,6 +6,11 @@
package main
+import (
+ "fmt"
+ "time"
+)
+
type T struct {
i int
}
@@ -33,4 +38,141 @@ func main() {
ta[0] = nil
_, _, _, _, _, _, _, _ = i, f, s, m, c, t, in, ta
+
+ arraytest()
+ chantest()
+ maptest()
+ slicetest()
+}
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("not panicking")
+ }
+ }()
+ f()
+}
+
+func shouldBlock(f func()) {
+ go func() {
+ f()
+ panic("did not block")
+ }()
+ time.Sleep(1e7)
+}
+
+// nil array pointer
+
+func arraytest() {
+ var p *[10]int
+
+ // Looping over indices is fine.
+ s := 0
+ for i := range p {
+ s += i
+ }
+ if s != 45 {
+ panic(s)
+ }
+
+ s = 0
+ for i := 0; i < len(p); i++ {
+ s += i
+ }
+ if s != 45 {
+ panic(s)
+ }
+
+ // Looping over values is not.
+ shouldPanic(func() {
+ for i, v := range p {
+ s += i + v
+ }
+ })
+
+ shouldPanic(func() {
+ for i := 0; i < len(p); i++ {
+ s += p[i]
+ }
+ })
+}
+
+// nil channel
+// select tests already handle select on nil channel
+
+func chantest() {
+ var ch chan int
+
+ // nil channel is never ready
+ shouldBlock(func() {
+ ch <- 1
+ })
+ shouldBlock(func() {
+ <-ch
+ })
+ shouldBlock(func() {
+ x, ok := <-ch
+ println(x, ok)
+ })
+
+ if len(ch) != 0 {
+ panic(len(ch))
+ }
+ if cap(ch) != 0 {
+ panic(cap(ch))
+ }
+}
+
+// nil map
+
+func maptest() {
+ var m map[int]int
+
+ // nil map appears empty
+ if len(m) != 0 {
+ panic(len(m))
+ }
+ if m[1] != 0 {
+ panic(m[1])
+ }
+ if x, ok := m[1]; x != 0 || ok {
+ panic(fmt.Sprint(x, ok))
+ }
+
+ for k, v := range m {
+ panic(k)
+ panic(v)
+ }
+
+ // but cannot be written to
+ shouldPanic(func() {
+ m[2] = 3
+ })
+ shouldPanic(func() {
+ delete(m, 2)
+ })
+}
+
+// nil slice
+
+func slicetest() {
+ var x []int
+
+ // nil slice is just a 0-element slice.
+ if len(x) != 0 {
+ panic(len(x))
+ }
+ if cap(x) != 0 {
+ panic(cap(x))
+ }
+
+ // no 0-element slices can be read from or written to
+ var s int
+ shouldPanic(func() {
+ s += x[1]
+ })
+ shouldPanic(func() {
+ x[2] = s
+ })
}
diff --git a/gcc/testsuite/go.test/test/nilptr.go b/gcc/testsuite/go.test/test/nilptr.go
new file mode 100644
index 0000000000..b0c1df2d95
--- /dev/null
+++ b/gcc/testsuite/go.test/test/nilptr.go
@@ -0,0 +1,129 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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 main
+
+import "unsafe"
+
+// Having a big address space means that indexing
+// at a 256 MB offset from a nil pointer might not
+// cause a memory access fault. This test checks
+// that Go is doing the correct explicit checks to catch
+// these nil pointer accesses, not just relying on the hardware.
+var dummy [256 << 20]byte // give us a big address space
+
+func main() {
+ // the test only tests what we intend to test
+ // if dummy starts in the first 256 MB of memory.
+ // otherwise there might not be anything mapped
+ // at the address that might be accidentally
+ // dereferenced below.
+ if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
+ panic("dummy too far out")
+ }
+
+ shouldPanic(p1)
+ shouldPanic(p2)
+ shouldPanic(p3)
+ shouldPanic(p4)
+ shouldPanic(p5)
+ shouldPanic(p6)
+ shouldPanic(p7)
+ shouldPanic(p8)
+ shouldPanic(p9)
+ shouldPanic(p10)
+}
+
+func shouldPanic(f func()) {
+ defer func() {
+ if recover() == nil {
+ panic("memory reference did not panic")
+ }
+ }()
+ f()
+}
+
+func p1() {
+ // Array index.
+ var p *[1 << 30]byte = nil
+ println(p[256<<20]) // very likely to be inside dummy, but should panic
+}
+
+var xb byte
+
+func p2() {
+ var p *[1 << 30]byte = nil
+ xb = 123
+
+ // Array index.
+ println(p[uintptr(unsafe.Pointer(&xb))]) // should panic
+}
+
+func p3() {
+ // Array to slice.
+ var p *[1 << 30]byte = nil
+ var x []byte = p[0:] // should panic
+ _ = x
+}
+
+var q *[1 << 30]byte
+
+func p4() {
+ // Array to slice.
+ var x []byte
+ var y = &x
+ *y = q[0:] // should crash (uses arraytoslice runtime routine)
+}
+
+func fb([]byte) {
+ panic("unreachable")
+}
+
+func p5() {
+ // Array to slice.
+ var p *[1 << 30]byte = nil
+ fb(p[0:]) // should crash
+}
+
+func p6() {
+ // Array to slice.
+ var p *[1 << 30]byte = nil
+ var _ []byte = p[10 : len(p)-10] // should crash
+}
+
+type T struct {
+ x [256 << 20]byte
+ i int
+}
+
+func f() *T {
+ return nil
+}
+
+var y *T
+var x = &y
+
+func p7() {
+ // Struct field access with large offset.
+ println(f().i) // should crash
+}
+
+func p8() {
+ // Struct field access with large offset.
+ println((*x).i) // should crash
+}
+
+func p9() {
+ // Struct field access with large offset.
+ var t *T
+ println(&t.i) // should crash
+}
+
+func p10() {
+ // Struct field access with large offset.
+ var t *T
+ println(t.i) // should crash
+}
diff --git a/gcc/testsuite/go.test/test/nilptr/arrayindex.go b/gcc/testsuite/go.test/test/nilptr/arrayindex.go
deleted file mode 100644
index c564bce340..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/arrayindex.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var x byte
-
-func main() {
- var p *[1<<30]byte = nil
- x = 123
-
- // The problem here is not the use of unsafe:
- // it is that indexing into p[] with a large
- // enough index jumps out of the unmapped section
- // at the beginning of memory and into valid memory.
- // Pointer offsets and array indices, if they are
- // very large, need to dereference the base pointer
- // to trigger a trap.
- println(p[uintptr(unsafe.Pointer(&x))]) // should crash
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/arrayindex1.go b/gcc/testsuite/go.test/test/nilptr/arrayindex1.go
deleted file mode 100644
index 701630ed15..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/arrayindex1.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into p[] with a large
- // enough index jumps out of the unmapped section
- // at the beginning of memory and into valid memory.
- // Pointer offsets and array indices, if they are
- // very large, need to dereference the base pointer
- // to trigger a trap.
- var p *[1<<30]byte = nil
- println(p[256<<20]) // very likely to be inside dummy, but should crash
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/arraytoslice.go b/gcc/testsuite/go.test/test/nilptr/arraytoslice.go
deleted file mode 100644
index 38206d50b8..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/arraytoslice.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-func f([]byte) {
- panic("unreachable")
-}
-
-var dummy [512<<20]byte // give us a big address space
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into p[] with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- //
- // To avoid needing a check on every slice beyond the
- // usual len and cap, we require the *array -> slice
- // conversion to do the check.
- var p *[1<<30]byte = nil
- f(p[0:]) // should crash
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/arraytoslice1.go b/gcc/testsuite/go.test/test/nilptr/arraytoslice1.go
deleted file mode 100644
index 8c9531e176..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/arraytoslice1.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into p[] with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- //
- // To avoid needing a check on every slice beyond the
- // usual len and cap, we require the *array -> slice
- // conversion to do the check.
- var p *[1<<30]byte = nil
- var x []byte = p[0:] // should crash
- _ = x
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/arraytoslice2.go b/gcc/testsuite/go.test/test/nilptr/arraytoslice2.go
deleted file mode 100644
index 1b2651381e..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/arraytoslice2.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-var q *[1<<30]byte
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into p[] with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- //
- // To avoid needing a check on every slice beyond the
- // usual len and cap, we require the *array -> slice
- // conversion to do the check.
- var x []byte
- var y = &x
- *y = q[0:] // should crash (uses arraytoslice runtime routine)
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/slicearray.go b/gcc/testsuite/go.test/test/nilptr/slicearray.go
deleted file mode 100644
index 544536cc7c..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/slicearray.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into p[] with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- //
- // To avoid needing a check on every slice beyond the
- // usual len and cap, we require the slice operation
- // to do the check.
- var p *[1<<30]byte = nil
- var _ []byte = p[10:len(p)-10] // should crash
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/structfield.go b/gcc/testsuite/go.test/test/nilptr/structfield.go
deleted file mode 100644
index e081f7a171..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/structfield.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-type T struct {
- x [256<<20] byte
- i int
-}
-
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into t with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- // We require the pointer dereference to check.
- var t *T
- println(t.i) // should crash
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/structfield1.go b/gcc/testsuite/go.test/test/nilptr/structfield1.go
deleted file mode 100644
index 02d33a42c2..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/structfield1.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-type T struct {
- x [256<<20] byte
- i int
-}
-
-func f() *T {
- return nil
-}
-
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into t with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- // We require the pointer dereference to check.
- println(f().i) // should crash
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/structfield2.go b/gcc/testsuite/go.test/test/nilptr/structfield2.go
deleted file mode 100644
index 4323b42b4d..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/structfield2.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-type T struct {
- x [256<<20] byte
- i int
-}
-
-var y *T
-var x = &y
-
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into t with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- // We require the pointer dereference to check.
- println((*x).i) // should crash
-}
diff --git a/gcc/testsuite/go.test/test/nilptr/structfieldaddr.go b/gcc/testsuite/go.test/test/nilptr/structfieldaddr.go
deleted file mode 100644
index 81551aa3ba..0000000000
--- a/gcc/testsuite/go.test/test/nilptr/structfieldaddr.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// [ $GOOS != nacl ] || exit 0 # do not bother on NaCl
-// $G $D/$F.go && $L $F.$A &&
-// ((! sh -c ./$A.out) >/dev/null 2>&1 || echo BUG: should fail)
-
-// Copyright 2009 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 "unsafe"
-
-var dummy [512<<20]byte // give us a big address space
-type T struct {
- x [256<<20] byte
- i int
-}
-
-func main() {
- // the test only tests what we intend to test
- // if dummy starts in the first 256 MB of memory.
- // otherwise there might not be anything mapped
- // at the address that might be accidentally
- // dereferenced below.
- if uintptr(unsafe.Pointer(&dummy)) > 256<<20 {
- panic("dummy too far out")
- }
-
- // The problem here is that indexing into t with a large
- // enough index can jump out of the unmapped section
- // at the beginning of memory and into valid memory.
- // We require the address calculation to check.
- var t *T
- println(&t.i) // should crash
-}
diff --git a/gcc/testsuite/go.test/test/nul1.go b/gcc/testsuite/go.test/test/nul1.go
index 9d6974f818..142d4deb1f 100644
--- a/gcc/testsuite/go.test/test/nul1.go
+++ b/gcc/testsuite/go.test/test/nul1.go
@@ -1,4 +1,3 @@
-// [ $GOOS != nacl ] || exit 0 # NaCl runner elides NUL in output
// [ "$GORUN" == "" ] || exit 0 # Android runner gets confused by the NUL output
// $G $D/$F.go && $L $F.$A && ./$A.out >tmp.go &&
// errchk $G -e tmp.go
@@ -40,7 +39,7 @@ var y = ` + "`in raw string \x00 foo`" + ` // ERROR "NUL"
/* in other comment ` + "\x00" + ` */ // ERROR "NUL"
-/* in source code */ ` + "\x00" + `// ERROR "NUL"
+/* in source code */ ` + "\x00" + `// ERROR "NUL" "illegal character"
var xx = "in string ` + "\xc2\xff" + `" // ERROR "UTF-8"
@@ -51,9 +50,9 @@ var yy = ` + "`in raw string \xff foo`" + ` // ERROR "UTF-8"
/* in other comment ` + "\xe0\x00\x00" + ` */ // ERROR "UTF-8|NUL"
/* in variable name */
-var z` + "\xc1\x81" + ` int // ERROR "UTF-8"
+var z` + "\xc1\x81" + ` int // ERROR "UTF-8" "invalid identifier character"
-/* in source code */ ` + "\xc2A" + `// ERROR "UTF-8"
+/* in source code */ ` + "var \xc2A int" + `// ERROR "UTF-8" "invalid identifier character"
`)
}
diff --git a/gcc/testsuite/go.test/test/peano.go b/gcc/testsuite/go.test/test/peano.go
index f4c59d1e1a..dd4c36e0b4 100644
--- a/gcc/testsuite/go.test/test/peano.go
+++ b/gcc/testsuite/go.test/test/peano.go
@@ -8,7 +8,6 @@ package main
type Number *Number
-
// -------------------------------------
// Peano primitives
@@ -16,24 +15,20 @@ func zero() *Number {
return nil
}
-
func is_zero(x *Number) bool {
return x == nil
}
-
func add1(x *Number) *Number {
e := new(Number)
*e = x
return e
}
-
func sub1(x *Number) *Number {
return *x
}
-
func add(x, y *Number) *Number {
if is_zero(y) {
return x
@@ -42,7 +37,6 @@ func add(x, y *Number) *Number {
return add(add1(x), sub1(y))
}
-
func mul(x, y *Number) *Number {
if is_zero(x) || is_zero(y) {
return zero()
@@ -51,7 +45,6 @@ func mul(x, y *Number) *Number {
return add(mul(x, sub1(y)), x)
}
-
func fact(n *Number) *Number {
if is_zero(n) {
return add1(zero())
@@ -60,7 +53,6 @@ func fact(n *Number) *Number {
return mul(fact(sub1(n)), n)
}
-
// -------------------------------------
// Helpers to generate/count Peano integers
@@ -72,7 +64,6 @@ func gen(n int) *Number {
return zero()
}
-
func count(x *Number) int {
if is_zero(x) {
return 0
@@ -81,7 +72,6 @@ func count(x *Number) int {
return count(sub1(x)) + 1
}
-
func check(x *Number, expected int) {
var c = count(x)
if c != expected {
@@ -90,7 +80,6 @@ func check(x *Number, expected int) {
}
}
-
// -------------------------------------
// Test basic functionality
@@ -115,12 +104,19 @@ func init() {
check(fact(gen(5)), 120)
}
-
// -------------------------------------
// Factorial
+var results = [...]int{
+ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
+ 39916800, 479001600,
+}
+
func main() {
for i := 0; i <= 9; i++ {
- print(i, "! = ", count(fact(gen(i))), "\n")
+ if f := count(fact(gen(i))); f != results[i] {
+ println("FAIL:", i, "!:", f, "!=", results[i])
+ panic(0)
+ }
}
}
diff --git a/gcc/testsuite/go.test/test/printbig.go b/gcc/testsuite/go.test/test/printbig.go
index bbb707004f..d867bdc646 100644
--- a/gcc/testsuite/go.test/test/printbig.go
+++ b/gcc/testsuite/go.test/test/printbig.go
@@ -1,4 +1,4 @@
-// $G $F.go && $L $F.$A && ./$A.out
+// $G $F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
diff --git a/gcc/testsuite/go.test/test/printbig.out b/gcc/testsuite/go.test/test/printbig.out
new file mode 100644
index 0000000000..6a16b15d98
--- /dev/null
+++ b/gcc/testsuite/go.test/test/printbig.out
@@ -0,0 +1,2 @@
+-9223372036854775808
+9223372036854775807
diff --git a/gcc/testsuite/go.test/test/range.go b/gcc/testsuite/go.test/test/range.go
index 91ccd6307a..84119450b2 100644
--- a/gcc/testsuite/go.test/test/range.go
+++ b/gcc/testsuite/go.test/test/range.go
@@ -172,7 +172,7 @@ func makestring() string {
}
func teststring() {
- s := 0
+ var s rune
nmake = 0
for _, v := range makestring() {
s += v
@@ -208,7 +208,7 @@ func teststring1() {
func makemap() map[int]int {
nmake++
- return map[int]int{0:'a', 1:'b', 2:'c', 3:'d', 4:'☺'}
+ return map[int]int{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: '☺'}
}
func testmap() {
diff --git a/gcc/testsuite/go.test/test/recover2.go b/gcc/testsuite/go.test/test/recover2.go
index 9affe25d47..b5db6f0d1c 100644
--- a/gcc/testsuite/go.test/test/recover2.go
+++ b/gcc/testsuite/go.test/test/recover2.go
@@ -11,10 +11,7 @@
package main
-import (
- "os"
- "strings"
-)
+import "strings"
var x = make([]byte, 10)
@@ -33,7 +30,7 @@ func mustRecover(s string) {
if v == nil {
panic("expected panic")
}
- if e := v.(os.Error).String(); strings.Index(e, s) < 0 {
+ if e := v.(error).Error(); strings.Index(e, s) < 0 {
panic("want: " + s + "; have: " + e)
}
}
@@ -63,6 +60,7 @@ func test4() {
type T struct {
a, b int
+ c []int
}
func test5() {
diff --git a/gcc/testsuite/go.test/test/recover3.go b/gcc/testsuite/go.test/test/recover3.go
index b982ec8fa5..60ade9b61c 100644
--- a/gcc/testsuite/go.test/test/recover3.go
+++ b/gcc/testsuite/go.test/test/recover3.go
@@ -1,4 +1,3 @@
-// [ $GOOS != nacl ] || exit 0 # NaCl cannot recover from signals
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2010 The Go Authors. All rights reserved.
@@ -10,7 +9,6 @@ package main
import (
"runtime"
"strings"
- "syscall"
)
var didbug bool
@@ -37,14 +35,14 @@ func check(name string, f func(), err string) {
println(name, "panicked but not with runtime.Error")
return
}
- s := runt.String()
+ s := runt.Error()
if strings.Index(s, err) < 0 {
bug()
println(name, "panicked with", s, "not", err)
return
}
}()
-
+
f()
}
@@ -55,11 +53,8 @@ func main() {
var q *[10000]int
var i int
- // not catching divide by zero on the arm. is that even possible?
- if syscall.ARCH != "arm" {
- check("int-div-zero", func() { println(1/x) }, "integer divide by zero")
- check("int64-div-zero", func() { println(1/x64) }, "integer divide by zero")
- }
+ check("int-div-zero", func() { println(1 / x) }, "integer divide by zero")
+ check("int64-div-zero", func() { println(1 / x64) }, "integer divide by zero")
check("nil-deref", func() { println(p[0]) }, "nil pointer dereference")
check("nil-deref-1", func() { println(p[1]) }, "nil pointer dereference")
@@ -69,11 +64,13 @@ func main() {
var sl []int
check("array-bounds", func() { println(p[i]) }, "index out of range")
check("slice-bounds", func() { println(sl[i]) }, "index out of range")
-
+
var inter interface{}
inter = 1
check("type-concrete", func() { println(inter.(string)) }, "int, not string")
check("type-interface", func() { println(inter.(m)) }, "missing method m")
}
-type m interface{ m() }
+type m interface {
+ m()
+}
diff --git a/gcc/testsuite/go.test/test/rename1.go b/gcc/testsuite/go.test/test/rename1.go
index f239999986..3e78bfca0b 100644
--- a/gcc/testsuite/go.test/test/rename1.go
+++ b/gcc/testsuite/go.test/test/rename1.go
@@ -10,7 +10,7 @@ func main() {
var n byte // ERROR "not a type|expected type"
var y = float(0) // ERROR "cannot call|expected function"
const (
- a = 1 + iota // ERROR "string|incompatible types"
+ a = 1 + iota // ERROR "string|incompatible types" "convert iota"
)
}
diff --git a/gcc/testsuite/go.test/test/reorder.go b/gcc/testsuite/go.test/test/reorder.go
new file mode 100644
index 0000000000..67d07523b4
--- /dev/null
+++ b/gcc/testsuite/go.test/test/reorder.go
@@ -0,0 +1,121 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// Check reordering of assignments.
+
+package main
+
+import "fmt"
+
+func main() {
+ p1()
+ p2()
+ p3()
+ p4()
+ p5()
+ p6()
+ p7()
+ p8()
+}
+
+var gx []int
+
+func f(i int) int {
+ return gx[i]
+}
+
+func check(x []int, x0, x1, x2 int) {
+ if x[0] != x0 || x[1] != x1 || x[2] != x2 {
+ fmt.Printf("%v, want %d,%d,%d\n", x, x0, x1, x2)
+ panic("failed")
+ }
+}
+
+func check3(x, y, z, xx, yy, zz int) {
+ if x != xx || y != yy || z != zz {
+ fmt.Printf("%d,%d,%d, want %d,%d,%d\n", x, y, z, xx, yy, zz)
+ panic("failed")
+ }
+}
+
+func p1() {
+ x := []int{1,2,3}
+ i := 0
+ i, x[i] = 1, 100
+ _ = i
+ check(x, 100, 2, 3)
+}
+
+func p2() {
+ x := []int{1,2,3}
+ i := 0
+ x[i], i = 100, 1
+ _ = i
+ check(x, 100, 2, 3)
+}
+
+func p3() {
+ x := []int{1,2,3}
+ y := x
+ gx = x
+ x[1], y[0] = f(0), f(1)
+ check(x, 2, 1, 3)
+}
+
+func p4() {
+ x := []int{1,2,3}
+ y := x
+ gx = x
+ x[1], y[0] = gx[0], gx[1]
+ check(x, 2, 1, 3)
+}
+
+func p5() {
+ x := []int{1,2,3}
+ y := x
+ p := &x[0]
+ q := &x[1]
+ *p, *q = x[1], y[0]
+ check(x, 2, 1, 3)
+}
+
+func p6() {
+ x := 1
+ y := 2
+ z := 3
+ px := &x
+ py := &y
+ *px, *py = y, x
+ check3(x, y, z, 2, 1, 3)
+}
+
+func f1(x, y, z int) (xx, yy, zz int) {
+ return x, y, z
+}
+
+func f2() (x, y, z int) {
+ return f1(2, 1, 3)
+}
+
+func p7() {
+ x, y, z := f2()
+ check3(x, y, z, 2, 1, 3)
+}
+
+func p8() {
+ x := []int{1,2,3}
+
+ defer func() {
+ err := recover()
+ if err == nil {
+ panic("not panicking")
+ }
+ check(x, 100, 2, 3)
+ }()
+
+ i := 0
+ i, x[i], x[5] = 1, 100, 500
+}
diff --git a/gcc/testsuite/go.test/test/run b/gcc/testsuite/go.test/test/run
index 4ca7754140..03c91ee30e 100755
--- a/gcc/testsuite/go.test/test/run
+++ b/gcc/testsuite/go.test/test/run
@@ -5,6 +5,8 @@
eval $(gomake --no-print-directory -f ../src/Make.inc go-env)
+export E=
+
case X"$GOARCH" in
Xamd64)
export A=6
@@ -14,19 +16,14 @@ X386)
;;
Xarm)
export A=5
- export E=${GORUN:-qemu-arm -cpu cortex-a8}
+ export E="$GORUN"
;;
*)
echo 1>&2 run: unsupported '$GOARCH'
exit 1
esac
-case X"$GOOS" in
-Xnacl)
- export E=${GORUN:-$GOROOT/misc/nacl/naclrun}
-esac
-
-export G=${A}g
+export G="${A}g ${GCFLAGS}"
export L=${A}l
export GOTRACEBACK=0
export LANG=C
@@ -34,11 +31,11 @@ unset GREP_OPTIONS # in case user has a non-standard set
failed=0
-PATH=/bin:/usr/bin:/usr/local/bin:${GOBIN:-$GOROOT/bin}:`pwd`
+PATH=${GOBIN:-$GOROOT/bin}:`pwd`:/bin:/usr/bin:/usr/local/bin
-RUNFILE=/tmp/gorun-$$-$USER
-TMP1FILE=/tmp/gotest1-$$-$USER
-TMP2FILE=/tmp/gotest2-$$-$USER
+RUNFILE="/tmp/gorun-$$-$USER"
+TMP1FILE="/tmp/gotest1-$$-$USER"
+TMP2FILE="/tmp/gotest2-$$-$USER"
# don't run the machine out of memory: limit individual processes to 4GB.
# on thresher, 3GB suffices to run the tests; with 2GB, peano fails.
@@ -49,28 +46,38 @@ ulimit -c 0
true >pass.out >times.out
-for dir in . ken chan interface nilptr syntax fixedbugs bugs
+exclude=false # exclude nothing
+golden=golden.out
+
+filterout() {
+ grep '^'"$2"'$' $1 >/dev/null
+}
+
+for dir in . ken chan interface syntax dwarf fixedbugs bugs
do
echo
echo '==' $dir'/'
for i in $(ls $dir/*.go 2>/dev/null)
- do
+ do (
+ if $exclude $i; then
+ exit 0 # continues for loop
+ fi
export F=$(basename $i .go)
export D=$dir
- sed '/^\/\//!q' $i | sed 's@//@@; $d' |sed 's|./\$A.out|$E &|' >$RUNFILE
- if ! { time -p bash -c "bash $RUNFILE >$TMP1FILE 2>&1" ; } 2>$TMP2FILE
+ sed '/^\/\//!q' $i | sed 's@//@@; $d' |sed 's|./\$A.out|$E &|g' >"$RUNFILE"
+ if ! { time -p bash -c "bash '$RUNFILE' >'$TMP1FILE' 2>&1" ; } 2>"$TMP2FILE"
then
echo
echo "===========" $i
- cat $TMP1FILE
+ cat "$TMP1FILE"
echo >&2 fail: $i
echo "# $i # fail" >>pass.out
- elif test -s $TMP1FILE
+ elif test -s "$TMP1FILE"
then
echo
echo "===========" $i
- cat $TMP1FILE
- if grep -q '^BUG' $TMP1FILE
+ cat "$TMP1FILE"
+ if grep -q '^BUG' "$TMP1FILE"
then
if [ $dir != bugs ]
then
@@ -86,12 +93,13 @@ do
else
echo $i >>pass.out
fi
- echo $(awk 'NR==1{print $2}' $TMP2FILE) $D/$F >>times.out
- done
+ echo $(awk 'NR==1{print $2}' "$TMP2FILE") $D/$F >>times.out
+ rm -f $F.$A $A.out
+ ) done
done | # clean up some stack noise
egrep -v '^(r[0-9a-z]+|[cfg]s) +0x' |
sed '/tmp.*Bus error/s/.*Bus/Bus/; /tmp.*Trace.BPT/s/.*Trace/Trace/
- s!'$RUNFILE'!$RUNFILE!g
+ s!'"$RUNFILE"'!$RUNFILE!g
s/^PC=0x[0-9a-f]*/pc: xxx/
s/^pc: 0x[0-9a-f]*/pc: xxx/
s/PC=0x[0-9a-f]*/PC=xxx/
@@ -102,9 +110,9 @@ done | # clean up some stack noise
/Segmentation fault/d
/^qemu: uncaught target signal 11 (Segmentation fault) - exiting/d' > run.out
-rm -f $RUNFILE $TMP1FILE $TMP2FILE *.$A *.a $A.out
+rm -f "$RUNFILE" "$TMP1FILE" "$TMP2FILE" *.$A *.a $A.out
diffmsg=""
-if ! diff golden.out run.out
+if ! diff $golden run.out
then
diffmsg="; test output differs"
failed=1
diff --git a/gcc/testsuite/go.test/test/run-arm b/gcc/testsuite/go.test/test/run-arm
deleted file mode 100755
index a62df10ca4..0000000000
--- a/gcc/testsuite/go.test/test/run-arm
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/bin/sh
-# Copyright 2009 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.
-
-export E=""
-case X"$GOARCH" in
-Xamd64)
- export A=6
- ;;
-X386)
- export A=8
- ;;
-Xarm)
- export A=5
- export E="${GORUN:-qemu-arm -cpu cortex-a8}"
- ;;
-*)
- echo 1>&2 run: unsupported '$GOARCH'
- exit 1
-esac
-
-export G=${A}g
-export L=${A}l
-export GOTRACEBACK=0
-
-PATH=/bin:/usr/bin:/usr/local/bin:${GOBIN:-$GOROOT/bin}:`pwd`
-
-RUNFILE=/tmp/gorun-$$-$USER
-TMP1FILE=/tmp/gotest1-$$-$USER
-TMP2FILE=/tmp/gotest2-$$-$USER
-FAILEDFILE=/tmp/gotest3-$$-$USER
-
-# don't run the machine out of memory: limit individual processes to 4GB.
-# on thresher, 3GB suffices to run the tests; with 2GB, peano fails.
-ulimit -v 4000000
-
-# no core files please
-ulimit -c 0
-
-true >times.out
-
-# TODO(kaib): figure out why the GC makes things so utterly slow.
-export GOGC=off
-export GOTRACEBACK=0
-
-for i in $(cat arm-pass.txt | sed 's/#.*//')
-do
- export F=$(basename $i .go)
- dir=$(dirname $i)
- export D=$dir
- sed '/^\/\//!q' $i | sed 's@//@@; $d' |sed 's|./\$A.out|$E &|' >$RUNFILE
- if ! { time -p bash -c "bash $RUNFILE >$TMP1FILE 2>&1" ; } 2>$TMP2FILE
- then
- echo
- echo "===========" $i
- cat $TMP1FILE
- echo >&2 fail: $i
- touch $FAILEDFILE
- elif test -s $TMP1FILE
- then
- echo
- echo "===========" $i
- cat $TMP1FILE
- elif [ $dir = "bugs" ]
- then
- echo $i succeeded with no output.
- fi
- echo $(awk 'NR==1{print $2}' $TMP2FILE) $D/$F >>times.out
-done | # clean up some stack noise
- egrep -v '^(r[0-9a-z]+|[cfg]s) +0x' |
- sed '/tmp.*Bus error/s/.*Bus/Bus/; /tmp.*Trace.BPT/s/.*Trace/Trace/
- s!'$RUNFILE'!$RUNFILE!g
- s/ PC=0x[0-9a-f]*/ PC=xxx/
- s/^pc: 0x[0-9a-f]*/pc: xxx/
- /^Trace\/breakpoint trap/d
- /^Trace\/BPT trap/d
- s!'$GOROOT'!$GOROOT!g
- /Segmentation fault/d
- /RUNFILE/ s/line 1: *[0-9]*/line 1: PID/
- /^\$RUNFILE: line 1: PID Trace\/breakpoint trap/d
- /^qemu: uncaught target signal 11 (Segmentation fault) - exiting/d' > run.out
-
-failed=0
-rm -f $RUNFILE $TMP1FILE $TMP2FILE *.$A $A.out
-diffmsg=""
-if ! diff -b golden-arm.out run.out
-then
- diffmsg="; test output differs"
- failed=1
-fi
-
-notinbugs=$(sed '/== bugs/q' run.out | grep -c '^BUG')
-inbugs=$(sed '1,/== bugs/d' run.out | grep -c '^BUG')
-
-echo 2>&1 $inbugs known bugs';' $notinbugs unexpected bugs$diffmsg
-
-if [ "$failed" != "0" ]; then
- echo FAILED
-fi
-
-exit $failed
diff --git a/gcc/testsuite/go.test/test/rune.go b/gcc/testsuite/go.test/test/rune.go
new file mode 100644
index 0000000000..3386972b6d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/rune.go
@@ -0,0 +1,44 @@
+// $G $D/$F.go
+
+// 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 main
+
+var (
+ r0 = 'a'
+ r1 = 'a'+1
+ r2 = 1+'a'
+ r3 = 'a'*2
+ r4 = 'a'/2
+ r5 = 'a'<<1
+ r6 = 'b'<<2
+ r7 int32
+
+ r = []rune{r0, r1, r2, r3, r4, r5, r6, r7}
+)
+
+var (
+ f0 = 1.2
+ f1 = 1.2/'a'
+
+ f = []float64{f0, f1}
+)
+
+var (
+ i0 = 1
+ i1 = 1<<'\x01'
+
+ i = []int{i0, i1}
+)
+
+const (
+ maxRune = '\U0010FFFF'
+)
+
+var (
+ b0 = maxRune < r0
+
+ b = []bool{b0}
+)
diff --git a/gcc/testsuite/go.test/test/shift1.go b/gcc/testsuite/go.test/test/shift1.go
new file mode 100644
index 0000000000..c197eef66e
--- /dev/null
+++ b/gcc/testsuite/go.test/test/shift1.go
@@ -0,0 +1,36 @@
+// errchk $G -e $D/$F.go
+
+// 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.
+
+// Issue 1708, illegal cases.
+
+package p
+
+func f(x int) int { return 0 }
+func g(x interface{}) int { return 0 }
+func h(x float64) int { return 0 }
+
+// from the spec
+var (
+ s uint = 33
+ u = 1.0 << s // ERROR "invalid operation|shift of non-integer operand"
+ v float32 = 1 << s // ERROR "invalid" "as type float32"
+)
+
+// non-constant shift expressions
+var (
+ e1 = g(2.0 << s) // ERROR "invalid" "as type interface"
+ f1 = h(2 << s) // ERROR "invalid" "as type float64"
+ g1 int64 = 1.1 << s // ERROR "truncated"
+)
+
+// constant shift expressions
+const c uint = 65
+
+var (
+ a2 int = 1.0 << c // ERROR "overflow"
+ b2 = 1.0 << c // ERROR "overflow"
+ d2 = f(1.0 << c) // ERROR "overflow"
+)
diff --git a/gcc/testsuite/go.test/test/shift2.go b/gcc/testsuite/go.test/test/shift2.go
new file mode 100644
index 0000000000..ec4c7addc2
--- /dev/null
+++ b/gcc/testsuite/go.test/test/shift2.go
@@ -0,0 +1,42 @@
+// $G $D/$F.go || echo BUG: shift2
+
+// 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.
+
+// Issue 1708, legal cases.
+
+package p
+
+func f(x int) int { return 0 }
+func g(x interface{}) int { return 0 }
+func h(x float64) int { return 0 }
+
+// from the spec
+var (
+ s uint = 33
+ i = 1 << s // 1 has type int
+ j int32 = 1 << s // 1 has type int32; j == 0
+ k = uint64(1 << s) // 1 has type uint64; k == 1<<33
+ m int = 1.0 << s // legal: 1.0 has type int
+ w int64 = 1.0 << 33 // legal: 1.0<<33 is a constant shift expression
+)
+
+// non-constant shift expressions
+var (
+ a1 int = 2.0 << s // typeof(2.0) is int in this context => legal shift
+ d1 = f(2.0 << s) // typeof(2.0) is int in this context => legal shift
+)
+
+// constant shift expressions
+const c uint = 5
+
+var (
+ a2 int = 2.0 << c // a2 == 64 (type int)
+ b2 = 2.0 << c // b2 == 64 (untyped integer)
+ _ = f(b2) // verify b2 has type int
+ c2 float64 = 2 << c // c2 == 64.0 (type float64)
+ d2 = f(2.0 << c) // == f(64)
+ e2 = g(2.0 << c) // == g(int(64))
+ f2 = h(2 << c) // == h(float64(64.0))
+)
diff --git a/gcc/testsuite/go.test/test/sigchld.go b/gcc/testsuite/go.test/test/sigchld.go
index 09188fc53a..e7c3d5abb4 100644
--- a/gcc/testsuite/go.test/test/sigchld.go
+++ b/gcc/testsuite/go.test/test/sigchld.go
@@ -1,5 +1,5 @@
-// if [ $GOOS == nacl ]; then echo survived SIGCHLD; exit 0; fi # NaCl has no signals.
-// $G $D/$F.go && $L $F.$A && ./$A.out
+// [ "$GOOS" == windows ] ||
+// ($G $D/$F.go && $L $F.$A && ./$A.out 2>&1 | cmp - $D/$F.out)
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
diff --git a/gcc/testsuite/go.test/test/sigchld.out b/gcc/testsuite/go.test/test/sigchld.out
new file mode 100644
index 0000000000..477d025796
--- /dev/null
+++ b/gcc/testsuite/go.test/test/sigchld.out
@@ -0,0 +1 @@
+survived SIGCHLD
diff --git a/gcc/testsuite/go.test/test/sinit.go b/gcc/testsuite/go.test/test/sinit.go
index 2adb931e14..5cd3a4567b 100644
--- a/gcc/testsuite/go.test/test/sinit.go
+++ b/gcc/testsuite/go.test/test/sinit.go
@@ -1,4 +1,4 @@
-// $G -S $D/$F.go | egrep initdone >/dev/null && echo FAIL || true
+// $G -S $D/$F.go | egrep initdone >/dev/null && echo BUG sinit || true
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -9,45 +9,45 @@ package p
// Should be no init func in the assembly.
// All these initializations should be done at link time.
-type S struct{ a,b,c int }
-type SS struct{ aa,bb,cc S }
-type SA struct{ a,b,c [3]int }
-type SC struct{ a,b,c []int }
+type S struct{ a, b, c int }
+type SS struct{ aa, bb, cc S }
+type SA struct{ a, b, c [3]int }
+type SC struct{ a, b, c []int }
var (
- zero = 2
- one = 1
- pi = 3.14
- slice = []byte{1,2,3}
- sliceInt = []int{1,2,3}
- hello = "hello, world"
- bytes = []byte("hello, world")
- four, five = 4, 5
- x, y = 0.1, "hello"
- nilslice []byte = nil
- nilmap map[string]int = nil
- nilfunc func() = nil
- nilchan chan int = nil
- nilptr *byte = nil
+ zero = 2
+ one = 1
+ pi = 3.14
+ slice = []byte{1, 2, 3}
+ sliceInt = []int{1, 2, 3}
+ hello = "hello, world"
+ bytes = []byte("hello, world")
+ four, five = 4, 5
+ x, y = 0.1, "hello"
+ nilslice []byte = nil
+ nilmap map[string]int = nil
+ nilfunc func() = nil
+ nilchan chan int = nil
+ nilptr *byte = nil
)
-var a = [3]int{1001, 1002, 1003}
-var s = S{1101, 1102, 1103}
-var c = []int{1201, 1202, 1203}
+var a = [3]int{1001, 1002, 1003}
+var s = S{1101, 1102, 1103}
+var c = []int{1201, 1202, 1203}
-var aa = [3][3]int{[3]int{2001,2002,2003}, [3]int{2004,2005,2006}, [3]int{2007,2008,2009}}
-var as = [3]S{S{2101,2102,2103},S{2104,2105,2106},S{2107,2108,2109}}
-var ac = [3][]int{[]int{2201,2202,2203}, []int{2204,2205,2206}, []int{2207,2208,2209}}
+var aa = [3][3]int{[3]int{2001, 2002, 2003}, [3]int{2004, 2005, 2006}, [3]int{2007, 2008, 2009}}
+var as = [3]S{S{2101, 2102, 2103}, S{2104, 2105, 2106}, S{2107, 2108, 2109}}
+var ac = [3][]int{[]int{2201, 2202, 2203}, []int{2204, 2205, 2206}, []int{2207, 2208, 2209}}
-var sa = SA{[3]int{3001,3002,3003},[3]int{3004,3005,3006},[3]int{3007,3008,3009}}
-var ss = SS{S{3101,3102,3103},S{3104,3105,3106},S{3107,3108,3109}}
-var sc = SC{[]int{3201,3202,3203},[]int{3204,3205,3206},[]int{3207,3208,3209}}
+var sa = SA{[3]int{3001, 3002, 3003}, [3]int{3004, 3005, 3006}, [3]int{3007, 3008, 3009}}
+var ss = SS{S{3101, 3102, 3103}, S{3104, 3105, 3106}, S{3107, 3108, 3109}}
+var sc = SC{[]int{3201, 3202, 3203}, []int{3204, 3205, 3206}, []int{3207, 3208, 3209}}
-var ca = [][3]int{[3]int{4001,4002,4003}, [3]int{4004,4005,4006}, [3]int{4007,4008,4009}}
-var cs = []S{S{4101,4102,4103},S{4104,4105,4106},S{4107,4108,4109}}
-var cc = [][]int{[]int{4201,4202,4203}, []int{4204,4205,4206}, []int{4207,4208,4209}}
+var ca = [][3]int{[3]int{4001, 4002, 4003}, [3]int{4004, 4005, 4006}, [3]int{4007, 4008, 4009}}
+var cs = []S{S{4101, 4102, 4103}, S{4104, 4105, 4106}, S{4107, 4108, 4109}}
+var cc = [][]int{[]int{4201, 4202, 4203}, []int{4204, 4205, 4206}, []int{4207, 4208, 4209}}
-var answers = [...]int {
+var answers = [...]int{
// s
1101, 1102, 1103,
@@ -98,3 +98,158 @@ var answers = [...]int {
2008, 2208, 2308, 4008, 4208, 4308, 5008, 5208, 5308,
2009, 2209, 2309, 4009, 4209, 4309, 5009, 5209, 5309,
}
+
+var (
+ copy_zero = zero
+ copy_one = one
+ copy_pi = pi
+ copy_slice = slice
+ copy_sliceInt = sliceInt
+ copy_hello = hello
+ copy_bytes = bytes
+ copy_four, copy_five = four, five
+ copy_x, copy_y = x, y
+ copy_nilslice = nilslice
+ copy_nilmap = nilmap
+ copy_nilfunc = nilfunc
+ copy_nilchan = nilchan
+ copy_nilptr = nilptr
+)
+
+var copy_a = a
+var copy_s = s
+var copy_c = c
+
+var copy_aa = aa
+var copy_as = as
+var copy_ac = ac
+
+var copy_sa = sa
+var copy_ss = ss
+var copy_sc = sc
+
+var copy_ca = ca
+var copy_cs = cs
+var copy_cc = cc
+
+var copy_answers = answers
+
+var bx bool
+var b0 = false
+var b1 = true
+
+var fx float32
+var f0 = float32(0)
+var f1 = float32(1)
+
+var gx float64
+var g0 = float64(0)
+var g1 = float64(1)
+
+var ix int
+var i0 = 0
+var i1 = 1
+
+var jx uint
+var j0 = uint(0)
+var j1 = uint(1)
+
+var cx complex64
+var c0 = complex64(0)
+var c1 = complex64(1)
+
+var dx complex128
+var d0 = complex128(0)
+var d1 = complex128(1)
+
+var sx []int
+var s0 = []int{0, 0, 0}
+var s1 = []int{1, 2, 3}
+
+func fi() int
+
+var ax [10]int
+var a0 = [10]int{0, 0, 0}
+var a1 = [10]int{1, 2, 3, 4}
+
+type T struct{ X, Y int }
+
+var tx T
+var t0 = T{}
+var t0a = T{0, 0}
+var t0b = T{X: 0}
+var t1 = T{X: 1, Y: 2}
+var t1a = T{3, 4}
+
+var psx *[]int
+var ps0 = &[]int{0, 0, 0}
+var ps1 = &[]int{1, 2, 3}
+
+var pax *[10]int
+var pa0 = &[10]int{0, 0, 0}
+var pa1 = &[10]int{1, 2, 3}
+
+var ptx *T
+var pt0 = &T{}
+var pt0a = &T{0, 0}
+var pt0b = &T{X: 0}
+var pt1 = &T{X: 1, Y: 2}
+var pt1a = &T{3, 4}
+
+var copy_bx = bx
+var copy_b0 = b0
+var copy_b1 = b1
+
+var copy_fx = fx
+var copy_f0 = f0
+var copy_f1 = f1
+
+var copy_gx = gx
+var copy_g0 = g0
+var copy_g1 = g1
+
+var copy_ix = ix
+var copy_i0 = i0
+var copy_i1 = i1
+
+var copy_jx = jx
+var copy_j0 = j0
+var copy_j1 = j1
+
+var copy_cx = cx
+var copy_c0 = c0
+var copy_c1 = c1
+
+var copy_dx = dx
+var copy_d0 = d0
+var copy_d1 = d1
+
+var copy_sx = sx
+var copy_s0 = s0
+var copy_s1 = s1
+
+var copy_ax = ax
+var copy_a0 = a0
+var copy_a1 = a1
+
+var copy_tx = tx
+var copy_t0 = t0
+var copy_t0a = t0a
+var copy_t0b = t0b
+var copy_t1 = t1
+var copy_t1a = t1a
+
+var copy_psx = psx
+var copy_ps0 = ps0
+var copy_ps1 = ps1
+
+var copy_pax = pax
+var copy_pa0 = pa0
+var copy_pa1 = pa1
+
+var copy_ptx = ptx
+var copy_pt0 = pt0
+var copy_pt0a = pt0a
+var copy_pt0b = pt0b
+var copy_pt1 = pt1
+var copy_pt1a = pt1a
diff --git a/gcc/testsuite/go.test/test/sizeof.go b/gcc/testsuite/go.test/test/sizeof.go
new file mode 100644
index 0000000000..544e4c52c1
--- /dev/null
+++ b/gcc/testsuite/go.test/test/sizeof.go
@@ -0,0 +1,23 @@
+// $G $D/$F.go
+
+// 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 main
+
+import "unsafe"
+
+type T struct {
+ X int
+}
+
+var t T
+
+func isUintptr(uintptr) {}
+
+func main() {
+ isUintptr(unsafe.Sizeof(t))
+ isUintptr(unsafe.Alignof(t))
+ isUintptr(unsafe.Offsetof(t.X))
+}
diff --git a/gcc/testsuite/go.test/test/solitaire.go b/gcc/testsuite/go.test/test/solitaire.go
index c789bf24a0..473a1d12d7 100644
--- a/gcc/testsuite/go.test/test/solitaire.go
+++ b/gcc/testsuite/go.test/test/solitaire.go
@@ -14,7 +14,7 @@ const N = 11 + 1 // length of a board row (+1 for newline)
// The board must be surrounded by 2 illegal fields in each direction
// so that move() doesn't need to check the board boundaries. Periods
// represent illegal fields, ● are pegs, and ○ are holes.
-var board = []int(
+var board = []rune(
`...........
...........
....●●●....
@@ -28,7 +28,6 @@ var board = []int(
...........
`)
-
// center is the position of the center hole if there is a single one;
// otherwise it is -1.
var center int
@@ -46,7 +45,6 @@ func init() {
}
}
-
var moves int // number of times move is called
// move tests if there is a peg at position pos that can jump over another peg
@@ -63,7 +61,6 @@ func move(pos, dir int) bool {
return false
}
-
// unmove reverts a previously executed valid move.
func unmove(pos, dir int) {
board[pos] = '●'
@@ -71,7 +68,6 @@ func unmove(pos, dir int) {
board[pos+2*dir] = '○'
}
-
// solve tries to find a sequence of moves such that there is only one peg left
// at the end; if center is >= 0, that last peg must be in the center position.
// If a solution is found, solve prints the board after each move in a backward
@@ -110,7 +106,6 @@ func solve() bool {
return false
}
-
func main() {
if !solve() {
println("no solution found")
diff --git a/gcc/testsuite/go.test/test/stack.go b/gcc/testsuite/go.test/test/stack.go
index 816b555a4c..1fd57161ff 100644
--- a/gcc/testsuite/go.test/test/stack.go
+++ b/gcc/testsuite/go.test/test/stack.go
@@ -30,6 +30,32 @@ func d(t T) {
}
}
+func f0() {
+ // likely to make a new stack for f0,
+ // because the call to f1 puts 3000 bytes
+ // in our frame.
+ f1()
+}
+
+func f1() [3000]byte {
+ // likely to make a new stack for f1,
+ // because 3000 bytes were used by f0
+ // and we need 3000 more for the call
+ // to f2. if the call to morestack in f1
+ // does not pass the frame size, the new
+ // stack (default size 5k) will not be big
+ // enough for the frame, and the morestack
+ // check in f2 will die, if we get that far
+ // without faulting.
+ f2()
+ return [3000]byte{}
+}
+
+func f2() [3000]byte {
+ // just take up space
+ return [3000]byte{}
+}
+
var c = make(chan int)
var t T
var b = []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
@@ -40,6 +66,7 @@ func recur(n int) {
panic("bad []byte -> string")
}
go g(c, t)
+ f0()
s := <-c
if s != len(t) {
println("bad go", s)
diff --git a/gcc/testsuite/go.test/test/string_lit.go b/gcc/testsuite/go.test/test/string_lit.go
index 4358dd8e82..c702a05e91 100644
--- a/gcc/testsuite/go.test/test/string_lit.go
+++ b/gcc/testsuite/go.test/test/string_lit.go
@@ -35,14 +35,14 @@ func assert(a, b, c string) {
}
const (
- gx1 = "aä本☺"
- gx2 = "aä\xFF\xFF本☺"
+ gx1 = "aä本☺"
+ gx2 = "aä\xFF\xFF本☺"
gx2fix = "aä\uFFFD\uFFFD本☺"
)
var (
- gr1 = []int(gx1)
- gr2 = []int(gx2)
+ gr1 = []rune(gx1)
+ gr2 = []rune(gx2)
gb1 = []byte(gx1)
gb2 = []byte(gx2)
)
@@ -93,26 +93,26 @@ func main() {
// test large runes. perhaps not the most logical place for this test.
var r int32
- r = 0x10ffff; // largest rune value
+ r = 0x10ffff // largest rune value
s = string(r)
assert(s, "\xf4\x8f\xbf\xbf", "largest rune")
r = 0x10ffff + 1
s = string(r)
assert(s, "\xef\xbf\xbd", "too-large rune")
- assert(string(gr1), gx1, "global ->[]int")
- assert(string(gr2), gx2fix, "global invalid ->[]int")
+ assert(string(gr1), gx1, "global ->[]rune")
+ assert(string(gr2), gx2fix, "global invalid ->[]rune")
assert(string(gb1), gx1, "->[]byte")
assert(string(gb2), gx2, "global invalid ->[]byte")
var (
- r1 = []int(gx1)
- r2 = []int(gx2)
+ r1 = []rune(gx1)
+ r2 = []rune(gx2)
b1 = []byte(gx1)
b2 = []byte(gx2)
)
- assert(string(r1), gx1, "->[]int")
- assert(string(r2), gx2fix, "invalid ->[]int")
+ assert(string(r1), gx1, "->[]rune")
+ assert(string(r2), gx2fix, "invalid ->[]rune")
assert(string(b1), gx1, "->[]byte")
assert(string(b2), gx2, "invalid ->[]byte")
diff --git a/gcc/testsuite/go.test/test/stringrange.go b/gcc/testsuite/go.test/test/stringrange.go
index d5ada2628d..6a7063e239 100644
--- a/gcc/testsuite/go.test/test/stringrange.go
+++ b/gcc/testsuite/go.test/test/stringrange.go
@@ -9,28 +9,29 @@ package main
import (
"fmt"
"os"
- "utf8"
+ "unicode/utf8"
)
func main() {
s := "\000\123\x00\xca\xFE\u0123\ubabe\U0000babe\U0010FFFFx"
- expect := []int{ 0, 0123, 0, 0xFFFD, 0xFFFD, 0x123, 0xbabe, 0xbabe, 0x10FFFF, 'x' }
+ expect := []rune{0, 0123, 0, 0xFFFD, 0xFFFD, 0x123, 0xbabe, 0xbabe, 0x10FFFF, 'x'}
offset := 0
- var i, c int
+ var i int
+ var c rune
ok := true
cnum := 0
for i, c = range s {
- rune, size := utf8.DecodeRuneInString(s[i:len(s)]) // check it another way
+ r, size := utf8.DecodeRuneInString(s[i:len(s)]) // check it another way
if i != offset {
fmt.Printf("unexpected offset %d not %d\n", i, offset)
ok = false
}
- if rune != expect[cnum] {
- fmt.Printf("unexpected rune %d from DecodeRuneInString: %x not %x\n", i, rune, expect[cnum])
+ if r != expect[cnum] {
+ fmt.Printf("unexpected rune %d from DecodeRuneInString: %x not %x\n", i, r, expect[cnum])
ok = false
}
if c != expect[cnum] {
- fmt.Printf("unexpected rune %d from range: %x not %x\n", i, rune, expect[cnum])
+ fmt.Printf("unexpected rune %d from range: %x not %x\n", i, r, expect[cnum])
ok = false
}
offset += size
diff --git a/gcc/testsuite/go.test/test/struct0.go b/gcc/testsuite/go.test/test/struct0.go
new file mode 100644
index 0000000000..2398c4117d
--- /dev/null
+++ b/gcc/testsuite/go.test/test/struct0.go
@@ -0,0 +1,34 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// 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.
+
+// zero length structs.
+// used to not be evaluated.
+// issue 2232.
+
+package main
+
+func recv(c chan interface{}) struct{} {
+ return (<-c).(struct{})
+}
+
+var m = make(map[interface{}]int)
+
+func recv1(c chan interface{}) {
+ defer rec()
+ m[(<-c).(struct{})] = 0
+}
+
+func rec() {
+ recover()
+}
+
+func main() {
+ c := make(chan interface{})
+ go recv(c)
+ c <- struct{}{}
+ go recv1(c)
+ c <- struct{}{}
+}
diff --git a/gcc/testsuite/go.test/test/switch.go b/gcc/testsuite/go.test/test/switch.go
index 0c253d6e2a..bed027ce85 100644
--- a/gcc/testsuite/go.test/test/switch.go
+++ b/gcc/testsuite/go.test/test/switch.go
@@ -19,48 +19,75 @@ func main() {
hello := "hello"
switch true {
- case i5 < 5: assert(false, "<")
- case i5 == 5: assert(true, "!")
- case i5 > 5: assert(false, ">")
+ case i5 < 5:
+ assert(false, "<")
+ case i5 == 5:
+ assert(true, "!")
+ case i5 > 5:
+ assert(false, ">")
}
switch {
- case i5 < 5: assert(false, "<")
- case i5 == 5: assert(true, "!")
- case i5 > 5: assert(false, ">")
+ case i5 < 5:
+ assert(false, "<")
+ case i5 == 5:
+ assert(true, "!")
+ case i5 > 5:
+ assert(false, ">")
}
switch x := 5; true {
- case i5 < x: assert(false, "<")
- case i5 == x: assert(true, "!")
- case i5 > x: assert(false, ">")
+ case i5 < x:
+ assert(false, "<")
+ case i5 == x:
+ assert(true, "!")
+ case i5 > x:
+ assert(false, ">")
}
switch x := 5; true {
- case i5 < x: assert(false, "<")
- case i5 == x: assert(true, "!")
- case i5 > x: assert(false, ">")
+ case i5 < x:
+ assert(false, "<")
+ case i5 == x:
+ assert(true, "!")
+ case i5 > x:
+ assert(false, ">")
}
switch i5 {
- case 0: assert(false, "0")
- case 1: assert(false, "1")
- case 2: assert(false, "2")
- case 3: assert(false, "3")
- case 4: assert(false, "4")
- case 5: assert(true, "5")
- case 6: assert(false, "6")
- case 7: assert(false, "7")
- case 8: assert(false, "8")
- case 9: assert(false, "9")
- default: assert(false, "default")
+ case 0:
+ assert(false, "0")
+ case 1:
+ assert(false, "1")
+ case 2:
+ assert(false, "2")
+ case 3:
+ assert(false, "3")
+ case 4:
+ assert(false, "4")
+ case 5:
+ assert(true, "5")
+ case 6:
+ assert(false, "6")
+ case 7:
+ assert(false, "7")
+ case 8:
+ assert(false, "8")
+ case 9:
+ assert(false, "9")
+ default:
+ assert(false, "default")
}
switch i5 {
- case 0,1,2,3,4: assert(false, "4")
- case 5: assert(true, "5")
- case 6,7,8,9: assert(false, "9")
- default: assert(false, "default")
+ case 0, 1, 2, 3, 4:
+ assert(false, "4")
+ case 5:
+ assert(true, "5")
+ case 6, 7, 8, 9:
+ assert(false, "9")
+ default:
+ assert(false, "default")
}
switch i5 {
@@ -68,72 +95,188 @@ func main() {
case 1:
case 2:
case 3:
- case 4: assert(false, "4")
- case 5: assert(true, "5")
+ case 4:
+ assert(false, "4")
+ case 5:
+ assert(true, "5")
case 6:
case 7:
case 8:
case 9:
- default: assert(i5 == 5, "good")
+ default:
+ assert(i5 == 5, "good")
}
switch i5 {
- case 0: dummy := 0; _ = dummy; fallthrough
- case 1: dummy := 0; _ = dummy; fallthrough
- case 2: dummy := 0; _ = dummy; fallthrough
- case 3: dummy := 0; _ = dummy; fallthrough
- case 4: dummy := 0; _ = dummy; assert(false, "4")
- case 5: dummy := 0; _ = dummy; fallthrough
- case 6: dummy := 0; _ = dummy; fallthrough
- case 7: dummy := 0; _ = dummy; fallthrough
- case 8: dummy := 0; _ = dummy; fallthrough
- case 9: dummy := 0; _ = dummy; fallthrough
- default: dummy := 0; _ = dummy; assert(i5 == 5, "good")
+ case 0:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 1:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 2:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 3:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 4:
+ dummy := 0
+ _ = dummy
+ assert(false, "4")
+ case 5:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 6:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 7:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 8:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 9:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ default:
+ dummy := 0
+ _ = dummy
+ assert(i5 == 5, "good")
}
fired := false
switch i5 {
- case 0: dummy := 0; _ = dummy; fallthrough; // tests scoping of cases
- case 1: dummy := 0; _ = dummy; fallthrough
- case 2: dummy := 0; _ = dummy; fallthrough
- case 3: dummy := 0; _ = dummy; fallthrough
- case 4: dummy := 0; _ = dummy; assert(false, "4")
- case 5: dummy := 0; _ = dummy; fallthrough
- case 6: dummy := 0; _ = dummy; fallthrough
- case 7: dummy := 0; _ = dummy; fallthrough
- case 8: dummy := 0; _ = dummy; fallthrough
- case 9: dummy := 0; _ = dummy; fallthrough
- default: dummy := 0; _ = dummy; fired = !fired; assert(i5 == 5, "good")
+ case 0:
+ dummy := 0
+ _ = dummy
+ fallthrough // tests scoping of cases
+ case 1:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 2:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 3:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 4:
+ dummy := 0
+ _ = dummy
+ assert(false, "4")
+ case 5:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 6:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 7:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 8:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ case 9:
+ dummy := 0
+ _ = dummy
+ fallthrough
+ default:
+ dummy := 0
+ _ = dummy
+ fired = !fired
+ assert(i5 == 5, "good")
}
assert(fired, "fired")
count := 0
switch i5 {
- case 0: count = count + 1; fallthrough
- case 1: count = count + 1; fallthrough
- case 2: count = count + 1; fallthrough
- case 3: count = count + 1; fallthrough
- case 4: count = count + 1; assert(false, "4")
- case 5: count = count + 1; fallthrough
- case 6: count = count + 1; fallthrough
- case 7: count = count + 1; fallthrough
- case 8: count = count + 1; fallthrough
- case 9: count = count + 1; fallthrough
- default: assert(i5 == count, "good")
+ case 0:
+ count = count + 1
+ fallthrough
+ case 1:
+ count = count + 1
+ fallthrough
+ case 2:
+ count = count + 1
+ fallthrough
+ case 3:
+ count = count + 1
+ fallthrough
+ case 4:
+ count = count + 1
+ assert(false, "4")
+ case 5:
+ count = count + 1
+ fallthrough
+ case 6:
+ count = count + 1
+ fallthrough
+ case 7:
+ count = count + 1
+ fallthrough
+ case 8:
+ count = count + 1
+ fallthrough
+ case 9:
+ count = count + 1
+ fallthrough
+ default:
+ assert(i5 == count, "good")
}
assert(fired, "fired")
switch hello {
- case "wowie": assert(false, "wowie")
- case "hello": assert(true, "hello")
- case "jumpn": assert(false, "jumpn")
- default: assert(false, "default")
+ case "wowie":
+ assert(false, "wowie")
+ case "hello":
+ assert(true, "hello")
+ case "jumpn":
+ assert(false, "jumpn")
+ default:
+ assert(false, "default")
}
fired = false
switch i := i5 + 2; i {
- case i7: fired = true
- default: assert(false, "fail")
+ case i7:
+ fired = true
+ default:
+ assert(false, "fail")
}
assert(fired, "var")
+
+ // switch on nil-only comparison types
+ switch f := func() {}; f {
+ case nil:
+ assert(false, "f should not be nil")
+ default:
+ }
+
+ switch m := make(map[int]int); m {
+ case nil:
+ assert(false, "m should not be nil")
+ default:
+ }
+
+ switch a := make([]int, 1); a {
+ case nil:
+ assert(false, "m should not be nil")
+ default:
+ }
}
diff --git a/gcc/testsuite/go.test/test/switch3.go b/gcc/testsuite/go.test/test/switch3.go
new file mode 100644
index 0000000000..6c9ebfe6d4
--- /dev/null
+++ b/gcc/testsuite/go.test/test/switch3.go
@@ -0,0 +1,58 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+type I interface {
+ M()
+}
+
+func bad() {
+ var i I
+ var s string
+
+ switch i {
+ case s: // ERROR "mismatched types string and I|incompatible types"
+ }
+
+ switch s {
+ case i: // ERROR "mismatched types I and string|incompatible types"
+ }
+
+ var m, m1 map[int]int
+ switch m {
+ case nil:
+ case m1: // ERROR "can only compare map m to nil|map can only be compared to nil"
+ default:
+ }
+
+ var a, a1 []int
+ switch a {
+ case nil:
+ case a1: // ERROR "can only compare slice a to nil|slice can only be compared to nil"
+ default:
+ }
+
+ var f, f1 func()
+ switch f {
+ case nil:
+ case f1: // ERROR "can only compare func f to nil|func can only be compared to nil"
+ default:
+ }
+}
+
+func good() {
+ var i interface{}
+ var s string
+
+ switch i {
+ case s:
+ }
+
+ switch s {
+ case i:
+ }
+}
diff --git a/gcc/testsuite/go.test/test/syntax/chan.go b/gcc/testsuite/go.test/test/syntax/chan.go
new file mode 100644
index 0000000000..ff3577502f
--- /dev/null
+++ b/gcc/testsuite/go.test/test/syntax/chan.go
@@ -0,0 +1,17 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+type xyz struct {
+ ch chan
+} // ERROR "unexpected .*}.* in channel type"
+
+func Foo(y chan) { // ERROR "unexpected .*\).* in channel type"
+}
+
+func Bar(x chan, y int) { // ERROR "unexpected comma in channel type"
+}
diff --git a/gcc/testsuite/go.test/test/syntax/chan1.go b/gcc/testsuite/go.test/test/syntax/chan1.go
new file mode 100644
index 0000000000..9c12e5e6fe
--- /dev/null
+++ b/gcc/testsuite/go.test/test/syntax/chan1.go
@@ -0,0 +1,17 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+var c chan int
+var v int
+
+func main() {
+ if c <- v { // ERROR "send statement.*value.*select"
+ }
+}
+
+var _ = c <- v // ERROR "send statement.*value.*select"
diff --git a/gcc/testsuite/go.test/test/syntax/else.go b/gcc/testsuite/go.test/test/syntax/else.go
new file mode 100644
index 0000000000..99595254fd
--- /dev/null
+++ b/gcc/testsuite/go.test/test/syntax/else.go
@@ -0,0 +1,12 @@
+// errchk $G $D/$F.go
+
+// 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 main
+
+func main() {
+ if true {
+ } else ; // ERROR "else must be followed by if or statement block|expected .if. or .{."
+}
diff --git a/gcc/testsuite/go.test/test/syntax/if.go b/gcc/testsuite/go.test/test/syntax/if.go
new file mode 100644
index 0000000000..a3b51f0c07
--- /dev/null
+++ b/gcc/testsuite/go.test/test/syntax/if.go
@@ -0,0 +1,18 @@
+// errchk $G $D/$F.go
+
+// 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 main
+
+func x() {
+}
+
+func main() {
+ if { // ERROR "missing condition"
+ }
+
+ if x(); { // ERROR "missing condition"
+ }
+}
diff --git a/gcc/testsuite/go.test/test/syntax/typesw.go b/gcc/testsuite/go.test/test/syntax/typesw.go
new file mode 100644
index 0000000000..47f683cdf2
--- /dev/null
+++ b/gcc/testsuite/go.test/test/syntax/typesw.go
@@ -0,0 +1,13 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+func main() {
+ switch main() := interface{}(nil).(type) { // ERROR "invalid variable name"
+ default:
+ }
+}
diff --git a/gcc/testsuite/go.test/test/times.out b/gcc/testsuite/go.test/test/times.out
new file mode 100644
index 0000000000..841fab9ef2
--- /dev/null
+++ b/gcc/testsuite/go.test/test/times.out
@@ -0,0 +1,632 @@
+0.04 ./235
+1.72 ./64bit
+0.03 ./alias
+0.03 ./alias1
+0.30 ./append
+0.07 ./args
+0.02 ./assign
+0.04 ./assign1
+0.04 ./bigalg
+0.03 ./bigmap
+0.14 ./blank
+0.03 ./blank1
+0.03 ./chancap
+0.07 ./char_lit
+0.03 ./char_lit1
+0.09 ./closedchan
+0.05 ./closure
+0.06 ./cmp
+0.02 ./cmp6
+0.03 ./cmplx
+0.60 ./cmplxdivide
+0.00 ./cmplxdivide1
+0.04 ./complit
+0.02 ./complit1
+0.03 ./compos
+0.04 ./const
+0.03 ./const1
+0.03 ./const2
+0.13 ./const3
+0.08 ./convert
+0.03 ./convert1
+0.02 ./convert3
+0.04 ./convlit
+0.02 ./convlit1
+0.34 ./copy
+0.27 ./crlf
+0.05 ./ddd
+0.02 ./ddd1
+0.00 ./ddd2
+0.04 ./ddd3
+0.03 ./decl
+0.03 ./declbad
+0.14 ./defer
+0.03 ./deferprint
+0.14 ./divide
+0.00 ./empty
+0.08 ./env
+0.00 ./eof
+0.00 ./eof1
+0.04 ./escape
+0.12 ./escape2
+0.03 ./escape3
+0.05 ./float_lit
+0.14 ./floatcmp
+0.03 ./for
+0.04 ./func
+0.03 ./func1
+0.00 ./func2
+0.03 ./func3
+0.03 ./func4
+0.03 ./func5
+0.00 ./func6
+0.04 ./func7
+0.03 ./gc
+0.04 ./gc1
+0.26 ./gc2
+0.06 ./goprint
+0.04 ./goto
+0.04 ./hashmap
+0.03 ./helloworld
+0.03 ./if
+0.02 ./import
+0.15 ./import1
+0.00 ./import2
+0.01 ./import3
+0.14 ./import4
+1.70 ./index
+0.03 ./indirect
+0.02 ./indirect1
+0.02 ./init
+0.25 ./init1
+0.03 ./initcomma
+0.15 ./initialize
+0.02 ./initializerr
+0.06 ./initsyscall
+0.07 ./int_lit
+0.03 ./intcvt
+0.03 ./iota
+0.03 ./label
+0.03 ./label1
+0.04 ./literal
+0.15 ./malloc1
+0.06 ./mallocfin
+0.19 ./mallocrand
+0.21 ./mallocrep
+0.52 ./mallocrep1
+0.17 ./map
+0.02 ./map1
+0.05 ./method
+0.02 ./method1
+0.03 ./method2
+0.04 ./method3
+0.06 ./named
+0.03 ./named1
+0.18 ./nil
+0.15 ./nilptr
+0.16 ./nul1
+0.00 ./parentype
+0.11 ./peano
+0.02 ./printbig
+0.05 ./range
+0.04 ./recover
+0.04 ./recover1
+0.08 ./recover2
+0.06 ./recover3
+0.14 ./rename
+0.02 ./rename1
+0.16 ./reorder
+0.00 ./rune
+0.03 ./runtime
+0.03 ./shift1
+0.01 ./shift2
+0.03 ./sieve
+0.06 ./sigchld
+0.03 ./simassign
+0.02 ./sinit
+0.00 ./sizeof
+0.03 ./solitaire
+0.06 ./stack
+0.08 ./string_lit
+0.14 ./stringrange
+0.04 ./struct0
+0.04 ./switch
+0.08 ./switch1
+0.02 ./switch3
+0.04 ./test0
+0.03 ./turing
+0.07 ./typeswitch
+0.15 ./typeswitch1
+0.02 ./typeswitch2
+0.03 ./typeswitch3
+0.02 ./undef
+0.04 ./utf
+0.03 ./varerr
+0.03 ./varinit
+0.26 ./zerodivide
+0.04 ken/array
+0.11 ken/chan
+0.04 ken/chan1
+0.04 ken/complit
+0.07 ken/convert
+0.03 ken/cplx0
+0.02 ken/cplx1
+0.06 ken/cplx2
+0.09 ken/cplx3
+0.14 ken/cplx4
+0.03 ken/cplx5
+0.31 ken/divconst
+0.05 ken/divmod
+0.04 ken/embed
+0.03 ken/for
+0.04 ken/interbasic
+0.03 ken/interfun
+0.04 ken/intervar
+0.03 ken/label
+0.03 ken/litfun
+0.03 ken/mfunc
+0.34 ken/modconst
+0.03 ken/ptrfun
+0.03 ken/ptrvar
+0.04 ken/range
+0.03 ken/rob1
+0.18 ken/rob2
+0.04 ken/robfor
+0.04 ken/robfunc
+0.03 ken/shift
+0.03 ken/simparray
+0.04 ken/simpbool
+0.03 ken/simpconv
+0.03 ken/simpfun
+0.03 ken/simpswitch
+0.03 ken/simpvar
+0.02 ken/slicearray
+0.03 ken/sliceslice
+0.03 ken/string
+0.03 ken/strvar
+0.32 chan/doubleselect
+0.06 chan/fifo
+0.12 chan/goroutines
+0.07 chan/nonblock
+0.02 chan/perm
+0.10 chan/powser1
+0.09 chan/powser2
+0.03 chan/select
+0.15 chan/select2
+0.97 chan/select3
+0.03 chan/select4
+0.72 chan/select5
+0.03 chan/select6
+0.04 chan/select7
+0.03 chan/sendstmt
+0.03 chan/sieve1
+0.04 chan/sieve2
+0.02 chan/zerosize
+0.04 interface/bigdata
+0.04 interface/convert
+0.03 interface/convert1
+0.03 interface/convert2
+0.09 interface/embed
+0.00 interface/embed0
+0.03 interface/embed1
+0.02 interface/embed2
+0.02 interface/explicit
+0.03 interface/fail
+0.09 interface/fake
+0.03 interface/noeq
+0.03 interface/pointer
+0.03 interface/private
+0.00 interface/private1
+0.04 interface/receiver
+0.03 interface/receiver1
+0.00 interface/recursive
+0.03 interface/returntype
+0.09 interface/struct
+0.02 syntax/chan
+0.03 syntax/chan1
+0.02 syntax/else
+0.02 syntax/forvar
+0.03 syntax/if
+0.03 syntax/import
+0.03 syntax/interface
+0.03 syntax/semi1
+0.02 syntax/semi2
+0.03 syntax/semi3
+0.03 syntax/semi4
+0.02 syntax/semi5
+0.03 syntax/semi6
+0.02 syntax/semi7
+0.02 syntax/topexpr
+0.03 syntax/typesw
+0.02 syntax/vareq
+0.03 syntax/vareq1
+0.04 dwarf/linedirectives
+0.05 dwarf/main
+0.00 dwarf/z1
+0.00 dwarf/z10
+0.00 dwarf/z11
+0.00 dwarf/z12
+0.00 dwarf/z13
+0.00 dwarf/z14
+0.00 dwarf/z15
+0.00 dwarf/z16
+0.00 dwarf/z17
+0.00 dwarf/z18
+0.00 dwarf/z19
+0.00 dwarf/z2
+0.00 dwarf/z20
+0.00 dwarf/z3
+0.00 dwarf/z4
+0.00 dwarf/z5
+0.00 dwarf/z6
+0.00 dwarf/z7
+0.00 dwarf/z8
+0.00 dwarf/z9
+0.03 fixedbugs/bug000
+0.03 fixedbugs/bug002
+0.03 fixedbugs/bug003
+0.03 fixedbugs/bug004
+0.04 fixedbugs/bug005
+0.08 fixedbugs/bug006
+0.03 fixedbugs/bug007
+0.03 fixedbugs/bug008
+0.02 fixedbugs/bug009
+0.03 fixedbugs/bug010
+0.03 fixedbugs/bug011
+0.03 fixedbugs/bug012
+0.03 fixedbugs/bug013
+0.03 fixedbugs/bug014
+0.02 fixedbugs/bug015
+0.02 fixedbugs/bug016
+0.03 fixedbugs/bug017
+0.00 fixedbugs/bug020
+0.03 fixedbugs/bug021
+0.02 fixedbugs/bug022
+0.03 fixedbugs/bug023
+0.03 fixedbugs/bug024
+0.03 fixedbugs/bug026
+0.14 fixedbugs/bug027
+0.03 fixedbugs/bug028
+0.02 fixedbugs/bug030
+0.03 fixedbugs/bug031
+0.02 fixedbugs/bug035
+0.00 fixedbugs/bug036
+0.02 fixedbugs/bug037
+0.00 fixedbugs/bug038
+0.03 fixedbugs/bug039
+0.00 fixedbugs/bug040
+0.03 fixedbugs/bug045
+0.03 fixedbugs/bug046
+0.03 fixedbugs/bug047
+0.02 fixedbugs/bug048
+0.03 fixedbugs/bug049
+0.03 fixedbugs/bug050
+0.02 fixedbugs/bug051
+0.03 fixedbugs/bug052
+0.03 fixedbugs/bug053
+0.03 fixedbugs/bug054
+0.03 fixedbugs/bug055
+0.03 fixedbugs/bug056
+0.00 fixedbugs/bug057
+0.04 fixedbugs/bug058
+0.08 fixedbugs/bug059
+0.08 fixedbugs/bug060
+0.03 fixedbugs/bug061
+0.03 fixedbugs/bug062
+0.00 fixedbugs/bug063
+0.00 fixedbugs/bug064
+0.03 fixedbugs/bug065
+0.00 fixedbugs/bug066
+0.03 fixedbugs/bug067
+0.03 fixedbugs/bug068
+0.00 fixedbugs/bug069
+0.15 fixedbugs/bug070
+0.00 fixedbugs/bug071
+0.03 fixedbugs/bug072
+0.03 fixedbugs/bug073
+0.03 fixedbugs/bug074
+0.03 fixedbugs/bug075
+0.03 fixedbugs/bug076
+0.00 fixedbugs/bug077
+0.03 fixedbugs/bug078
+0.00 fixedbugs/bug080
+0.02 fixedbugs/bug081
+0.03 fixedbugs/bug082
+0.03 fixedbugs/bug083
+0.04 fixedbugs/bug084
+0.02 fixedbugs/bug085
+0.03 fixedbugs/bug086
+0.00 fixedbugs/bug087
+0.01 fixedbugs/bug088
+0.00 fixedbugs/bug089
+0.03 fixedbugs/bug090
+0.02 fixedbugs/bug091
+0.03 fixedbugs/bug092
+0.03 fixedbugs/bug093
+0.00 fixedbugs/bug094
+0.00 fixedbugs/bug096
+0.03 fixedbugs/bug097
+0.00 fixedbugs/bug098
+0.03 fixedbugs/bug099
+0.03 fixedbugs/bug101
+0.03 fixedbugs/bug102
+0.02 fixedbugs/bug103
+0.03 fixedbugs/bug104
+0.01 fixedbugs/bug106
+0.03 fixedbugs/bug107
+0.03 fixedbugs/bug108
+0.00 fixedbugs/bug109
+0.03 fixedbugs/bug110
+0.03 fixedbugs/bug111
+0.00 fixedbugs/bug112
+0.03 fixedbugs/bug113
+0.03 fixedbugs/bug114
+0.00 fixedbugs/bug115
+0.03 fixedbugs/bug116
+0.02 fixedbugs/bug117
+0.00 fixedbugs/bug118
+0.03 fixedbugs/bug119
+0.11 fixedbugs/bug120
+0.02 fixedbugs/bug121
+0.03 fixedbugs/bug122
+0.03 fixedbugs/bug123
+0.02 fixedbugs/bug126
+0.02 fixedbugs/bug127
+0.03 fixedbugs/bug128
+0.01 fixedbugs/bug129
+0.08 fixedbugs/bug130
+0.02 fixedbugs/bug131
+0.02 fixedbugs/bug132
+0.03 fixedbugs/bug133
+0.00 fixedbugs/bug135
+0.02 fixedbugs/bug136
+0.00 fixedbugs/bug137
+0.00 fixedbugs/bug139
+0.00 fixedbugs/bug140
+0.07 fixedbugs/bug141
+0.03 fixedbugs/bug142
+0.00 fixedbugs/bug143
+0.00 fixedbugs/bug144
+0.00 fixedbugs/bug145
+0.03 fixedbugs/bug146
+0.06 fixedbugs/bug147
+0.03 fixedbugs/bug148
+0.00 fixedbugs/bug149
+0.00 fixedbugs/bug150
+0.00 fixedbugs/bug151
+0.03 fixedbugs/bug1515
+0.03 fixedbugs/bug152
+0.14 fixedbugs/bug154
+0.03 fixedbugs/bug155
+0.00 fixedbugs/bug156
+0.00 fixedbugs/bug157
+0.00 fixedbugs/bug158
+0.07 fixedbugs/bug159
+0.09 fixedbugs/bug160
+0.00 fixedbugs/bug161
+0.02 fixedbugs/bug163
+0.00 fixedbugs/bug164
+0.03 fixedbugs/bug165
+0.03 fixedbugs/bug167
+0.03 fixedbugs/bug168
+0.02 fixedbugs/bug169
+0.03 fixedbugs/bug170
+0.03 fixedbugs/bug171
+0.02 fixedbugs/bug172
+0.00 fixedbugs/bug173
+0.00 fixedbugs/bug174
+0.03 fixedbugs/bug175
+0.03 fixedbugs/bug176
+0.09 fixedbugs/bug177
+0.03 fixedbugs/bug178
+0.03 fixedbugs/bug179
+0.03 fixedbugs/bug180
+0.03 fixedbugs/bug181
+0.02 fixedbugs/bug182
+0.03 fixedbugs/bug183
+0.15 fixedbugs/bug184
+0.04 fixedbugs/bug185
+0.02 fixedbugs/bug186
+0.08 fixedbugs/bug187
+0.03 fixedbugs/bug188
+0.03 fixedbugs/bug189
+0.00 fixedbugs/bug190
+0.04 fixedbugs/bug191
+0.03 fixedbugs/bug192
+0.03 fixedbugs/bug193
+0.03 fixedbugs/bug194
+0.02 fixedbugs/bug195
+0.04 fixedbugs/bug196
+0.02 fixedbugs/bug197
+0.03 fixedbugs/bug198
+0.03 fixedbugs/bug199
+0.03 fixedbugs/bug200
+0.03 fixedbugs/bug201
+0.03 fixedbugs/bug202
+0.03 fixedbugs/bug203
+0.03 fixedbugs/bug204
+0.02 fixedbugs/bug205
+0.21 fixedbugs/bug206
+0.14 fixedbugs/bug207
+0.02 fixedbugs/bug208
+0.02 fixedbugs/bug209
+0.03 fixedbugs/bug211
+0.03 fixedbugs/bug212
+0.03 fixedbugs/bug213
+0.00 fixedbugs/bug214
+0.02 fixedbugs/bug215
+0.00 fixedbugs/bug216
+0.03 fixedbugs/bug217
+0.00 fixedbugs/bug218
+0.00 fixedbugs/bug219
+0.04 fixedbugs/bug221
+0.01 fixedbugs/bug222
+0.00 fixedbugs/bug223
+0.03 fixedbugs/bug224
+0.03 fixedbugs/bug225
+0.03 fixedbugs/bug227
+0.03 fixedbugs/bug228
+0.03 fixedbugs/bug229
+0.03 fixedbugs/bug230
+0.02 fixedbugs/bug231
+0.00 fixedbugs/bug232
+0.01 fixedbugs/bug233
+0.04 fixedbugs/bug234
+0.00 fixedbugs/bug235
+0.04 fixedbugs/bug236
+0.15 fixedbugs/bug237
+0.03 fixedbugs/bug238
+0.00 fixedbugs/bug239
+0.03 fixedbugs/bug240
+0.03 fixedbugs/bug241
+0.04 fixedbugs/bug242
+0.04 fixedbugs/bug243
+0.03 fixedbugs/bug244
+0.00 fixedbugs/bug245
+0.03 fixedbugs/bug246
+0.03 fixedbugs/bug247
+0.11 fixedbugs/bug248
+0.03 fixedbugs/bug249
+0.00 fixedbugs/bug250
+0.03 fixedbugs/bug251
+0.03 fixedbugs/bug252
+0.03 fixedbugs/bug253
+0.03 fixedbugs/bug254
+0.03 fixedbugs/bug255
+0.03 fixedbugs/bug256
+0.47 fixedbugs/bug257
+0.14 fixedbugs/bug258
+0.16 fixedbugs/bug259
+0.16 fixedbugs/bug260
+0.03 fixedbugs/bug261
+0.10 fixedbugs/bug262
+0.03 fixedbugs/bug263
+0.03 fixedbugs/bug264
+0.07 fixedbugs/bug265
+0.03 fixedbugs/bug266
+0.00 fixedbugs/bug267
+0.03 fixedbugs/bug269
+0.13 fixedbugs/bug271
+0.02 fixedbugs/bug272
+0.04 fixedbugs/bug273
+0.02 fixedbugs/bug274
+0.00 fixedbugs/bug275
+0.03 fixedbugs/bug276
+0.00 fixedbugs/bug277
+0.03 fixedbugs/bug278
+0.04 fixedbugs/bug279
+0.02 fixedbugs/bug280
+0.04 fixedbugs/bug281
+0.00 fixedbugs/bug282
+0.00 fixedbugs/bug283
+0.03 fixedbugs/bug284
+0.05 fixedbugs/bug285
+0.04 fixedbugs/bug286
+0.02 fixedbugs/bug287
+0.00 fixedbugs/bug288
+0.02 fixedbugs/bug289
+0.04 fixedbugs/bug290
+0.04 fixedbugs/bug291
+0.03 fixedbugs/bug292
+0.04 fixedbugs/bug293
+0.03 fixedbugs/bug294
+0.16 fixedbugs/bug295
+0.04 fixedbugs/bug296
+0.03 fixedbugs/bug297
+0.03 fixedbugs/bug298
+0.03 fixedbugs/bug299
+0.03 fixedbugs/bug300
+0.00 fixedbugs/bug301
+0.04 fixedbugs/bug302
+0.05 fixedbugs/bug303
+0.00 fixedbugs/bug304
+0.03 fixedbugs/bug305
+0.01 fixedbugs/bug306
+0.00 fixedbugs/bug307
+0.01 fixedbugs/bug308
+0.00 fixedbugs/bug309
+0.04 fixedbugs/bug311
+0.03 fixedbugs/bug312
+0.04 fixedbugs/bug313
+0.04 fixedbugs/bug314
+0.00 fixedbugs/bug315
+0.00 fixedbugs/bug316
+0.03 fixedbugs/bug317
+0.03 fixedbugs/bug318
+0.00 fixedbugs/bug319
+0.03 fixedbugs/bug320
+0.14 fixedbugs/bug321
+0.04 fixedbugs/bug322
+0.03 fixedbugs/bug323
+0.04 fixedbugs/bug324
+0.03 fixedbugs/bug325
+0.02 fixedbugs/bug326
+0.04 fixedbugs/bug327
+0.03 fixedbugs/bug328
+0.04 fixedbugs/bug329
+0.02 fixedbugs/bug330
+0.04 fixedbugs/bug331
+0.02 fixedbugs/bug332
+0.03 fixedbugs/bug333
+0.01 fixedbugs/bug334
+0.01 fixedbugs/bug335
+0.04 fixedbugs/bug336
+0.03 fixedbugs/bug337
+0.00 fixedbugs/bug338
+0.03 fixedbugs/bug339
+0.02 fixedbugs/bug340
+0.03 fixedbugs/bug341
+0.02 fixedbugs/bug342
+0.04 fixedbugs/bug343
+0.02 fixedbugs/bug344
+0.03 fixedbugs/bug345
+0.08 fixedbugs/bug346
+0.04 fixedbugs/bug347
+0.06 fixedbugs/bug348
+0.03 fixedbugs/bug349
+0.03 fixedbugs/bug350
+0.02 fixedbugs/bug351
+0.03 fixedbugs/bug352
+0.03 fixedbugs/bug353
+0.00 fixedbugs/bug354
+0.03 fixedbugs/bug355
+0.03 fixedbugs/bug356
+0.02 fixedbugs/bug357
+0.04 fixedbugs/bug358
+0.00 fixedbugs/bug361
+0.03 fixedbugs/bug362
+0.03 fixedbugs/bug363
+0.15 fixedbugs/bug364
+0.02 fixedbugs/bug365
+0.03 fixedbugs/bug366
+0.03 fixedbugs/bug367
+0.03 fixedbugs/bug368
+0.51 fixedbugs/bug369
+0.03 fixedbugs/bug370
+0.02 fixedbugs/bug371
+0.03 fixedbugs/bug372
+0.03 fixedbugs/bug373
+0.03 fixedbugs/bug374
+0.03 fixedbugs/bug375
+0.03 fixedbugs/bug376
+0.01 fixedbugs/bug377
+0.03 fixedbugs/bug378
+0.02 fixedbugs/bug379
+0.00 fixedbugs/bug380
+0.03 fixedbugs/bug381
+0.01 fixedbugs/bug382
+0.03 fixedbugs/bug383
+0.03 fixedbugs/bug384
+0.00 fixedbugs/bug385_32
+0.03 fixedbugs/bug385_64
+0.03 fixedbugs/bug386
+0.01 fixedbugs/bug387
+0.02 fixedbugs/bug388
+0.03 fixedbugs/bug389
+0.03 fixedbugs/bug390
+0.00 fixedbugs/bug391
+0.01 fixedbugs/bug392
+0.00 fixedbugs/bug393
+0.03 fixedbugs/bug394
+0.00 fixedbugs/bug395
+0.01 fixedbugs/bug396
diff --git a/gcc/testsuite/go.test/test/turing.go b/gcc/testsuite/go.test/test/turing.go
index 0af39de8b2..366982e67f 100644
--- a/gcc/testsuite/go.test/test/turing.go
+++ b/gcc/testsuite/go.test/test/turing.go
@@ -10,42 +10,47 @@ package main
var p, pc int
var a [30000]byte
+
const prog = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.!"
func scan(dir int) {
for nest := dir; dir*nest > 0; pc += dir {
switch prog[pc+dir] {
- case ']':
- nest--
- case '[':
- nest++
+ case ']':
+ nest--
+ case '[':
+ nest++
}
}
}
func main() {
+ r := ""
for {
switch prog[pc] {
- case '>':
- p++
- case '<':
- p--
- case '+':
- a[p]++
- case '-':
- a[p]--
- case '.':
- print(string(a[p]))
- case '[':
- if a[p] == 0 {
- scan(1)
- }
- case ']':
- if a[p] != 0 {
- scan(-1)
- }
- default:
- return
+ case '>':
+ p++
+ case '<':
+ p--
+ case '+':
+ a[p]++
+ case '-':
+ a[p]--
+ case '.':
+ r += string(a[p])
+ case '[':
+ if a[p] == 0 {
+ scan(1)
+ }
+ case ']':
+ if a[p] != 0 {
+ scan(-1)
+ }
+ default:
+ if r != "Hello World!\n" {
+ panic(r)
+ }
+ return
}
pc++
}
diff --git a/gcc/testsuite/go.test/test/typeswitch.go b/gcc/testsuite/go.test/test/typeswitch.go
index 83fb0985a9..aa911f9b62 100644
--- a/gcc/testsuite/go.test/test/typeswitch.go
+++ b/gcc/testsuite/go.test/test/typeswitch.go
@@ -82,9 +82,9 @@ func main() {
case []int:
assert(x[3] == 3 && i == Array, "array")
case map[string]int:
- assert(x == m && i == Map, "map")
+ assert(x != nil && i == Map, "map")
case func(i int) interface{}:
- assert(x == f && i == Func, "fun")
+ assert(x != nil && i == Func, "fun")
default:
assert(false, "unknown")
}
@@ -111,5 +111,4 @@ func main() {
default:
assert(false, "switch 4 unknown")
}
-
}
diff --git a/gcc/testsuite/go.test/test/typeswitch2.go b/gcc/testsuite/go.test/test/typeswitch2.go
index f8fe396eae..3e3acdae37 100644
--- a/gcc/testsuite/go.test/test/typeswitch2.go
+++ b/gcc/testsuite/go.test/test/typeswitch2.go
@@ -18,11 +18,27 @@ func whatis(x interface{}) string {
return "Reader1"
case io.Reader: // ERROR "duplicate"
return "Reader2"
- case interface { r(); w() }:
+ case interface {
+ r()
+ w()
+ }:
return "rw"
- case interface { w(); r() }: // ERROR "duplicate"
+ case interface { // GCCGO_ERROR "duplicate"
+ w()
+ r()
+ }: // GC_ERROR "duplicate"
return "wr"
-
+
}
return ""
}
+
+func notused(x interface{}) {
+ // The first t is in a different scope than the 2nd t; it cannot
+ // be accessed (=> declared and not used error); but it is legal
+ // to declare it.
+ switch t := 0; t := x.(type) { // ERROR "declared and not used"
+ case int:
+ _ = t // this is using the t of "t := x.(type)"
+ }
+}
diff --git a/gcc/testsuite/go.test/test/typeswitch3.go b/gcc/testsuite/go.test/test/typeswitch3.go
new file mode 100644
index 0000000000..99d08a20f7
--- /dev/null
+++ b/gcc/testsuite/go.test/test/typeswitch3.go
@@ -0,0 +1,20 @@
+// errchk $G -e $D/$F.go
+
+// 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 main
+
+
+type I interface {
+ M()
+}
+
+func main(){
+ var x I
+ switch x.(type) {
+ case string: // ERROR "impossible"
+ println("FAIL")
+ }
+}
diff --git a/gcc/testsuite/go.test/test/utf.go b/gcc/testsuite/go.test/test/utf.go
index a93fc29341..9fba58156b 100644
--- a/gcc/testsuite/go.test/test/utf.go
+++ b/gcc/testsuite/go.test/test/utf.go
@@ -6,10 +6,10 @@
package main
-import "utf8"
+import "unicode/utf8"
func main() {
- var chars [6] int
+ var chars [6]rune
chars[0] = 'a'
chars[1] = 'b'
chars[2] = 'c'
@@ -21,16 +21,22 @@ func main() {
s += string(chars[i])
}
var l = len(s)
- for w, i, j := 0,0,0; i < l; i += w {
- var r int
+ for w, i, j := 0, 0, 0; i < l; i += w {
+ var r rune
r, w = utf8.DecodeRuneInString(s[i:len(s)])
- if w == 0 { panic("zero width in string") }
- if r != chars[j] { panic("wrong value from string") }
+ if w == 0 {
+ panic("zero width in string")
+ }
+ if r != chars[j] {
+ panic("wrong value from string")
+ }
j++
}
// encoded as bytes: 'a' 'b' 'c' e6 97 a5 e6 9c ac e8 aa 9e
const L = 12
- if L != l { panic("wrong length constructing array") }
+ if L != l {
+ panic("wrong length constructing array")
+ }
a := make([]byte, L)
a[0] = 'a'
a[1] = 'b'
@@ -44,11 +50,15 @@ func main() {
a[9] = 0xe8
a[10] = 0xaa
a[11] = 0x9e
- for w, i, j := 0,0,0; i < L; i += w {
- var r int
+ for w, i, j := 0, 0, 0; i < L; i += w {
+ var r rune
r, w = utf8.DecodeRune(a[i:L])
- if w == 0 { panic("zero width in bytes") }
- if r != chars[j] { panic("wrong value from bytes") }
+ if w == 0 {
+ panic("zero width in bytes")
+ }
+ if r != chars[j] {
+ panic("wrong value from bytes")
+ }
j++
}
}
diff --git a/gcc/testsuite/go.test/test/vectors.go b/gcc/testsuite/go.test/test/vectors.go
deleted file mode 100644
index ed5905da30..0000000000
--- a/gcc/testsuite/go.test/test/vectors.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// $G $F.go && $L $F.$A && ./$A.out
-
-// Copyright 2009 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 "container/vector"
-
-
-type S struct {
- val int
-}
-
-
-func (p *S) Init(val int) *S {
- p.val = val
- return p
-}
-
-
-func test0() {
- v := new(vector.Vector)
- if v.Len() != 0 {
- print("len = ", v.Len(), "\n")
- panic("fail")
- }
-}
-
-
-func test1() {
- var a [1000]*S
- for i := 0; i < len(a); i++ {
- a[i] = new(S).Init(i)
- }
-
- v := new(vector.Vector)
- for i := 0; i < len(a); i++ {
- v.Insert(0, a[i])
- if v.Len() != i+1 {
- print("len = ", v.Len(), "\n")
- panic("fail")
- }
- }
-
- for i := 0; i < v.Len(); i++ {
- x := v.At(i).(*S)
- if x.val != v.Len()-i-1 {
- print("expected ", i, ", found ", x.val, "\n")
- panic("fail")
- }
- }
-
- for v.Len() > 10 {
- v.Delete(10)
- }
-}
-
-
-func main() {
- test0()
- test1()
-}
diff --git a/gcc/testsuite/go.test/test/zerodivide.go b/gcc/testsuite/go.test/test/zerodivide.go
index 1948528d24..3b08e774cc 100644
--- a/gcc/testsuite/go.test/test/zerodivide.go
+++ b/gcc/testsuite/go.test/test/zerodivide.go
@@ -9,13 +9,10 @@ package main
import (
"fmt"
"math"
+ "runtime"
"strings"
)
-type Error interface {
- String() string
-}
-
type ErrorTest struct {
name string
fn func()
@@ -161,10 +158,10 @@ var errorTests = []ErrorTest{
ErrorTest{"complex128 1/0", func() { use(e128 / d128) }, ""},
}
-func error(fn func()) (error string) {
+func error_(fn func()) (error string) {
defer func() {
if e := recover(); e != nil {
- error = e.(Error).String()
+ error = e.(runtime.Error).Error()
}
}()
fn()
@@ -199,7 +196,7 @@ func main() {
if t.err != "" {
continue
}
- err := error(t.fn)
+ err := error_(t.fn)
switch {
case t.err == "" && err == "":
// fine