diff options
Diffstat (limited to 'gcc/testsuite/go.test')
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" + + "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" + + "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" + + "wdp85zgwAfA3hJq69eh7Lu7zLGHl5V6eivCu1elHunTwnjRy61p714uThUcOOcz8" + + "O1cqxabWOunLt5Rw9iSJHt3F3y3WWZdtujHhx50iRPHtKachw2vnz8eK369x98Ov" + + "hw2vztQt4JRlnK9QFCycOHEpchMB0Ym5SeIlIUMnPFcafA3klDSwWSTX9VVFP3k/" + + "KQ0+nzF4rj5wtvArh604+dqCN3Qjz0VcqypVmrlXVlSVcqyiSeckRld1JlJlRlJB" + + "zmlk1LS0RqoTfWN3vzzprfXjY+ZUWT9c+ednqsvvSSJCkAXphQSFpCgXIwRJFQeP" + + "HfxpU2Op7pg4ZhX80D8P0HcE+tvtafe0PslS2h6bEUphB+Trt9zcMySlFfrXx8s6" + + "aKGUneDdfjQ99/yYfX7l9meCDI/bvJDJAQgdu6SzNW3eZlBQykZoKrwo37d0TaW2" + + "0DnfHOPJfg278PvnXg+re/l0U+vfj83QmJIyIhDN53JH5Px9XhPr2/DXcY+NzGJO" + + "6t1p8J77+GH2+xfbwXyN7S7ySU8e36ZcY2cmX9ZqJVTbyyJ9LNd2Hy9pFJjOJx48" + + "YJh9fxDDVU7nuPtjdzVxq4025elJxy5kTGLIXu3JDla90qnLmi/u/hOXSqnQu+mf" + + "lpHZt8sRqH7saHSSEQXU251XwY4dOFRt18lS6cUnTgWreu+m18JO/RkmYWb9Oofm" + + "aH1PPXk244ZeFEhws+fI7cknaR6D4fDdfBuITwr5+BweumnDtjA5GjvZpuOHS0si" + + "Djw9vK9vVXw3M4takTts7RicqcARg31RQ03CvXwCPOWh+DxPrrPL04oI3S1HWXPL" + + "V28NsefHEu5KGKEqe8NJPYLCCHQMJCQ7PR5y21rbPLh6zyKm7rpxn60/GG3l6l0b" + + "Mqm2VCL8CsOWG2Qe5VVUemVS2xUlz8FNVTjEzB3gTsxNJ2NL8fkcfOEhUaCuYPW1" + + "wuNRLHrVBHPnUBbfGqqnLbx2unVlEqcfFU674T6+c8eHON8cbcPxnVY79dPSQXrj" + + "j02ctOXInljHDTacJEg5ZB5GNDvHrWNOquSOU5GHgGIrXB8Q3PTh49XFuZnMke3D" + + "Pi349tnTc2x78ZbabfvzMff1Q00qpoqlPdKqaqUObw73hT5rm2u3Djb92qrt3QRw" + + "acoV3xS8qpNypaaM8CBy9599F75+N8/OM7xre29w+OXpOnjtyeGSEgrypPNCAvLz" + + "gjvv0nE4N8L06x27SNPjUeRJEjXk3zlzOGsVtiMq9O5Hkcp2VPh8K+XJ7XZx9Zvt" + + "531nPHGb550jpsrvKpnZ7X182tPp4nB2m23Dj50a+PuHwWvHvJzCvWfD1elNOsfN" + + "SEgw75bTbwkkc52410eGuLbzmZkZvvVmtPrz195lSMXTdO+GvWa25VN0UMpetNG+" + + "NwU07IY+Tmk5PCX1drtxw6VwlEnsyq9FxYhCRtIhPTOT09a7ZutZpiLA6pDtYY3V" + + "5igfFU4zU4brTy7ejat64Qejh0SJHTSTZ3u3h212EB3mgeekTleTDmSOOVnfrh6P" + + "Y8ntJJ7Pr2KTqnMOYbga2JznETGW1bGqmrY4zLwt8niQD18xElWURb94FyqjnAZ3" + + "z6YJ1iOcC2nMPuqLNVQhSiLLqoyCroXV+YwVxq9cddcOZJtS0iqScZGJbLQOBQXO" + + "HE9q+9mbo5znrM8crxzyCVKhGIK9qoKpR4L0FF29epznKxmhKoosQGVDU2h3Ay47" + + "SFIJE+nw88FX5l03vzu+JfbrzePF0kBSZvDVsr5KaIWZmJzqUoIpQrMhASe/z86c" + + "6HyL3ZqezLvn2w0+aVZ7vTMRFUZPLRe7Rk+Uox4XrFfp8/Xz18+/jybiRw7VvURT" + + "5MeVT3Td4+Ma5xHFTVt3xxqcror7cx5cZbWPo78+Fcp3j1jCSRIxTy4+XByxM192" + + "To8aO6enDlp8Tpwnp5LwvE56l2zffqYlRPPQ4gQywiSLYYacvPXtw/DHocyrt2j0" + + "e/enNm57m0qsB8YrRH1Lrhwgi85HTIViqnpHjX5odbWnqdJNpywNzy5F55CTpz3b" + + "Offvji3GWujD788zPCvnTt/r5SH4mbMvVznmrtcufVxUd3tFD8H+XCVA9+aArHR5" + + "t2MPNpfFspyylwe0mEjs5oJOvfjxfnnNXNbdJPJ5YcaYgXzEbNNe/DNpS95PXWbX" + + "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 Binary files differindex 2f7bbbc6b0..2f7bbbc6b0 100644 --- a/gcc/testsuite/go.test/test/bench/mandelbrot.txt +++ b/gcc/testsuite/go.test/test/bench/shootout/mandelbrot.txt 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 |