From c25edd44a04672573946138da9c8fdc8c0eef5fd Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 23 Jan 2017 22:18:42 +0000 Subject: [PATCH] libgo: update to go1.8rc2 Fix a bug in the generation of the hash value in reflect.FuncOf. The merge script missed a bunch of testdata files over the years. Copy them over. Reviewed-on: https://go-review.googlesource.com/35570 From-SVN: r244835 --- gcc/go/gofrontend/MERGE | 2 +- libgo/MERGE | 2 +- libgo/VERSION | 2 +- libgo/go/cmd/go/bug.go | 7 +- libgo/go/cmd/go/test.go | 41 +- libgo/go/cmd/go/testdata/failssh/ssh | 2 + libgo/go/cmd/go/testdata/src/badc/x.c | 1 + .../src/canonical/a/{ => vendor}/c/c.go | 0 .../cmd/go/testdata/src/dupload/vendor/p/p.go | 1 + libgo/go/cmd/gofmt/testdata/emptydecl.golden | 14 + libgo/go/cmd/gofmt/testdata/emptydecl.input | 16 + libgo/go/cmd/gofmt/testdata/ranges.golden | 30 + libgo/go/cmd/gofmt/testdata/ranges.input | 20 + libgo/go/cmd/gofmt/testdata/stdin5.golden | 3 + libgo/go/cmd/gofmt/testdata/stdin5.input | 3 + libgo/go/cmd/gofmt/testdata/stdin6.golden | 19 + libgo/go/cmd/gofmt/testdata/stdin6.input | 21 + libgo/go/cmd/gofmt/testdata/stdin7.golden | 19 + libgo/go/cmd/gofmt/testdata/stdin7.input | 21 + libgo/go/compress/bzip2/bzip2_test.go | 24 +- libgo/go/compress/flate/deflate.go | 7 +- libgo/go/compress/flate/deflate_test.go | 31 + libgo/go/compress/flate/deflatefast.go | 19 +- libgo/go/compress/gzip/issue14937_test.go | 14 +- libgo/go/crypto/ecdsa/testdata/SigVer.rsp.bz2 | Bin 0 -> 95485 bytes libgo/go/crypto/tls/cipher_suites.go | 6 +- libgo/go/crypto/tls/tls.go | 4 +- libgo/go/crypto/x509/cert_pool.go | 11 +- libgo/go/crypto/x509/root_windows.go | 5 + libgo/go/crypto/x509/x509_test.go | 4 + libgo/go/go/ast/scope.go | 4 +- libgo/go/go/doc/doc_test.go | 5 +- .../gccgoimporter/testdata/complexnums.gox | 8 + .../gccgoimporter/testdata/conversions.gox | 6 + .../gccgoimporter/testdata/imports.gox | 7 + .../gccgoimporter/testdata/pointer.gox | 4 + .../internal/gccgoimporter/testdata/time.gox | Bin 0 -> 7977 bytes .../gccgoimporter/testdata/unicode.gox | Bin 0 -> 7945 bytes libgo/go/go/parser/performance_test.go | 13 +- libgo/go/go/types/testdata/blank.src | 5 + libgo/go/go/types/testdata/builtins.src | 901 ++++++++++++++++ libgo/go/go/types/testdata/const0.src | 295 ++++++ libgo/go/go/types/testdata/const1.src | 322 ++++++ libgo/go/go/types/testdata/constdecl.src | 97 ++ libgo/go/go/types/testdata/conversions.src | 93 ++ libgo/go/go/types/testdata/conversions2.src | 313 ++++++ libgo/go/go/types/testdata/cycles.src | 143 +++ libgo/go/go/types/testdata/cycles1.src | 77 ++ libgo/go/go/types/testdata/cycles2.src | 118 +++ libgo/go/go/types/testdata/cycles3.src | 60 ++ libgo/go/go/types/testdata/cycles4.src | 110 ++ libgo/go/go/types/testdata/decls0.src | 210 ++++ libgo/go/go/types/testdata/decls1.src | 144 +++ libgo/go/go/types/testdata/decls2a.src | 111 ++ libgo/go/go/types/testdata/decls2b.src | 65 ++ libgo/go/go/types/testdata/decls3.src | 309 ++++++ libgo/go/go/types/testdata/errors.src | 55 + libgo/go/go/types/testdata/expr0.src | 180 ++++ libgo/go/go/types/testdata/expr1.src | 127 +++ libgo/go/go/types/testdata/expr2.src | 247 +++++ libgo/go/go/types/testdata/expr3.src | 558 ++++++++++ libgo/go/go/types/testdata/gotos.src | 560 ++++++++++ libgo/go/go/types/testdata/importC.src | 10 + libgo/go/go/types/testdata/importdecl0a.src | 53 + libgo/go/go/types/testdata/importdecl0b.src | 33 + libgo/go/go/types/testdata/importdecl1a.src | 11 + libgo/go/go/types/testdata/importdecl1b.src | 7 + libgo/go/go/types/testdata/init0.src | 106 ++ libgo/go/go/types/testdata/init1.src | 97 ++ libgo/go/go/types/testdata/init2.src | 139 +++ libgo/go/go/types/testdata/issues.src | 188 ++++ libgo/go/go/types/testdata/labels.src | 207 ++++ libgo/go/go/types/testdata/methodsets.src | 214 ++++ libgo/go/go/types/testdata/shifts.src | 341 ++++++ libgo/go/go/types/testdata/stmt0.src | 980 ++++++++++++++++++ libgo/go/go/types/testdata/stmt1.src | 241 +++++ libgo/go/go/types/testdata/vardecl.src | 186 ++++ .../image/png/testdata/pngsuite/ftbbn0g01.png | Bin 0 -> 176 bytes .../image/png/testdata/pngsuite/ftbbn0g01.sng | 44 + .../image/png/testdata/pngsuite/ftbbn0g02.png | Bin 0 -> 197 bytes .../image/png/testdata/pngsuite/ftbbn0g02.sng | 45 + .../image/png/testdata/pngsuite/ftbbn0g04.png | Bin 0 -> 429 bytes .../image/png/testdata/pngsuite/ftbbn0g04.sng | 45 + .../image/png/testdata/pngsuite/ftbbn2c16.png | Bin 0 -> 2041 bytes .../image/png/testdata/pngsuite/ftbbn2c16.sng | 45 + .../image/png/testdata/pngsuite/ftbbn3p08.png | Bin 0 -> 1499 bytes .../image/png/testdata/pngsuite/ftbbn3p08.sng | 292 ++++++ .../image/png/testdata/pngsuite/ftbgn2c16.png | Bin 0 -> 2041 bytes .../image/png/testdata/pngsuite/ftbgn2c16.sng | 45 + .../image/png/testdata/pngsuite/ftbgn3p08.png | Bin 0 -> 1499 bytes .../image/png/testdata/pngsuite/ftbgn3p08.sng | 292 ++++++ .../image/png/testdata/pngsuite/ftbrn2c08.png | Bin 0 -> 1633 bytes .../image/png/testdata/pngsuite/ftbrn2c08.sng | 45 + .../image/png/testdata/pngsuite/ftbwn0g16.png | Bin 0 -> 1313 bytes .../image/png/testdata/pngsuite/ftbwn0g16.sng | 45 + .../image/png/testdata/pngsuite/ftbwn3p08.png | Bin 0 -> 1496 bytes .../image/png/testdata/pngsuite/ftbwn3p08.sng | 291 ++++++ .../image/png/testdata/pngsuite/ftbyn3p08.png | Bin 0 -> 1499 bytes .../image/png/testdata/pngsuite/ftbyn3p08.sng | 292 ++++++ .../image/png/testdata/pngsuite/ftp0n0g08.png | Bin 0 -> 719 bytes .../image/png/testdata/pngsuite/ftp0n0g08.sng | 41 + .../image/png/testdata/pngsuite/ftp0n2c08.png | Bin 0 -> 1594 bytes .../image/png/testdata/pngsuite/ftp0n2c08.sng | 41 + .../image/png/testdata/pngsuite/ftp0n3p08.png | Bin 0 -> 1476 bytes .../image/png/testdata/pngsuite/ftp0n3p08.sng | 288 +++++ .../image/png/testdata/pngsuite/ftp1n3p08.png | Bin 0 -> 1483 bytes .../image/png/testdata/pngsuite/ftp1n3p08.sng | 290 ++++++ libgo/go/mime/testdata/test.types.plan9 | 8 + libgo/go/net/http/serve_test.go | 139 +++ libgo/go/net/http/server.go | 10 +- libgo/go/net/http/transport_test.go | 114 +- libgo/go/os/os_test.go | 5 +- libgo/go/reflect/all_test.go | 68 ++ libgo/go/reflect/type.go | 3 +- .../testdata/testprogcgo/threadpanic_unix.c | 26 + .../testprogcgo/threadpanic_windows.c | 23 + .../testdata/testprogcgo/tracebackctxt_c.c | 91 ++ libgo/go/testing/benchmark.go | 7 +- libgo/go/testing/sub_test.go | 17 + libgo/go/testing/testing.go | 12 +- libgo/merge.sh | 2 +- 121 files changed, 10871 insertions(+), 104 deletions(-) create mode 100644 libgo/go/cmd/go/testdata/failssh/ssh create mode 100644 libgo/go/cmd/go/testdata/src/badc/x.c rename libgo/go/cmd/go/testdata/src/canonical/a/{ => vendor}/c/c.go (100%) create mode 100644 libgo/go/cmd/go/testdata/src/dupload/vendor/p/p.go create mode 100644 libgo/go/cmd/gofmt/testdata/emptydecl.golden create mode 100644 libgo/go/cmd/gofmt/testdata/emptydecl.input create mode 100644 libgo/go/cmd/gofmt/testdata/ranges.golden create mode 100644 libgo/go/cmd/gofmt/testdata/ranges.input create mode 100644 libgo/go/cmd/gofmt/testdata/stdin5.golden create mode 100644 libgo/go/cmd/gofmt/testdata/stdin5.input create mode 100644 libgo/go/cmd/gofmt/testdata/stdin6.golden create mode 100644 libgo/go/cmd/gofmt/testdata/stdin6.input create mode 100644 libgo/go/cmd/gofmt/testdata/stdin7.golden create mode 100644 libgo/go/cmd/gofmt/testdata/stdin7.input create mode 100644 libgo/go/crypto/ecdsa/testdata/SigVer.rsp.bz2 create mode 100644 libgo/go/go/internal/gccgoimporter/testdata/complexnums.gox create mode 100644 libgo/go/go/internal/gccgoimporter/testdata/conversions.gox create mode 100644 libgo/go/go/internal/gccgoimporter/testdata/imports.gox create mode 100644 libgo/go/go/internal/gccgoimporter/testdata/pointer.gox create mode 100644 libgo/go/go/internal/gccgoimporter/testdata/time.gox create mode 100644 libgo/go/go/internal/gccgoimporter/testdata/unicode.gox create mode 100644 libgo/go/go/types/testdata/blank.src create mode 100644 libgo/go/go/types/testdata/builtins.src create mode 100644 libgo/go/go/types/testdata/const0.src create mode 100644 libgo/go/go/types/testdata/const1.src create mode 100644 libgo/go/go/types/testdata/constdecl.src create mode 100644 libgo/go/go/types/testdata/conversions.src create mode 100644 libgo/go/go/types/testdata/conversions2.src create mode 100644 libgo/go/go/types/testdata/cycles.src create mode 100644 libgo/go/go/types/testdata/cycles1.src create mode 100644 libgo/go/go/types/testdata/cycles2.src create mode 100644 libgo/go/go/types/testdata/cycles3.src create mode 100644 libgo/go/go/types/testdata/cycles4.src create mode 100644 libgo/go/go/types/testdata/decls0.src create mode 100644 libgo/go/go/types/testdata/decls1.src create mode 100644 libgo/go/go/types/testdata/decls2a.src create mode 100644 libgo/go/go/types/testdata/decls2b.src create mode 100644 libgo/go/go/types/testdata/decls3.src create mode 100644 libgo/go/go/types/testdata/errors.src create mode 100644 libgo/go/go/types/testdata/expr0.src create mode 100644 libgo/go/go/types/testdata/expr1.src create mode 100644 libgo/go/go/types/testdata/expr2.src create mode 100644 libgo/go/go/types/testdata/expr3.src create mode 100644 libgo/go/go/types/testdata/gotos.src create mode 100644 libgo/go/go/types/testdata/importC.src create mode 100644 libgo/go/go/types/testdata/importdecl0a.src create mode 100644 libgo/go/go/types/testdata/importdecl0b.src create mode 100644 libgo/go/go/types/testdata/importdecl1a.src create mode 100644 libgo/go/go/types/testdata/importdecl1b.src create mode 100644 libgo/go/go/types/testdata/init0.src create mode 100644 libgo/go/go/types/testdata/init1.src create mode 100644 libgo/go/go/types/testdata/init2.src create mode 100644 libgo/go/go/types/testdata/issues.src create mode 100644 libgo/go/go/types/testdata/labels.src create mode 100644 libgo/go/go/types/testdata/methodsets.src create mode 100644 libgo/go/go/types/testdata/shifts.src create mode 100644 libgo/go/go/types/testdata/stmt0.src create mode 100644 libgo/go/go/types/testdata/stmt1.src create mode 100644 libgo/go/go/types/testdata/vardecl.src create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn0g01.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn0g01.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn0g02.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn0g02.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn0g04.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn0g04.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn2c16.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn2c16.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn3p08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbbn3p08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbgn2c16.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbgn2c16.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbgn3p08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbgn3p08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbrn2c08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbrn2c08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbwn0g16.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbwn0g16.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbwn3p08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbwn3p08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbyn3p08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftbyn3p08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp0n0g08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp0n0g08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp0n2c08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp0n2c08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp0n3p08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp0n3p08.sng create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp1n3p08.png create mode 100644 libgo/go/image/png/testdata/pngsuite/ftp1n3p08.sng create mode 100644 libgo/go/mime/testdata/test.types.plan9 create mode 100644 libgo/go/runtime/testdata/testprogcgo/threadpanic_unix.c create mode 100644 libgo/go/runtime/testdata/testprogcgo/threadpanic_windows.c create mode 100644 libgo/go/runtime/testdata/testprogcgo/tracebackctxt_c.c diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 03586265b45..f29acdf595d 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -0655e25d8e4acfac50c6b1422dc32eca3e30803a +fb609ff6d940768cf4db4ab7deb93b2ab686e45d The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/MERGE b/libgo/MERGE index a126b52ed78..92541dfc6e3 100644 --- a/libgo/MERGE +++ b/libgo/MERGE @@ -1,4 +1,4 @@ -3de6e96e4b8147f5267a2e8218a7c780b09a434f +59f181b6fda68ece22882945853ca2df9dbf1c88 The first line of this file holds the git revision number of the last merge done from the master library sources. diff --git a/libgo/VERSION b/libgo/VERSION index 3076f40768f..212211f54d1 100644 --- a/libgo/VERSION +++ b/libgo/VERSION @@ -1 +1 @@ -go1.8rc1 +go1.8rc2 diff --git a/libgo/go/cmd/go/bug.go b/libgo/go/cmd/go/bug.go index cbd258b80bd..658f6dabd90 100644 --- a/libgo/go/cmd/go/bug.go +++ b/libgo/go/cmd/go/bug.go @@ -20,11 +20,10 @@ import ( var cmdBug = &Command{ Run: runBug, UsageLine: "bug", - Short: "print information for bug reports", + Short: "start a bug report", Long: ` -Bug prints information that helps file effective bug reports. - -Bugs may be reported at https://golang.org/issue/new. +Bug opens the default browser and starts a new bug report. +The report includes useful system information. `, } diff --git a/libgo/go/cmd/go/test.go b/libgo/go/cmd/go/test.go index 37f6327fffe..5c13b653f01 100644 --- a/libgo/go/cmd/go/test.go +++ b/libgo/go/cmd/go/test.go @@ -906,9 +906,13 @@ func (b *builder) test(p *Package) (buildAction, runAction, printAction *action, if buildContext.GOOS == "darwin" { if buildContext.GOARCH == "arm" || buildContext.GOARCH == "arm64" { - t.NeedCgo = true + t.IsIOS = true + t.NeedOS = true } } + if t.TestMain == nil { + t.NeedOS = true + } for _, cp := range pmain.imports { if len(cp.coverVars) > 0 { @@ -1355,7 +1359,8 @@ type testFuncs struct { NeedTest bool ImportXtest bool NeedXtest bool - NeedCgo bool + NeedOS bool + IsIOS bool Cover []coverInfo } @@ -1456,7 +1461,7 @@ var testmainTmpl = template.Must(template.New("main").Parse(` package main import ( -{{if not .TestMain}} +{{if .NeedOS}} "os" {{end}} "testing" @@ -1472,8 +1477,10 @@ import ( _cover{{$i}} {{$p.Package.ImportPath | printf "%q"}} {{end}} -{{if .NeedCgo}} +{{if .IsIOS}} + "os/signal" _ "runtime/cgo" + "syscall" {{end}} ) @@ -1535,6 +1542,32 @@ func coverRegisterFile(fileName string, counter []uint32, pos []uint32, numStmts {{end}} func main() { +{{if .IsIOS}} + // Send a SIGUSR2, which will be intercepted by LLDB to + // tell the test harness that installation was successful. + // See misc/ios/go_darwin_arm_exec.go. + signal.Notify(make(chan os.Signal), syscall.SIGUSR2) + syscall.Kill(0, syscall.SIGUSR2) + signal.Reset(syscall.SIGUSR2) + + // The first argument supplied to an iOS test is an offset + // suffix for the current working directory. + // Process it here, and remove it from os.Args. + const hdr = "cwdSuffix=" + if len(os.Args) < 2 || len(os.Args[1]) <= len(hdr) || os.Args[1][:len(hdr)] != hdr { + panic("iOS test not passed a working directory suffix") + } + suffix := os.Args[1][len(hdr):] + dir, err := os.Getwd() + if err != nil { + panic(err) + } + if err := os.Chdir(dir + "/" + suffix); err != nil { + panic(err) + } + os.Args = append([]string{os.Args[0]}, os.Args[2:]...) +{{end}} + {{if .CoverEnabled}} testing.RegisterCover(testing.Cover{ Mode: {{printf "%q" .CoverMode}}, diff --git a/libgo/go/cmd/go/testdata/failssh/ssh b/libgo/go/cmd/go/testdata/failssh/ssh new file mode 100644 index 00000000000..ecdbef95dde --- /dev/null +++ b/libgo/go/cmd/go/testdata/failssh/ssh @@ -0,0 +1,2 @@ +#!/bin/sh +exit 1 diff --git a/libgo/go/cmd/go/testdata/src/badc/x.c b/libgo/go/cmd/go/testdata/src/badc/x.c new file mode 100644 index 00000000000..f6cbf6924db --- /dev/null +++ b/libgo/go/cmd/go/testdata/src/badc/x.c @@ -0,0 +1 @@ +// C code! diff --git a/libgo/go/cmd/go/testdata/src/canonical/a/c/c.go b/libgo/go/cmd/go/testdata/src/canonical/a/vendor/c/c.go similarity index 100% rename from libgo/go/cmd/go/testdata/src/canonical/a/c/c.go rename to libgo/go/cmd/go/testdata/src/canonical/a/vendor/c/c.go diff --git a/libgo/go/cmd/go/testdata/src/dupload/vendor/p/p.go b/libgo/go/cmd/go/testdata/src/dupload/vendor/p/p.go new file mode 100644 index 00000000000..c89cd18d0fe --- /dev/null +++ b/libgo/go/cmd/go/testdata/src/dupload/vendor/p/p.go @@ -0,0 +1 @@ +package p diff --git a/libgo/go/cmd/gofmt/testdata/emptydecl.golden b/libgo/go/cmd/gofmt/testdata/emptydecl.golden new file mode 100644 index 00000000000..33d6435e0a9 --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/emptydecl.golden @@ -0,0 +1,14 @@ +//gofmt -s + +// Test case for issue 7631. + +package main + +// Keep this declaration +var () + +const ( +// Keep this declaration +) + +func main() {} diff --git a/libgo/go/cmd/gofmt/testdata/emptydecl.input b/libgo/go/cmd/gofmt/testdata/emptydecl.input new file mode 100644 index 00000000000..4948a61f0de --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/emptydecl.input @@ -0,0 +1,16 @@ +//gofmt -s + +// Test case for issue 7631. + +package main + +// Keep this declaration +var () + +const ( +// Keep this declaration +) + +type () + +func main() {} \ No newline at end of file diff --git a/libgo/go/cmd/gofmt/testdata/ranges.golden b/libgo/go/cmd/gofmt/testdata/ranges.golden new file mode 100644 index 00000000000..506b3a035a3 --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/ranges.golden @@ -0,0 +1,30 @@ +//gofmt -s + +// Test cases for range simplification. +package p + +func _() { + for a, b = range x { + } + for a = range x { + } + for _, b = range x { + } + for range x { + } + + for a = range x { + } + for range x { + } + + for a, b := range x { + } + for a := range x { + } + for _, b := range x { + } + + for a := range x { + } +} diff --git a/libgo/go/cmd/gofmt/testdata/ranges.input b/libgo/go/cmd/gofmt/testdata/ranges.input new file mode 100644 index 00000000000..df5f8333c21 --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/ranges.input @@ -0,0 +1,20 @@ +//gofmt -s + +// Test cases for range simplification. +package p + +func _() { + for a, b = range x {} + for a, _ = range x {} + for _, b = range x {} + for _, _ = range x {} + + for a = range x {} + for _ = range x {} + + for a, b := range x {} + for a, _ := range x {} + for _, b := range x {} + + for a := range x {} +} diff --git a/libgo/go/cmd/gofmt/testdata/stdin5.golden b/libgo/go/cmd/gofmt/testdata/stdin5.golden new file mode 100644 index 00000000000..31ce6b24852 --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/stdin5.golden @@ -0,0 +1,3 @@ +//gofmt -stdin + +i := 5 // Line comment without newline. \ No newline at end of file diff --git a/libgo/go/cmd/gofmt/testdata/stdin5.input b/libgo/go/cmd/gofmt/testdata/stdin5.input new file mode 100644 index 00000000000..0a7c97d180c --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/stdin5.input @@ -0,0 +1,3 @@ +//gofmt -stdin + +i :=5// Line comment without newline. \ No newline at end of file diff --git a/libgo/go/cmd/gofmt/testdata/stdin6.golden b/libgo/go/cmd/gofmt/testdata/stdin6.golden new file mode 100644 index 00000000000..ffcea8011ba --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/stdin6.golden @@ -0,0 +1,19 @@ + //gofmt -stdin + + if err != nil { + source := strings.NewReader(`line 1. +line 2. +`) + return source + } + + f := func(hat, tail string) { + + fmt.Println(hat+` +foo + + +`+tail, + "more", + "and more") + } diff --git a/libgo/go/cmd/gofmt/testdata/stdin6.input b/libgo/go/cmd/gofmt/testdata/stdin6.input new file mode 100644 index 00000000000..78330020c65 --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/stdin6.input @@ -0,0 +1,21 @@ + //gofmt -stdin + + if err != nil { + source := strings.NewReader(`line 1. +line 2. +`) + return source + } + + f:=func( hat, tail string){ + + + + fmt. Println ( hat+ ` +foo + + +`+ tail , + "more" , + "and more" ) + } diff --git a/libgo/go/cmd/gofmt/testdata/stdin7.golden b/libgo/go/cmd/gofmt/testdata/stdin7.golden new file mode 100644 index 00000000000..bbac7133c86 --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/stdin7.golden @@ -0,0 +1,19 @@ + //gofmt -stdin + + if err != nil { + source := strings.NewReader(`line 1. +line 2. +`) + return source + } + + f := func(hat, tail string) { + + fmt.Println(hat+` + foo + + + `+tail, + "more", + "and more") + } diff --git a/libgo/go/cmd/gofmt/testdata/stdin7.input b/libgo/go/cmd/gofmt/testdata/stdin7.input new file mode 100644 index 00000000000..fd772a3c4e4 --- /dev/null +++ b/libgo/go/cmd/gofmt/testdata/stdin7.input @@ -0,0 +1,21 @@ + //gofmt -stdin + + if err != nil { + source := strings.NewReader(`line 1. +line 2. +`) + return source + } + + f:=func( hat, tail string){ + + + + fmt. Println ( hat+ ` + foo + + + `+ tail , + "more" , + "and more" ) + } diff --git a/libgo/go/compress/bzip2/bzip2_test.go b/libgo/go/compress/bzip2/bzip2_test.go index a6c3080db3e..95fb1895856 100644 --- a/libgo/go/compress/bzip2/bzip2_test.go +++ b/libgo/go/compress/bzip2/bzip2_test.go @@ -204,12 +204,6 @@ func TestMTF(t *testing.T) { } } -var ( - digits = mustLoadFile("testdata/e.txt.bz2") - twain = mustLoadFile("testdata/Mark.Twain-Tom.Sawyer.txt.bz2") - random = mustLoadFile("testdata/random.data.bz2") -) - func benchmarkDecode(b *testing.B, compressed []byte) { // Determine the uncompressed size of testfile. uncompressedSize, err := io.Copy(ioutil.Discard, NewReader(bytes.NewReader(compressed))) @@ -227,6 +221,18 @@ func benchmarkDecode(b *testing.B, compressed []byte) { } } -func BenchmarkDecodeDigits(b *testing.B) { benchmarkDecode(b, digits) } -func BenchmarkDecodeTwain(b *testing.B) { benchmarkDecode(b, twain) } -func BenchmarkDecodeRand(b *testing.B) { benchmarkDecode(b, random) } +func BenchmarkDecodeDigits(b *testing.B) { + digits := mustLoadFile("testdata/e.txt.bz2") + b.ResetTimer() + benchmarkDecode(b, digits) +} +func BenchmarkDecodeTwain(b *testing.B) { + twain := mustLoadFile("testdata/Mark.Twain-Tom.Sawyer.txt.bz2") + b.ResetTimer() + benchmarkDecode(b, twain) +} +func BenchmarkDecodeRand(b *testing.B) { + random := mustLoadFile("testdata/random.data.bz2") + b.ResetTimer() + benchmarkDecode(b, random) +} diff --git a/libgo/go/compress/flate/deflate.go b/libgo/go/compress/flate/deflate.go index 97265b3ca27..4d6a5357d88 100644 --- a/libgo/go/compress/flate/deflate.go +++ b/libgo/go/compress/flate/deflate.go @@ -136,14 +136,17 @@ func (d *compressor) fillDeflate(b []byte) int { delta := d.hashOffset - 1 d.hashOffset -= delta d.chainHead -= delta - for i, v := range d.hashPrev { + + // Iterate over slices instead of arrays to avoid copying + // the entire table onto the stack (Issue #18625). + for i, v := range d.hashPrev[:] { if int(v) > delta { d.hashPrev[i] = uint32(int(v) - delta) } else { d.hashPrev[i] = 0 } } - for i, v := range d.hashHead { + for i, v := range d.hashHead[:] { if int(v) > delta { d.hashHead[i] = uint32(int(v) - delta) } else { diff --git a/libgo/go/compress/flate/deflate_test.go b/libgo/go/compress/flate/deflate_test.go index 521a2603658..fbea761721a 100644 --- a/libgo/go/compress/flate/deflate_test.go +++ b/libgo/go/compress/flate/deflate_test.go @@ -12,6 +12,7 @@ import ( "io" "io/ioutil" "reflect" + "runtime/debug" "sync" "testing" ) @@ -864,3 +865,33 @@ func TestBestSpeedMaxMatchOffset(t *testing.T) { } } } + +func TestMaxStackSize(t *testing.T) { + // This test must not run in parallel with other tests as debug.SetMaxStack + // affects all goroutines. + n := debug.SetMaxStack(1 << 16) + defer debug.SetMaxStack(n) + + var wg sync.WaitGroup + defer wg.Wait() + + b := make([]byte, 1<<20) + for level := HuffmanOnly; level <= BestCompression; level++ { + // Run in separate goroutine to increase probability of stack regrowth. + wg.Add(1) + go func(level int) { + defer wg.Done() + zw, err := NewWriter(ioutil.Discard, level) + if err != nil { + t.Errorf("level %d, NewWriter() = %v, want nil", level, err) + } + if n, err := zw.Write(b); n != len(b) || err != nil { + t.Errorf("level %d, Write() = (%d, %v), want (%d, nil)", level, n, err, len(b)) + } + if err := zw.Close(); err != nil { + t.Errorf("level %d, Close() = %v, want nil", level, err) + } + zw.Reset(ioutil.Discard) + }(level) + } +} diff --git a/libgo/go/compress/flate/deflatefast.go b/libgo/go/compress/flate/deflatefast.go index a1636a37d67..08298b76bbb 100644 --- a/libgo/go/compress/flate/deflatefast.go +++ b/libgo/go/compress/flate/deflatefast.go @@ -60,7 +60,7 @@ func newDeflateFast() *deflateFast { func (e *deflateFast) encode(dst []token, src []byte) []token { // Ensure that e.cur doesn't wrap. if e.cur > 1<<30 { - *e = deflateFast{cur: maxStoreBlockSize, prev: e.prev[:0]} + e.resetAll() } // This check isn't in the Snappy implementation, but there, the caller @@ -265,6 +265,21 @@ func (e *deflateFast) reset() { // Protect against e.cur wraparound. if e.cur > 1<<30 { - *e = deflateFast{cur: maxStoreBlockSize, prev: e.prev[:0]} + e.resetAll() + } +} + +// resetAll resets the deflateFast struct and is only called in rare +// situations to prevent integer overflow. It manually resets each field +// to avoid causing large stack growth. +// +// See https://golang.org/issue/18636. +func (e *deflateFast) resetAll() { + // This is equivalent to: + // *e = deflateFast{cur: maxStoreBlockSize, prev: e.prev[:0]} + e.cur = maxStoreBlockSize + e.prev = e.prev[:0] + for i := range e.table { + e.table[i] = tableEntry{} } } diff --git a/libgo/go/compress/gzip/issue14937_test.go b/libgo/go/compress/gzip/issue14937_test.go index e76d47cc4ee..30c1390dfd7 100644 --- a/libgo/go/compress/gzip/issue14937_test.go +++ b/libgo/go/compress/gzip/issue14937_test.go @@ -9,11 +9,17 @@ import ( "testing" ) -// Per golang.org/issue/14937, check that every .gz file -// in the tree has a zero mtime. +// TestGZIPFilesHaveZeroMTimes checks that every .gz file in the tree +// has a zero MTIME. This is a requirement for the Debian maintainers +// to be able to have deterministic packages. +// +// See https://golang.org/issue/14937. func TestGZIPFilesHaveZeroMTimes(t *testing.T) { - if testing.Short() && testenv.Builder() == "" { - t.Skip("skipping in short mode") + // To avoid spurious false positives due to untracked GZIP files that + // may be in the user's GOROOT (Issue 18604), we only run this test on + // the builders, which should have a clean checkout of the tree. + if testenv.Builder() == "" { + t.Skip("skipping test on non-builder") } goroot, err := filepath.EvalSymlinks(runtime.GOROOT()) if err != nil { diff --git a/libgo/go/crypto/ecdsa/testdata/SigVer.rsp.bz2 b/libgo/go/crypto/ecdsa/testdata/SigVer.rsp.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..09fe2b4271aa2d31adaec27020d1a317ef44fe70 GIT binary patch literal 95485 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 z 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 = convert(, "bits"); +type ; diff --git a/libgo/go/go/internal/gccgoimporter/testdata/imports.gox b/libgo/go/go/internal/gccgoimporter/testdata/imports.gox new file mode 100644 index 00000000000..958a4f5b821 --- /dev/null +++ b/libgo/go/go/internal/gccgoimporter/testdata/imports.gox @@ -0,0 +1,7 @@ +v1; +package imports; +pkgpath imports; +priority 7; +import fmt fmt "fmt"; +init imports imports..import 7 math math..import 1 runtime runtime..import 1 strconv strconv..import 2 io io..import 3 reflect reflect..import 3 syscall syscall..import 3 time time..import 4 os os..import 5 fmt fmt..import 6; +var Hello ; diff --git a/libgo/go/go/internal/gccgoimporter/testdata/pointer.gox b/libgo/go/go/internal/gccgoimporter/testdata/pointer.gox new file mode 100644 index 00000000000..d96ebbdd141 --- /dev/null +++ b/libgo/go/go/internal/gccgoimporter/testdata/pointer.gox @@ -0,0 +1,4 @@ +v1; +package pointer; +pkgpath pointer; +type >>; diff --git a/libgo/go/go/internal/gccgoimporter/testdata/time.gox b/libgo/go/go/internal/gccgoimporter/testdata/time.gox new file mode 100644 index 0000000000000000000000000000000000000000..80c2dbcb472813d114032c583c85134a8f340590 GIT binary patch literal 7977 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 + mi>>16&1 + mi>>32&1) + logSizeofUint = uint(mu>>8&1 + mu>>16&1 + mu>>32&1) + logSizeofUintptr = uint(mp>>8&1 + mp>>16&1 + mp>>32&1) +) + +const ( + minInt8 = -1<<(8< 0) + _ = assert(smallestFloat64 > 0) +) + +const ( + maxFloat32 = 1<<127 * (1<<24 - 1) / (1.0<<23) + maxFloat64 = 1<<1023 * (1<<53 - 1) / (1.0<<52) +) + +const ( + _ int8 = minInt8 /* ERROR "overflows" */ - 1 + _ int8 = minInt8 + _ int8 = maxInt8 + _ int8 = maxInt8 /* ERROR "overflows" */ + 1 + _ int8 = smallestFloat64 /* ERROR "truncated" */ + + _ = int8(minInt8 /* ERROR "cannot convert" */ - 1) + _ = int8(minInt8) + _ = int8(maxInt8) + _ = int8(maxInt8 /* ERROR "cannot convert" */ + 1) + _ = int8(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int16 = minInt16 /* ERROR "overflows" */ - 1 + _ int16 = minInt16 + _ int16 = maxInt16 + _ int16 = maxInt16 /* ERROR "overflows" */ + 1 + _ int16 = smallestFloat64 /* ERROR "truncated" */ + + _ = int16(minInt16 /* ERROR "cannot convert" */ - 1) + _ = int16(minInt16) + _ = int16(maxInt16) + _ = int16(maxInt16 /* ERROR "cannot convert" */ + 1) + _ = int16(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int32 = minInt32 /* ERROR "overflows" */ - 1 + _ int32 = minInt32 + _ int32 = maxInt32 + _ int32 = maxInt32 /* ERROR "overflows" */ + 1 + _ int32 = smallestFloat64 /* ERROR "truncated" */ + + _ = int32(minInt32 /* ERROR "cannot convert" */ - 1) + _ = int32(minInt32) + _ = int32(maxInt32) + _ = int32(maxInt32 /* ERROR "cannot convert" */ + 1) + _ = int32(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int64 = minInt64 /* ERROR "overflows" */ - 1 + _ int64 = minInt64 + _ int64 = maxInt64 + _ int64 = maxInt64 /* ERROR "overflows" */ + 1 + _ int64 = smallestFloat64 /* ERROR "truncated" */ + + _ = int64(minInt64 /* ERROR "cannot convert" */ - 1) + _ = int64(minInt64) + _ = int64(maxInt64) + _ = int64(maxInt64 /* ERROR "cannot convert" */ + 1) + _ = int64(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int = minInt /* ERROR "overflows" */ - 1 + _ int = minInt + _ int = maxInt + _ int = maxInt /* ERROR "overflows" */ + 1 + _ int = smallestFloat64 /* ERROR "truncated" */ + + _ = int(minInt /* ERROR "cannot convert" */ - 1) + _ = int(minInt) + _ = int(maxInt) + _ = int(maxInt /* ERROR "cannot convert" */ + 1) + _ = int(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint8 = 0 /* ERROR "overflows" */ - 1 + _ uint8 = 0 + _ uint8 = maxUint8 + _ uint8 = maxUint8 /* ERROR "overflows" */ + 1 + _ uint8 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint8(0 /* ERROR "cannot convert" */ - 1) + _ = uint8(0) + _ = uint8(maxUint8) + _ = uint8(maxUint8 /* ERROR "cannot convert" */ + 1) + _ = uint8(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint16 = 0 /* ERROR "overflows" */ - 1 + _ uint16 = 0 + _ uint16 = maxUint16 + _ uint16 = maxUint16 /* ERROR "overflows" */ + 1 + _ uint16 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint16(0 /* ERROR "cannot convert" */ - 1) + _ = uint16(0) + _ = uint16(maxUint16) + _ = uint16(maxUint16 /* ERROR "cannot convert" */ + 1) + _ = uint16(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint32 = 0 /* ERROR "overflows" */ - 1 + _ uint32 = 0 + _ uint32 = maxUint32 + _ uint32 = maxUint32 /* ERROR "overflows" */ + 1 + _ uint32 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint32(0 /* ERROR "cannot convert" */ - 1) + _ = uint32(0) + _ = uint32(maxUint32) + _ = uint32(maxUint32 /* ERROR "cannot convert" */ + 1) + _ = uint32(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint64 = 0 /* ERROR "overflows" */ - 1 + _ uint64 = 0 + _ uint64 = maxUint64 + _ uint64 = maxUint64 /* ERROR "overflows" */ + 1 + _ uint64 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint64(0 /* ERROR "cannot convert" */ - 1) + _ = uint64(0) + _ = uint64(maxUint64) + _ = uint64(maxUint64 /* ERROR "cannot convert" */ + 1) + _ = uint64(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint = 0 /* ERROR "overflows" */ - 1 + _ uint = 0 + _ uint = maxUint + _ uint = maxUint /* ERROR "overflows" */ + 1 + _ uint = smallestFloat64 /* ERROR "truncated" */ + + _ = uint(0 /* ERROR "cannot convert" */ - 1) + _ = uint(0) + _ = uint(maxUint) + _ = uint(maxUint /* ERROR "cannot convert" */ + 1) + _ = uint(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uintptr = 0 /* ERROR "overflows" */ - 1 + _ uintptr = 0 + _ uintptr = maxUintptr + _ uintptr = maxUintptr /* ERROR "overflows" */ + 1 + _ uintptr = smallestFloat64 /* ERROR "truncated" */ + + _ = uintptr(0 /* ERROR "cannot convert" */ - 1) + _ = uintptr(0) + _ = uintptr(maxUintptr) + _ = uintptr(maxUintptr /* ERROR "cannot convert" */ + 1) + _ = uintptr(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ float32 = minInt64 + _ float64 = minInt64 + _ complex64 = minInt64 + _ complex128 = minInt64 + + _ = float32(minInt64) + _ = float64(minInt64) + _ = complex64(minInt64) + _ = complex128(minInt64) +) + +const ( + _ float32 = maxUint64 + _ float64 = maxUint64 + _ complex64 = maxUint64 + _ complex128 = maxUint64 + + _ = float32(maxUint64) + _ = float64(maxUint64) + _ = complex64(maxUint64) + _ = complex128(maxUint64) +) + +// TODO(gri) find smaller deltas below + +const delta32 = maxFloat32/(1 << 23) + +const ( + _ float32 = - /* ERROR "overflow" */ (maxFloat32 + delta32) + _ float32 = -maxFloat32 + _ float32 = maxFloat32 + _ float32 = maxFloat32 /* ERROR "overflow" */ + delta32 + + _ = float32(- /* ERROR "cannot convert" */ (maxFloat32 + delta32)) + _ = float32(-maxFloat32) + _ = float32(maxFloat32) + _ = float32(maxFloat32 /* ERROR "cannot convert" */ + delta32) + + _ = assert(float32(smallestFloat32) == smallestFloat32) + _ = assert(float32(smallestFloat32/2) == 0) + _ = assert(float32(smallestFloat64) == 0) + _ = assert(float32(smallestFloat64/2) == 0) +) + +const delta64 = maxFloat64/(1 << 52) + +const ( + _ float64 = - /* ERROR "overflow" */ (maxFloat64 + delta64) + _ float64 = -maxFloat64 + _ float64 = maxFloat64 + _ float64 = maxFloat64 /* ERROR "overflow" */ + delta64 + + _ = float64(- /* ERROR "cannot convert" */ (maxFloat64 + delta64)) + _ = float64(-maxFloat64) + _ = float64(maxFloat64) + _ = float64(maxFloat64 /* ERROR "cannot convert" */ + delta64) + + _ = assert(float64(smallestFloat32) == smallestFloat32) + _ = assert(float64(smallestFloat32/2) == smallestFloat32/2) + _ = assert(float64(smallestFloat64) == smallestFloat64) + _ = assert(float64(smallestFloat64/2) == 0) +) + +const ( + _ complex64 = - /* ERROR "overflow" */ (maxFloat32 + delta32) + _ complex64 = -maxFloat32 + _ complex64 = maxFloat32 + _ complex64 = maxFloat32 /* ERROR "overflow" */ + delta32 + + _ = complex64(- /* ERROR "cannot convert" */ (maxFloat32 + delta32)) + _ = complex64(-maxFloat32) + _ = complex64(maxFloat32) + _ = complex64(maxFloat32 /* ERROR "cannot convert" */ + delta32) +) + +const ( + _ complex128 = - /* ERROR "overflow" */ (maxFloat64 + delta64) + _ complex128 = -maxFloat64 + _ complex128 = maxFloat64 + _ complex128 = maxFloat64 /* ERROR "overflow" */ + delta64 + + _ = complex128(- /* ERROR "cannot convert" */ (maxFloat64 + delta64)) + _ = complex128(-maxFloat64) + _ = complex128(maxFloat64) + _ = complex128(maxFloat64 /* ERROR "cannot convert" */ + delta64) +) + +// Initialization of typed constant and conversion are the same: +const ( + f32 = 1 + smallestFloat32 + x32 float32 = f32 + y32 = float32(f32) + _ = assert(x32 - y32 == 0) +) + +const ( + f64 = 1 + smallestFloat64 + x64 float64 = f64 + y64 = float64(f64) + _ = assert(x64 - y64 == 0) +) + +const ( + _ = int8(-1) << 7 + _ = int8 /* ERROR "overflows" */ (-1) << 8 + + _ = uint32(1) << 31 + _ = uint32 /* ERROR "overflows" */ (1) << 32 +) diff --git a/libgo/go/go/types/testdata/constdecl.src b/libgo/go/go/types/testdata/constdecl.src new file mode 100644 index 00000000000..6de9b13d6ef --- /dev/null +++ b/libgo/go/go/types/testdata/constdecl.src @@ -0,0 +1,97 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package constdecl + +import "math" + +var v int + +// Const decls must be initialized by constants. +const _ = v /* ERROR "not constant" */ +const _ = math /* ERROR "not constant" */ .Sin(0) +const _ = int /* ERROR "not an expression" */ + +func _() { + const _ = v /* ERROR "not constant" */ + const _ = math /* ERROR "not constant" */ .Sin(0) + const _ = int /* ERROR "not an expression" */ +} + +// Identifier and expression arity must match. +// The first error message is produced by the parser. +// In a real-world scenario, the type-checker would not be run +// in this case and the 2nd error message would not appear. +const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ +const _ = 1, 2 /* ERROR "extra init expr 2" */ + +const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int +const _ int = 1, 2 /* ERROR "extra init expr 2" */ + +const ( + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ + _ = 1, 2 /* ERROR "extra init expr 2" */ + + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int + _ int = 1, 2 /* ERROR "extra init expr 2" */ +) + +const ( + _ = 1 + _ + _, _ /* ERROR "missing init expr for _" */ + _ +) + +const ( + _, _ = 1, 2 + _, _ + _ /* ERROR "extra init expr at" */ + _, _ + _, _, _ /* ERROR "missing init expr for _" */ + _, _ +) + +func _() { + const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ + const _ = 1, 2 /* ERROR "extra init expr 2" */ + + const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int + const _ int = 1, 2 /* ERROR "extra init expr 2" */ + + const ( + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ + _ = 1, 2 /* ERROR "extra init expr 2" */ + + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int + _ int = 1, 2 /* ERROR "extra init expr 2" */ + ) + + const ( + _ = 1 + _ + _, _ /* ERROR "missing init expr for _" */ + _ + ) + + const ( + _, _ = 1, 2 + _, _ + _ /* ERROR "extra init expr at" */ + _, _ + _, _, _ /* ERROR "missing init expr for _" */ + _, _ + ) +} + +// Test case for constant with invalid initialization. +// Caused panic because the constant value was not set up (gri - 7/8/2014). +func _() { + const ( + x string = missing /* ERROR "undeclared name" */ + y = x + "" + ) +} + +// TODO(gri) move extra tests from testdata/const0.src into here diff --git a/libgo/go/go/types/testdata/conversions.src b/libgo/go/go/types/testdata/conversions.src new file mode 100644 index 00000000000..e1336c0456a --- /dev/null +++ b/libgo/go/go/types/testdata/conversions.src @@ -0,0 +1,93 @@ +// 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. + +// conversions + +package conversions + +import "unsafe" + +// argument count +var ( + _ = int() /* ERROR "missing argument" */ + _ = int(1, 2 /* ERROR "too many arguments" */ ) +) + +// numeric constant conversions are in const1.src. + +func string_conversions() { + const A = string(65) + assert(A == "A") + const E = string(-1) + assert(E == "\uFFFD") + assert(E == string(1234567890)) + + type myint int + assert(A == string(myint(65))) + + type mystring string + const _ mystring = mystring("foo") + + const _ = string(true /* ERROR "cannot convert" */ ) + const _ = string(1.2 /* ERROR "cannot convert" */ ) + const _ = string(nil /* ERROR "cannot convert" */ ) + + // issues 11357, 11353: argument must be of integer type + _ = string(0.0 /* ERROR "cannot convert" */ ) + _ = string(0i /* ERROR "cannot convert" */ ) + _ = string(1 /* ERROR "cannot convert" */ + 2i) +} + +func interface_conversions() { + type E interface{} + + type I1 interface{ + m1() + } + + type I2 interface{ + m1() + m2(x int) + } + + type I3 interface{ + m1() + m2() int + } + + var e E + var i1 I1 + var i2 I2 + var i3 I3 + + _ = E(0) + _ = E(nil) + _ = E(e) + _ = E(i1) + _ = E(i2) + + _ = I1(0 /* ERROR "cannot convert" */ ) + _ = I1(nil) + _ = I1(i1) + _ = I1(e /* ERROR "cannot convert" */ ) + _ = I1(i2) + + _ = I2(nil) + _ = I2(i1 /* ERROR "cannot convert" */ ) + _ = I2(i2) + _ = I2(i3 /* ERROR "cannot convert" */ ) + + _ = I3(nil) + _ = I3(i1 /* ERROR "cannot convert" */ ) + _ = I3(i2 /* ERROR "cannot convert" */ ) + _ = I3(i3) + + // TODO(gri) add more tests, improve error message +} + +func issue6326() { + type T unsafe.Pointer + var x T + _ = uintptr(x) // see issue 6326 +} diff --git a/libgo/go/go/types/testdata/conversions2.src b/libgo/go/go/types/testdata/conversions2.src new file mode 100644 index 00000000000..93a5f182fb4 --- /dev/null +++ b/libgo/go/go/types/testdata/conversions2.src @@ -0,0 +1,313 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test various valid and invalid struct assignments and conversions. +// Does not compile. + +package conversions2 + +type I interface { + m() +} + +// conversions between structs + +func _() { + type S struct{} + type T struct{} + var s S + var t T + var u struct{} + s = s + s = t // ERROR "cannot use .* in assignment" + s = u + s = S(s) + s = S(t) + s = S(u) + t = u + t = T(u) +} + +func _() { + type S struct{ x int } + type T struct { + x int "foo" + } + var s S + var t T + var u struct { + x int "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = S(s) + s = S(t) + s = S(u) + t = u // ERROR "cannot use .* in assignment" + t = T(u) +} + +func _() { + type E struct{ x int } + type S struct{ x E } + type T struct { + x E "foo" + } + var s S + var t T + var u struct { + x E "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = S(s) + s = S(t) + s = S(u) + t = u // ERROR "cannot use .* in assignment" + t = T(u) +} + +func _() { + type S struct { + x struct { + x int "foo" + } + } + type T struct { + x struct { + x int "bar" + } "foo" + } + var s S + var t T + var u struct { + x struct { + x int "bar" + } "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = S(s) + s = S(t) + s = S(u) + t = u // ERROR "cannot use .* in assignment" + t = T(u) +} + +func _() { + type E1 struct { + x int "foo" + } + type E2 struct { + x int "bar" + } + type S struct{ x E1 } + type T struct { + x E2 "foo" + } + var s S + var t T + var u struct { + x E2 "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = S(s) + s = S(t /* ERROR "cannot convert" */ ) + s = S(u /* ERROR "cannot convert" */ ) + t = u // ERROR "cannot use .* in assignment" + t = T(u) +} + +func _() { + type E struct{ x int } + type S struct { + f func(struct { + x int "foo" + }) + } + type T struct { + f func(struct { + x int "bar" + }) + } + var s S + var t T + var u struct{ f func(E) } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = S(s) + s = S(t) + s = S(u /* ERROR "cannot convert" */ ) + t = u // ERROR "cannot use .* in assignment" + t = T(u /* ERROR "cannot convert" */ ) +} + +// conversions between pointers to structs + +func _() { + type S struct{} + type T struct{} + var s *S + var t *T + var u *struct{} + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = (*S)(s) + s = (*S)(t) + s = (*S)(u) + t = u // ERROR "cannot use .* in assignment" + t = (*T)(u) +} + +func _() { + type S struct{ x int } + type T struct { + x int "foo" + } + var s *S + var t *T + var u *struct { + x int "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = (*S)(s) + s = (*S)(t) + s = (*S)(u) + t = u // ERROR "cannot use .* in assignment" + t = (*T)(u) +} + +func _() { + type E struct{ x int } + type S struct{ x E } + type T struct { + x E "foo" + } + var s *S + var t *T + var u *struct { + x E "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = (*S)(s) + s = (*S)(t) + s = (*S)(u) + t = u // ERROR "cannot use .* in assignment" + t = (*T)(u) +} + +func _() { + type S struct { + x struct { + x int "foo" + } + } + type T struct { + x struct { + x int "bar" + } "foo" + } + var s *S + var t *T + var u *struct { + x struct { + x int "bar" + } "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = (*S)(s) + s = (*S)(t) + s = (*S)(u) + t = u // ERROR "cannot use .* in assignment" + t = (*T)(u) +} + +func _() { + type E1 struct { + x int "foo" + } + type E2 struct { + x int "bar" + } + type S struct{ x E1 } + type T struct { + x E2 "foo" + } + var s *S + var t *T + var u *struct { + x E2 "bar" + } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = (*S)(s) + s = (*S)(t /* ERROR "cannot convert" */ ) + s = (*S)(u /* ERROR "cannot convert" */ ) + t = u // ERROR "cannot use .* in assignment" + t = (*T)(u) +} + +func _() { + type E struct{ x int } + type S struct { + f func(struct { + x int "foo" + }) + } + type T struct { + f func(struct { + x int "bar" + }) + } + var s *S + var t *T + var u *struct{ f func(E) } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = (*S)(s) + s = (*S)(t) + s = (*S)(u /* ERROR "cannot convert" */ ) + t = u // ERROR "cannot use .* in assignment" + t = (*T)(u /* ERROR "cannot convert" */ ) +} + +func _() { + type E struct{ x int } + type S struct { + f func(*struct { + x int "foo" + }) + } + type T struct { + f func(*struct { + x int "bar" + }) + } + var s *S + var t *T + var u *struct{ f func(E) } + s = s + s = t // ERROR "cannot use .* in assignment" + s = u // ERROR "cannot use .* in assignment" + s = (*S)(s) + s = (*S)(t) + s = (*S)(u /* ERROR "cannot convert" */ ) + t = u // ERROR "cannot use .* in assignment" + t = (*T)(u /* ERROR "cannot convert" */ ) +} diff --git a/libgo/go/go/types/testdata/cycles.src b/libgo/go/go/types/testdata/cycles.src new file mode 100644 index 00000000000..621d83c9450 --- /dev/null +++ b/libgo/go/go/types/testdata/cycles.src @@ -0,0 +1,143 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cycles + +type ( + T0 int + T1 /* ERROR cycle */ T1 + T2 *T2 + + T3 /* ERROR cycle */ T4 + T4 T5 + T5 T3 + + T6 T7 + T7 *T8 + T8 T6 + + // arrays + A0 /* ERROR cycle */ [10]A0 + A1 [10]*A1 + + A2 /* ERROR cycle */ [10]A3 + A3 [10]A4 + A4 A2 + + A5 [10]A6 + A6 *A5 + + // slices + L0 []L0 + + // structs + S0 /* ERROR cycle */ struct{ _ S0 } + S1 /* ERROR cycle */ struct{ S1 } + S2 struct{ _ *S2 } + S3 struct{ *S3 } + + S4 /* ERROR cycle */ struct{ S5 } + S5 struct{ S6 } + S6 S4 + + // pointers + P0 *P0 + + // functions + F0 func(F0) + F1 func() F1 + F2 func(F2) F2 + + // interfaces + I0 /* ERROR cycle */ interface{ I0 } + + I1 interface{ I2 } + I2 interface{ I3 } + I3 /* ERROR cycle */ interface{ I1 } + + I4 interface{ f(I4) } + + // testcase for issue 5090 + I5 interface{ f(I6) } + I6 interface{ I5 } + + // maps + M0 map[M0 /* ERROR invalid map key */ ]M0 + + // channels + C0 chan C0 +) + +func _() { + type ( + t1 /* ERROR cycle */ t1 + t2 *t2 + + t3 t4 /* ERROR undeclared */ + t4 t5 /* ERROR undeclared */ + t5 t3 + + // arrays + a0 /* ERROR cycle */ [10]a0 + a1 [10]*a1 + + // slices + l0 []l0 + + // structs + s0 /* ERROR cycle */ struct{ _ s0 } + s1 /* ERROR cycle */ struct{ s1 } + s2 struct{ _ *s2 } + s3 struct{ *s3 } + + // pointers + p0 *p0 + + // functions + f0 func(f0) + f1 func() f1 + f2 func(f2) f2 + + // interfaces + i0 /* ERROR cycle */ interface{ i0 } + + // maps + m0 map[m0 /* ERROR invalid map key */ ]m0 + + // channels + c0 chan c0 + ) +} + +// test cases for issue 6667 + +type A [10]map[A /* ERROR invalid map key */ ]bool + +type S struct { + m map[S /* ERROR invalid map key */ ]bool +} + +// test cases for issue 7236 +// (cycle detection must not be dependent on starting point of resolution) + +type ( + P1 *T9 + T9 /* ERROR cycle */ T9 + + T10 /* ERROR cycle */ T10 + P2 *T10 +) + +func (T11) m() {} + +type T11 /* ERROR cycle */ struct{ T11 } + +type T12 /* ERROR cycle */ struct{ T12 } + +func (*T12) m() {} + +type ( + P3 *T13 + T13 /* ERROR cycle */ T13 +) \ No newline at end of file diff --git a/libgo/go/go/types/testdata/cycles1.src b/libgo/go/go/types/testdata/cycles1.src new file mode 100644 index 00000000000..ae2b38ebec2 --- /dev/null +++ b/libgo/go/go/types/testdata/cycles1.src @@ -0,0 +1,77 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +type ( + A interface { + a() interface { + ABC1 + } + } + B interface { + b() interface { + ABC2 + } + } + C interface { + c() interface { + ABC3 + } + } + + AB interface { + A + B + } + BC interface { + B + C + } + + ABC1 interface { + A + B + C + } + ABC2 interface { + AB + C + } + ABC3 interface { + A + BC + } +) + +var ( + x1 ABC1 + x2 ABC2 + x3 ABC3 +) + +func _() { + // all types have the same method set + x1 = x2 + x2 = x1 + + x1 = x3 + x3 = x1 + + x2 = x3 + x3 = x2 + + // all methods return the same type again + x1 = x1.a() + x1 = x1.b() + x1 = x1.c() + + x2 = x2.a() + x2 = x2.b() + x2 = x2.c() + + x3 = x3.a() + x3 = x3.b() + x3 = x3.c() +} diff --git a/libgo/go/go/types/testdata/cycles2.src b/libgo/go/go/types/testdata/cycles2.src new file mode 100644 index 00000000000..345ab56ea69 --- /dev/null +++ b/libgo/go/go/types/testdata/cycles2.src @@ -0,0 +1,118 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +import "unsafe" + +// Test case for issue 5090 + +type t interface { + f(u) +} + +type u interface { + t +} + +func _() { + var t t + var u u + + t.f(t) + t.f(u) + + u.f(t) + u.f(u) +} + + +// Test case for issue 6589. + +type A interface { + a() interface { + AB + } +} + +type B interface { + a() interface { + AB + } +} + +type AB interface { + a() interface { + A + B /* ERROR a redeclared */ + } + b() interface { + A + B /* ERROR a redeclared */ + } +} + +var x AB +var y interface { + A + B /* ERROR a redeclared */ +} +var _ = x /* ERROR cannot compare */ == y + + +// Test case for issue 6638. + +type T interface { + m() [T /* ERROR no value */ (nil).m()[0]]int +} + +// Variations of this test case. + +type T1 interface { + m() [x1 /* ERROR no value */ .m()[0]]int +} + +var x1 T1 + +type T2 interface { + m() [len(x2 /* ERROR no value */ .m())]int +} + +var x2 T2 + +type T3 interface { + m() [unsafe.Sizeof(x3.m)]int +} + +var x3 T3 + +// The test case below should also report an error for +// the cast inside the T4 interface (like it does for the +// variable initialization). The reason why it does not is +// that inside T4, the method x4.m depends on T4 which is not +// fully set up yet. The x4.m method happens to have an empty +// signature which is why the cast is permitted. +// TODO(gri) Consider marking methods as incomplete and provide +// a better error message in that case. + +type T4 interface { + m() [unsafe.Sizeof(cast4(x4.m))]int +} + +var x4 T4 +var _ = cast4(x4 /* ERROR cannot convert */.m) + +type cast4 func() + +// This test is symmetric to the T4 case: Here the cast is +// "correct", but it doesn't work inside the T5 interface. + +type T5 interface { + m() [unsafe.Sizeof(cast5(x5 /* ERROR cannot convert */ .m))]int +} + +var x5 T5 +var _ = cast5(x5.m) + +type cast5 func() [0]int diff --git a/libgo/go/go/types/testdata/cycles3.src b/libgo/go/go/types/testdata/cycles3.src new file mode 100644 index 00000000000..3da4fb5761a --- /dev/null +++ b/libgo/go/go/types/testdata/cycles3.src @@ -0,0 +1,60 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +import "unsafe" + +var ( + _ A = A(nil).a().b().c().d().e().f() + _ A = A(nil).b().c().d().e().f() + _ A = A(nil).c().d().e().f() + _ A = A(nil).d().e().f() + _ A = A(nil).e().f() + _ A = A(nil).f() + _ A = A(nil) +) + +type ( + A interface { + a() B + B + } + + B interface { + b() C + C + } + + C interface { + c() D + D + } + + D interface { + d() E + E + } + + E interface { + e() F + F + } + + F interface { + f() A + } +) + +type ( + U interface { + V + } + + V interface { + v() [unsafe.Sizeof(u)]int + } +) + +var u U diff --git a/libgo/go/go/types/testdata/cycles4.src b/libgo/go/go/types/testdata/cycles4.src new file mode 100644 index 00000000000..445babca68b --- /dev/null +++ b/libgo/go/go/types/testdata/cycles4.src @@ -0,0 +1,110 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +// Check that all methods of T are collected before +// determining the result type of m (which embeds +// all methods of T). + +type T interface { + m() interface {T} + E +} + +var _ = T.m(nil).m().e() + +type E interface { + e() int +} + +// Check that unresolved forward chains are followed +// (see also comment in resolver.go, checker.typeDecl). + +var _ = C.m(nil).m().e() + +type A B + +type B interface { + m() interface{C} + E +} + +type C A + +// Check that interface type comparison for identity +// does not recur endlessly. + +type T1 interface { + m() interface{T1} +} + +type T2 interface { + m() interface{T2} +} + +func _(x T1, y T2) { + // Checking for assignability of interfaces must check + // if all methods of x are present in y, and that they + // have identical signatures. The signatures recur via + // the result type, which is an interface that embeds + // a single method m that refers to the very interface + // that contains it. This requires cycle detection in + // identity checks for interface types. + x = y +} + +type T3 interface { + m() interface{T4} +} + +type T4 interface { + m() interface{T3} +} + +func _(x T1, y T3) { + x = y +} + +// Check that interfaces are type-checked in order of +// (embedded interface) dependencies (was issue 7158). + +var x1 T5 = T7(nil) + +type T5 interface { + T6 +} + +type T6 interface { + m() T7 +} +type T7 interface { + T5 +} + +// Actual test case from issue 7158. + +func wrapNode() Node { + return wrapElement() +} + +func wrapElement() Element { + return nil +} + +type EventTarget interface { + AddEventListener(Event) +} + +type Node interface { + EventTarget +} + +type Element interface { + Node +} + +type Event interface { + Target() Element +} diff --git a/libgo/go/go/types/testdata/decls0.src b/libgo/go/go/types/testdata/decls0.src new file mode 100644 index 00000000000..d4df386b132 --- /dev/null +++ b/libgo/go/go/types/testdata/decls0.src @@ -0,0 +1,210 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// type declarations + +package decls0 + +import "unsafe" + +const pi = 3.1415 + +type ( + N undeclared /* ERROR "undeclared" */ + B bool + I int32 + A [10]P + T struct { + x, y P + } + P *T + R (*R) + F func(A) I + Y interface { + f(A) I + } + S [](((P))) + M map[I]F + C chan<- I + + // blank types must be typechecked + _ pi /* ERROR "not a type" */ + _ struct{} + _ struct{ pi /* ERROR "not a type" */ } +) + + +// declarations of init +const _, init /* ERROR "cannot declare init" */ , _ = 0, 1, 2 +type init /* ERROR "cannot declare init" */ struct{} +var _, init /* ERROR "cannot declare init" */ int + +func init() {} +func init /* ERROR "missing function body" */ () + +func _() { const init = 0 } +func _() { type init int } +func _() { var init int; _ = init } + +// invalid array types +type ( + iA0 [... /* ERROR "invalid use of '...'" */ ]byte + // The error message below could be better. At the moment + // we believe an integer that is too large is not an integer. + // But at least we get an error. + iA1 [1 /* ERROR "must be integer" */ <<100]int + iA2 [- /* ERROR "invalid array length" */ 1]complex128 + iA3 ["foo" /* ERROR "must be integer" */ ]string + iA4 [float64 /* ERROR "must be integer" */ (0)]int +) + + +type ( + p1 pi /* ERROR "no field or method foo" */ .foo + p2 unsafe.Pointer +) + + +type ( + Pi pi /* ERROR "not a type" */ + + a /* ERROR "illegal cycle" */ a + a /* ERROR "redeclared" */ int + + // where the cycle error appears depends on the + // order in which declarations are processed + // (which depends on the order in which a map + // is iterated through) + b /* ERROR "illegal cycle" */ c + c d + d e + e b + + t *t + + U V + V *W + W U + + P1 *S2 + P2 P1 + + S0 struct { + } + S1 struct { + a, b, c int + u, v, a /* ERROR "redeclared" */ float32 + } + S2 struct { + S0 // anonymous field + S0 /* ERROR "redeclared" */ int + } + S3 struct { + x S2 + } + S4/* ERROR "illegal cycle" */ struct { + S4 + } + S5 /* ERROR "illegal cycle" */ struct { + S6 + } + S6 struct { + field S7 + } + S7 struct { + S5 + } + + L1 []L1 + L2 []int + + A1 [10.0]int + A2 /* ERROR "illegal cycle" */ [10]A2 + A3 /* ERROR "illegal cycle" */ [10]struct { + x A4 + } + A4 [10]A3 + + F1 func() + F2 func(x, y, z float32) + F3 func(x, y, x /* ERROR "redeclared" */ float32) + F4 func() (x, y, x /* ERROR "redeclared" */ float32) + F5 func(x int) (x /* ERROR "redeclared" */ float32) + F6 func(x ...int) + + I1 interface{} + I2 interface { + m1() + } + I3 interface { + m1() + m1 /* ERROR "redeclared" */ () + } + I4 interface { + m1(x, y, x /* ERROR "redeclared" */ float32) + m2() (x, y, x /* ERROR "redeclared" */ float32) + m3(x int) (x /* ERROR "redeclared" */ float32) + } + I5 interface { + m1(I5) + } + I6 interface { + S0 /* ERROR "not an interface" */ + } + I7 interface { + I1 + I1 + } + I8 /* ERROR "illegal cycle" */ interface { + I8 + } + I9 interface { + I10 + } + I10 interface { + I11 + } + I11 /* ERROR "illegal cycle" */ interface { + I9 + } + + C1 chan int + C2 <-chan int + C3 chan<- C3 + C4 chan C5 + C5 chan C6 + C6 chan C4 + + M1 map[Last]string + M2 map[string]M2 + + Last int +) + +// cycles in function/method declarations +// (test cases for issue 5217 and variants) +func f1(x f1 /* ERROR "not a type" */ ) {} +func f2(x *f2 /* ERROR "not a type" */ ) {} +func f3() (x f3 /* ERROR "not a type" */ ) { return } +func f4() (x *f4 /* ERROR "not a type" */ ) { return } + +func (S0) m1(x S0 /* ERROR "field or method" */ .m1) {} +func (S0) m2(x *S0 /* ERROR "field or method" */ .m2) {} +func (S0) m3() (x S0 /* ERROR "field or method" */ .m3) { return } +func (S0) m4() (x *S0 /* ERROR "field or method" */ .m4) { return } + +// interfaces may not have any blank methods +type BlankI interface { + _ /* ERROR "invalid method name" */ () + _ /* ERROR "invalid method name" */ (float32) int + m() +} + +// non-interface types may have multiple blank methods +type BlankT struct{} + +func (BlankT) _() {} +func (BlankT) _(int) {} +func (BlankT) _() int { return 0 } +func (BlankT) _(int) int { return 0} diff --git a/libgo/go/go/types/testdata/decls1.src b/libgo/go/go/types/testdata/decls1.src new file mode 100644 index 00000000000..cb162f7aa7b --- /dev/null +++ b/libgo/go/go/types/testdata/decls1.src @@ -0,0 +1,144 @@ +// 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. + +// variable declarations + +package decls1 + +import ( + "math" +) + +// Global variables without initialization +var ( + a, b bool + c byte + d uint8 + r rune + i int + j, k, l int + x, y float32 + xx, yy float64 + u, v complex64 + uu, vv complex128 + s, t string + array []byte + iface interface{} + + blank _ /* ERROR "cannot use _" */ +) + +// Global variables with initialization +var ( + s1 = i + j + s2 = i /* ERROR "mismatched types" */ + x + s3 = c + d + s4 = s + t + s5 = s /* ERROR "invalid operation" */ / t + s6 = array[t1] + s7 = array[x /* ERROR "integer" */] + s8 = &a + s10 = &42 /* ERROR "cannot take address" */ + s11 = &v + s12 = -(u + *t11) / *&v + s13 = a /* ERROR "shifted operand" */ << d + s14 = i << j /* ERROR "must be unsigned" */ + s18 = math.Pi * 10.0 + s19 = s1 /* ERROR "cannot call" */ () + s20 = f0 /* ERROR "no value" */ () + s21 = f6(1, s1, i) + s22 = f6(1, s1, uu /* ERROR "cannot use .* in argument" */ ) + + t1 int = i + j + t2 int = i /* ERROR "mismatched types" */ + x + t3 int = c /* ERROR "cannot use .* variable declaration" */ + d + t4 string = s + t + t5 string = s /* ERROR "invalid operation" */ / t + t6 byte = array[t1] + t7 byte = array[x /* ERROR "must be integer" */] + t8 *int = & /* ERROR "cannot use .* variable declaration" */ a + t10 *int = &42 /* ERROR "cannot take address" */ + t11 *complex64 = &v + t12 complex64 = -(u + *t11) / *&v + t13 int = a /* ERROR "shifted operand" */ << d + t14 int = i << j /* ERROR "must be unsigned" */ + t15 math /* ERROR "not in selector" */ + t16 math /* ERROR "not declared" */ .xxx + t17 math /* ERROR "not a type" */ .Pi + t18 float64 = math.Pi * 10.0 + t19 int = t1 /* ERROR "cannot call" */ () + t20 int = f0 /* ERROR "no value" */ () + t21 int = a /* ERROR "cannot use .* variable declaration" */ +) + +// Various more complex expressions +var ( + u1 = x /* ERROR "not an interface" */ .(int) + u2 = iface.([]int) + u3 = iface.(a /* ERROR "not a type" */ ) + u4, ok = iface.(int) + u5, ok2, ok3 = iface /* ERROR "assignment count mismatch" */ .(int) +) + +// Constant expression initializations +var ( + v1 = 1 /* ERROR "cannot convert" */ + "foo" + v2 = c + 255 + v3 = c + 256 /* ERROR "overflows" */ + v4 = r + 2147483647 + v5 = r + 2147483648 /* ERROR "overflows" */ + v6 = 42 + v7 = v6 + 9223372036854775807 + v8 = v6 + 9223372036854775808 /* ERROR "overflows" */ + v9 = i + 1 << 10 + v10 byte = 1024 /* ERROR "overflows" */ + v11 = xx/yy*yy - xx + v12 = true && false + v13 = nil /* ERROR "use of untyped nil" */ +) + +// Multiple assignment expressions +var ( + m1a, m1b = 1, 2 + m2a, m2b, m2c /* ERROR "missing init expr for m2c" */ = 1, 2 + m3a, m3b = 1, 2, 3 /* ERROR "extra init expr 3" */ +) + +func _() { + var ( + m1a, m1b = 1, 2 + m2a, m2b, m2c /* ERROR "missing init expr for m2c" */ = 1, 2 + m3a, m3b = 1, 2, 3 /* ERROR "extra init expr 3" */ + ) + + _, _ = m1a, m1b + _, _, _ = m2a, m2b, m2c + _, _ = m3a, m3b +} + +// Declaration of parameters and results +func f0() {} +func f1(a /* ERROR "not a type" */) {} +func f2(a, b, c d /* ERROR "not a type" */) {} + +func f3() int { return 0 } +func f4() a /* ERROR "not a type" */ { return 0 } +func f5() (a, b, c d /* ERROR "not a type" */) { return } + +func f6(a, b, c int) complex128 { return 0 } + +// Declaration of receivers +type T struct{} + +func (T) m0() {} +func (*T) m1() {} +func (x T) m2() {} +func (x *T) m3() {} + +// Initialization functions +func init() {} +func /* ERROR "no arguments and no return values" */ init(int) {} +func /* ERROR "no arguments and no return values" */ init() int { return 0 } +func /* ERROR "no arguments and no return values" */ init(int) int { return 0 } +func (T) init(int) int { return 0 } diff --git a/libgo/go/go/types/testdata/decls2a.src b/libgo/go/go/types/testdata/decls2a.src new file mode 100644 index 00000000000..bdbecd9dbb6 --- /dev/null +++ b/libgo/go/go/types/testdata/decls2a.src @@ -0,0 +1,111 @@ +// 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. + +// method declarations + +package decls2 + +import "time" +import "unsafe" + +// T1 declared before its methods. +type T1 struct{ + f int +} + +func (T1) m() {} +func (T1) m /* ERROR "already declared" */ () {} +func (x *T1) f /* ERROR "field and method" */ () {} + +// Conflict between embedded field and method name, +// with the embedded field being a basic type. +type T1b struct { + int +} + +func (T1b) int /* ERROR "field and method" */ () {} + +type T1c struct { + time.Time +} + +func (T1c) Time /* ERROR "field and method" */ () int { return 0 } + +// Disabled for now: LookupFieldOrMethod will find Pointer even though +// it's double-declared (it would cost extra in the common case to verify +// this). But the MethodSet computation will not find it due to the name +// collision caused by the double-declaration, leading to an internal +// inconsistency while we are verifying one computation against the other. +// var _ = T1c{}.Pointer + +// T2's method declared before the type. +func (*T2) f /* ERROR "field and method" */ () {} + +type T2 struct { + f int +} + +// Methods declared without a declared type. +func (undeclared /* ERROR "undeclared" */) m() {} +func (x *undeclared /* ERROR "undeclared" */) m() {} + +func (pi /* ERROR "not a type" */) m1() {} +func (x pi /* ERROR "not a type" */) m2() {} +func (x *pi /* ERROR "not a type" */ ) m3() {} + +// Blank types. +type _ struct { m int } +type _ struct { m int } + +func (_ /* ERROR "cannot use _" */) m() {} +func m(_ /* ERROR "cannot use _" */) {} + +// Methods with receiver base type declared in another file. +func (T3) m1() {} +func (*T3) m2() {} +func (x T3) m3() {} +func (x *T3) f /* ERROR "field and method" */ () {} + +// Methods of non-struct type. +type T4 func() + +func (self T4) m() func() { return self } + +// Methods associated with an interface. +type T5 interface { + m() int +} + +func (T5 /* ERROR "invalid receiver" */ ) m1() {} +func (T5 /* ERROR "invalid receiver" */ ) m2() {} + +// Methods associated with a named pointer type. +type ptr *int +func (ptr /* ERROR "invalid receiver" */ ) _() {} +func (* /* ERROR "invalid receiver" */ ptr) _() {} + +// Methods with zero or multiple receivers. +func ( /* ERROR "missing receiver" */ ) _() {} +func (T3, * /* ERROR "exactly one receiver" */ T3) _() {} +func (T3, T3, T3 /* ERROR "exactly one receiver" */ ) _() {} +func (a, b /* ERROR "exactly one receiver" */ T3) _() {} +func (a, b, c /* ERROR "exactly one receiver" */ T3) _() {} + +// Methods associated with non-local or unnamed types. +func (int /* ERROR "invalid receiver" */ ) m() {} +func ([ /* ERROR "invalid receiver" */ ]int) m() {} +func (time /* ERROR "invalid receiver" */ .Time) m() {} +func (* /* ERROR "invalid receiver" */ time.Time) m() {} +func (x /* ERROR "invalid receiver" */ interface{}) m() {} + +// Unsafe.Pointer is treated like a pointer when used as receiver type. +type UP unsafe.Pointer +func (UP /* ERROR "invalid" */ ) m1() {} +func (* /* ERROR "invalid" */ UP) m2() {} + +// Double declarations across package files +const c_double = 0 +type t_double int +var v_double int +func f_double() {} diff --git a/libgo/go/go/types/testdata/decls2b.src b/libgo/go/go/types/testdata/decls2b.src new file mode 100644 index 00000000000..e7bc394762f --- /dev/null +++ b/libgo/go/go/types/testdata/decls2b.src @@ -0,0 +1,65 @@ +// 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. + +// method declarations + +package decls2 + +import "io" + +const pi = 3.1415 + +func (T1) m /* ERROR "already declared" */ () {} +func (T2) m(io.Writer) {} + +type T3 struct { + f *T3 +} + +type T6 struct { + x int +} + +func (t *T6) m1() int { + return t.x +} + +func f() { + var t *T6 + t.m1() +} + +// Double declarations across package files +const c_double /* ERROR "redeclared" */ = 0 +type t_double /* ERROR "redeclared" */ int +var v_double /* ERROR "redeclared" */ int +func f_double /* ERROR "redeclared" */ () {} + +// Blank methods need to be type-checked. +// Verify by checking that errors are reported. +func (T /* ERROR "undeclared" */ ) _() {} +func (T1) _(undeclared /* ERROR "undeclared" */ ) {} +func (T1) _() int { return "foo" /* ERROR "cannot convert" */ } + +// Methods with undeclared receiver type can still be checked. +// Verify by checking that errors are reported. +func (Foo /* ERROR "undeclared" */ ) m() {} +func (Foo /* ERROR "undeclared" */ ) m(undeclared /* ERROR "undeclared" */ ) {} +func (Foo /* ERROR "undeclared" */ ) m() int { return "foo" /* ERROR "cannot convert" */ } + +func (Foo /* ERROR "undeclared" */ ) _() {} +func (Foo /* ERROR "undeclared" */ ) _(undeclared /* ERROR "undeclared" */ ) {} +func (Foo /* ERROR "undeclared" */ ) _() int { return "foo" /* ERROR "cannot convert" */ } + +// Receiver declarations are regular parameter lists; +// receiver types may use parentheses, and the list +// may have a trailing comma. +type T7 struct {} + +func (T7) m1() {} +func ((T7)) m2() {} +func ((*T7)) m3() {} +func (x *(T7),) m4() {} +func (x (*(T7)),) m5() {} +func (x ((*((T7)))),) m6() {} diff --git a/libgo/go/go/types/testdata/decls3.src b/libgo/go/go/types/testdata/decls3.src new file mode 100644 index 00000000000..80d2bc8ff8e --- /dev/null +++ b/libgo/go/go/types/testdata/decls3.src @@ -0,0 +1,309 @@ +// 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. + +// embedded types + +package decls3 + +import "unsafe" +import "fmt" + +// fields with the same name at the same level cancel each other out + +func _() { + type ( + T1 struct { X int } + T2 struct { X int } + T3 struct { T1; T2 } // X is embedded twice at the same level via T1->X, T2->X + ) + + var t T3 + _ = t /* ERROR "ambiguous selector" */ .X +} + +func _() { + type ( + T1 struct { X int } + T2 struct { T1 } + T3 struct { T1 } + T4 struct { T2; T3 } // X is embedded twice at the same level via T2->T1->X, T3->T1->X + ) + + var t T4 + _ = t /* ERROR "ambiguous selector" */ .X +} + +func issue4355() { + type ( + T1 struct {X int} + T2 struct {T1} + T3 struct {T2} + T4 struct {T2} + T5 struct {T3; T4} // X is embedded twice at the same level via T3->T2->T1->X, T4->T2->T1->X + ) + + var t T5 + _ = t /* ERROR "ambiguous selector" */ .X +} + +func _() { + type State int + type A struct{ State } + type B struct{ fmt.State } + type T struct{ A; B } + + var t T + _ = t /* ERROR "ambiguous selector" */ .State +} + +// Embedded fields can be predeclared types. + +func _() { + type T0 struct{ + int + float32 + f int + } + var x T0 + _ = x.int + _ = x.float32 + _ = x.f + + type T1 struct{ + T0 + } + var y T1 + _ = y.int + _ = y.float32 + _ = y.f +} + +// Restrictions on embedded field types. + +func _() { + type I1 interface{} + type I2 interface{} + type P1 *int + type P2 *int + type UP unsafe.Pointer + + type T1 struct { + I1 + * /* ERROR "cannot be a pointer to an interface" */ I2 + * /* ERROR "cannot be a pointer to an interface" */ error + P1 /* ERROR "cannot be a pointer" */ + * /* ERROR "cannot be a pointer" */ P2 + } + + // unsafe.Pointers are treated like regular pointers when embedded + type T2 struct { + unsafe /* ERROR "cannot be unsafe.Pointer" */ .Pointer + */* ERROR "cannot be unsafe.Pointer" */ unsafe.Pointer + UP /* ERROR "cannot be unsafe.Pointer" */ + * /* ERROR "cannot be unsafe.Pointer" */ UP + } +} + +// Named types that are pointers. + +type S struct{ x int } +func (*S) m() {} +type P *S + +func _() { + var s *S + _ = s.x + _ = s.m + + var p P + _ = p.x + _ = p /* ERROR "no field or method" */ .m + _ = P /* ERROR "no field or method" */ .m +} + +// Borrowed from the FieldByName test cases in reflect/all_test.go. + +type D1 struct { + d int +} +type D2 struct { + d int +} + +type S0 struct { + A, B, C int + D1 + D2 +} + +type S1 struct { + B int + S0 +} + +type S2 struct { + A int + *S1 +} + +type S1x struct { + S1 +} + +type S1y struct { + S1 +} + +type S3 struct { + S1x + S2 + D, E int + *S1y +} + +type S4 struct { + *S4 + A int +} + +// The X in S6 and S7 annihilate, but they also block the X in S8.S9. +type S5 struct { + S6 + S7 + S8 +} + +type S6 struct { + X int +} + +type S7 S6 + +type S8 struct { + S9 +} + +type S9 struct { + X int + Y int +} + +// The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9. +type S10 struct { + S11 + S12 + S13 +} + +type S11 struct { + S6 +} + +type S12 struct { + S6 +} + +type S13 struct { + S8 +} + +func _() { + _ = struct /* ERROR "no field or method" */ {}{}.Foo + _ = S0{}.A + _ = S0 /* ERROR "no field or method" */ {}.D + _ = S1{}.A + _ = S1{}.B + _ = S1{}.S0 + _ = S1{}.C + _ = S2{}.A + _ = S2{}.S1 + _ = S2{}.B + _ = S2{}.C + _ = S2 /* ERROR "no field or method" */ {}.D + _ = S3 /* ERROR "ambiguous selector" */ {}.S1 + _ = S3{}.A + _ = S3 /* ERROR "ambiguous selector" */ {}.B + _ = S3{}.D + _ = S3{}.E + _ = S4{}.A + _ = S4 /* ERROR "no field or method" */ {}.B + _ = S5 /* ERROR "ambiguous selector" */ {}.X + _ = S5{}.Y + _ = S10 /* ERROR "ambiguous selector" */ {}.X + _ = S10{}.Y +} + +// Borrowed from the FieldByName benchmark in reflect/all_test.go. + +type R0 struct { + *R1 + *R2 + *R3 + *R4 +} + +type R1 struct { + *R5 + *R6 + *R7 + *R8 +} + +type R2 R1 +type R3 R1 +type R4 R1 + +type R5 struct { + *R9 + *R10 + *R11 + *R12 +} + +type R6 R5 +type R7 R5 +type R8 R5 + +type R9 struct { + *R13 + *R14 + *R15 + *R16 +} + +type R10 R9 +type R11 R9 +type R12 R9 + +type R13 struct { + *R17 + *R18 + *R19 + *R20 +} + +type R14 R13 +type R15 R13 +type R16 R13 + +type R17 struct { + *R21 + *R22 + *R23 + *R24 +} + +type R18 R17 +type R19 R17 +type R20 R17 + +type R21 struct { + X int +} + +type R22 R21 +type R23 R21 +type R24 R21 + +var _ = R0 /* ERROR "ambiguous selector" */ {}.X \ No newline at end of file diff --git a/libgo/go/go/types/testdata/errors.src b/libgo/go/go/types/testdata/errors.src new file mode 100644 index 00000000000..29fcd8fe1da --- /dev/null +++ b/libgo/go/go/types/testdata/errors.src @@ -0,0 +1,55 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package errors + +// Testing precise operand formatting in error messages +// (matching messages are regular expressions, hence the \'s). +func f(x int, m map[string]int) { + // no values + _ = f /* ERROR "f\(0, m\) \(no value\) used as value" */ (0, m) + + // built-ins + _ = println /* ERROR "println \(built-in\) must be called" */ + + // types + _ = complex128 /* ERROR "complex128 \(type\) is not an expression" */ + + // constants + const c1 = 991 + const c2 float32 = 0.5 + 0 /* ERROR "0 \(untyped int constant\) is not used" */ + c1 /* ERROR "c1 \(untyped int constant 991\) is not used" */ + c2 /* ERROR "c2 \(constant 0.5 of type float32\) is not used" */ + c1 /* ERROR "c1 \+ c2 \(constant 991.5 of type float32\) is not used" */ + c2 + + // variables + x /* ERROR "x \(variable of type int\) is not used" */ + + // values + x /* ERROR "x != x \(untyped bool value\) is not used" */ != x + x /* ERROR "x \+ x \(value of type int\) is not used" */ + x + + // value, ok's + const s = "foo" + m /* ERROR "m\[s\] \(map index expression of type int\) is not used" */ [s] +} + +// Valid ERROR comments can have a variety of forms. +func _() { + 0 /* ERROR "0 .* is not used" */ + 0 /* ERROR 0 .* is not used */ + 0 // ERROR "0 .* is not used" + 0 // ERROR 0 .* is not used +} + +// Don't report spurious errors as a consequence of earlier errors. +// Add more tests as needed. +func _() { + if err := foo /* ERROR undeclared */ (); err != nil /* no error here */ {} +} + +// Use unqualified names for package-local objects. +type T struct{} +var _ int = T /* ERROR value of type T */ {} // use T in error message rather then errors.T diff --git a/libgo/go/go/types/testdata/expr0.src b/libgo/go/go/types/testdata/expr0.src new file mode 100644 index 00000000000..1aac726327b --- /dev/null +++ b/libgo/go/go/types/testdata/expr0.src @@ -0,0 +1,180 @@ +// 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. + +// unary expressions + +package expr0 + +type mybool bool + +var ( + // bool + b0 = true + b1 bool = b0 + b2 = !true + b3 = !b1 + b4 bool = !true + b5 bool = !b4 + b6 = +b0 /* ERROR "not defined" */ + b7 = -b0 /* ERROR "not defined" */ + b8 = ^b0 /* ERROR "not defined" */ + b9 = *b0 /* ERROR "cannot indirect" */ + b10 = &true /* ERROR "cannot take address" */ + b11 = &b0 + b12 = <-b0 /* ERROR "cannot receive" */ + b13 = & & /* ERROR "cannot take address" */ b0 + + // byte + _ = byte(0) + _ = byte(- /* ERROR "cannot convert" */ 1) + _ = - /* ERROR "-byte\(1\) \(constant -1 of type byte\) overflows byte" */ byte(1) // test for issue 11367 + _ = byte /* ERROR "overflows byte" */ (0) - byte(1) + + // int + i0 = 1 + i1 int = i0 + i2 = +1 + i3 = +i0 + i4 int = +1 + i5 int = +i4 + i6 = -1 + i7 = -i0 + i8 int = -1 + i9 int = -i4 + i10 = !i0 /* ERROR "not defined" */ + i11 = ^1 + i12 = ^i0 + i13 int = ^1 + i14 int = ^i4 + i15 = *i0 /* ERROR "cannot indirect" */ + i16 = &i0 + i17 = *i16 + i18 = <-i16 /* ERROR "cannot receive" */ + + // uint + u0 = uint(1) + u1 uint = u0 + u2 = +1 + u3 = +u0 + u4 uint = +1 + u5 uint = +u4 + u6 = -1 + u7 = -u0 + u8 uint = - /* ERROR "overflows" */ 1 + u9 uint = -u4 + u10 = !u0 /* ERROR "not defined" */ + u11 = ^1 + u12 = ^i0 + u13 uint = ^ /* ERROR "overflows" */ 1 + u14 uint = ^u4 + u15 = *u0 /* ERROR "cannot indirect" */ + u16 = &u0 + u17 = *u16 + u18 = <-u16 /* ERROR "cannot receive" */ + u19 = ^uint(0) + + // float64 + f0 = float64(1) + f1 float64 = f0 + f2 = +1 + f3 = +f0 + f4 float64 = +1 + f5 float64 = +f4 + f6 = -1 + f7 = -f0 + f8 float64 = -1 + f9 float64 = -f4 + f10 = !f0 /* ERROR "not defined" */ + f11 = ^1 + f12 = ^i0 + f13 float64 = ^1 + f14 float64 = ^f4 /* ERROR "not defined" */ + f15 = *f0 /* ERROR "cannot indirect" */ + f16 = &f0 + f17 = *u16 + f18 = <-u16 /* ERROR "cannot receive" */ + + // complex128 + c0 = complex128(1) + c1 complex128 = c0 + c2 = +1 + c3 = +c0 + c4 complex128 = +1 + c5 complex128 = +c4 + c6 = -1 + c7 = -c0 + c8 complex128 = -1 + c9 complex128 = -c4 + c10 = !c0 /* ERROR "not defined" */ + c11 = ^1 + c12 = ^i0 + c13 complex128 = ^1 + c14 complex128 = ^c4 /* ERROR "not defined" */ + c15 = *c0 /* ERROR "cannot indirect" */ + c16 = &c0 + c17 = *u16 + c18 = <-u16 /* ERROR "cannot receive" */ + + // string + s0 = "foo" + s1 = +"foo" /* ERROR "not defined" */ + s2 = -s0 /* ERROR "not defined" */ + s3 = !s0 /* ERROR "not defined" */ + s4 = ^s0 /* ERROR "not defined" */ + s5 = *s4 + s6 = &s4 + s7 = *s6 + s8 = <-s7 + + // channel + ch chan int + rc <-chan float64 + sc chan <- string + ch0 = +ch /* ERROR "not defined" */ + ch1 = -ch /* ERROR "not defined" */ + ch2 = !ch /* ERROR "not defined" */ + ch3 = ^ch /* ERROR "not defined" */ + ch4 = *ch /* ERROR "cannot indirect" */ + ch5 = &ch + ch6 = *ch5 + ch7 = <-ch + ch8 = <-rc + ch9 = <-sc /* ERROR "cannot receive" */ + ch10, ok = <-ch + // ok is of type bool + ch11, myok = <-ch + _ mybool = myok /* ERROR "cannot use .* in variable declaration" */ +) + +// address of composite literals +type T struct{x, y int} + +func f() T { return T{} } + +var ( + _ = &T{1, 2} + _ = &[...]int{} + _ = &[]int{} + _ = &[]int{} + _ = &map[string]T{} + _ = &(T{1, 2}) + _ = &((((T{1, 2})))) + _ = &f /* ERROR "cannot take address" */ () +) + +// recursive pointer types +type P *P + +var ( + p1 P = new(P) + p2 P = *p1 + p3 P = &p2 +) + +func g() (a, b int) { return } + +func _() { + _ = -g /* ERROR 2-valued g */ () + _ = <-g /* ERROR 2-valued g */ () +} diff --git a/libgo/go/go/types/testdata/expr1.src b/libgo/go/go/types/testdata/expr1.src new file mode 100644 index 00000000000..eaaf610b03b --- /dev/null +++ b/libgo/go/go/types/testdata/expr1.src @@ -0,0 +1,127 @@ +// 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. + +// binary expressions + +package expr1 + +type mybool bool + +func _(x, y bool, z mybool) { + x = x || y + x = x || true + x = x || false + x = x && y + x = x && true + x = x && false + + z = z /* ERROR mismatched types */ || y + z = z || true + z = z || false + z = z /* ERROR mismatched types */ && y + z = z && true + z = z && false +} + +type myint int + +func _(x, y int, z myint) { + x = x + 1 + x = x + 1.0 + x = x + 1.1 // ERROR truncated to int + x = x + y + x = x - y + x = x * y + x = x / y + x = x % y + x = x << y // ERROR must be unsigned integer + x = x >> y // ERROR must be unsigned integer + + z = z + 1 + z = z + 1.0 + z = z + 1.1 // ERROR truncated to int + z = z /* ERROR mismatched types */ + y + z = z /* ERROR mismatched types */ - y + z = z /* ERROR mismatched types */ * y + z = z /* ERROR mismatched types */ / y + z = z /* ERROR mismatched types */ % y + z = z << y // ERROR must be unsigned integer + z = z >> y // ERROR must be unsigned integer +} + +type myuint uint + +func _(x, y uint, z myuint) { + x = x + 1 + x = x + - /* ERROR overflows uint */ 1 + x = x + 1.0 + x = x + 1.1 // ERROR truncated to uint + x = x + y + x = x - y + x = x * y + x = x / y + x = x % y + x = x << y + x = x >> y + + z = z + 1 + z = x + - /* ERROR overflows uint */ 1 + z = z + 1.0 + z = z + 1.1 // ERROR truncated to uint + z = z /* ERROR mismatched types */ + y + z = z /* ERROR mismatched types */ - y + z = z /* ERROR mismatched types */ * y + z = z /* ERROR mismatched types */ / y + z = z /* ERROR mismatched types */ % y + z = z << y + z = z >> y +} + +type myfloat64 float64 + +func _(x, y float64, z myfloat64) { + x = x + 1 + x = x + -1 + x = x + 1.0 + x = x + 1.1 + x = x + y + x = x - y + x = x * y + x = x / y + x = x /* ERROR not defined */ % y + x = x /* ERROR operand x .* must be integer */ << y + x = x /* ERROR operand x .* must be integer */ >> y + + z = z + 1 + z = z + -1 + z = z + 1.0 + z = z + 1.1 + z = z /* ERROR mismatched types */ + y + z = z /* ERROR mismatched types */ - y + z = z /* ERROR mismatched types */ * y + z = z /* ERROR mismatched types */ / y + z = z /* ERROR mismatched types */ % y + z = z /* ERROR operand z .* must be integer */ << y + z = z /* ERROR operand z .* must be integer */ >> y +} + +type mystring string + +func _(x, y string, z mystring) { + x = x + "foo" + x = x /* ERROR not defined */ - "foo" + x = x + 1 // ERROR cannot convert + x = x + y + x = x /* ERROR not defined */ - y + x = x * 10 // ERROR cannot convert +} + +func f() (a, b int) { return } + +func _(x int) { + _ = f /* ERROR 2-valued f */ () + 1 + _ = x + f /* ERROR 2-valued f */ () + _ = f /* ERROR 2-valued f */ () + f + _ = f /* ERROR 2-valued f */ () + f /* ERROR 2-valued f */ () +} diff --git a/libgo/go/go/types/testdata/expr2.src b/libgo/go/go/types/testdata/expr2.src new file mode 100644 index 00000000000..31dc5f021c0 --- /dev/null +++ b/libgo/go/go/types/testdata/expr2.src @@ -0,0 +1,247 @@ +// 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. + +// comparisons + +package expr2 + +func _bool() { + const t = true == true + const f = true == false + _ = t /* ERROR "cannot compare" */ < f + _ = 0 /* ERROR "cannot convert" */ == t + var b bool + var x, y float32 + b = x < y + _ = b + _ = struct{b bool}{x < y} +} + +// corner cases +var ( + v0 = nil /* ERROR "cannot compare" */ == nil +) + +func arrays() { + // basics + var a, b [10]int + _ = a == b + _ = a != b + _ = a /* ERROR < not defined */ < b + _ = a == nil /* ERROR cannot convert */ + + type C [10]int + var c C + _ = a == c + + type D [10]int + var d D + _ = c /* ERROR mismatched types */ == d + + var e [10]func() int + _ = e /* ERROR == not defined */ == e +} + +func structs() { + // basics + var s, t struct { + x int + a [10]float32 + _ bool + } + _ = s == t + _ = s != t + _ = s /* ERROR < not defined */ < t + _ = s == nil /* ERROR cannot convert */ + + type S struct { + x int + a [10]float32 + _ bool + } + type T struct { + x int + a [10]float32 + _ bool + } + var ss S + var tt T + _ = s == ss + _ = ss /* ERROR mismatched types */ == tt + + var u struct { + x int + a [10]map[string]int + } + _ = u /* ERROR cannot compare */ == u +} + +func pointers() { + // nil + _ = nil /* ERROR == not defined */ == nil + _ = nil /* ERROR != not defined */ != nil + _ = nil /* ERROR < not defined */ < nil + _ = nil /* ERROR <= not defined */ <= nil + _ = nil /* ERROR > not defined */ > nil + _ = nil /* ERROR >= not defined */ >= nil + + // basics + var p, q *int + _ = p == q + _ = p != q + + _ = p == nil + _ = p != nil + _ = nil == q + _ = nil != q + + _ = p /* ERROR < not defined */ < q + _ = p /* ERROR <= not defined */ <= q + _ = p /* ERROR > not defined */ > q + _ = p /* ERROR >= not defined */ >= q + + // various element types + type ( + S1 struct{} + S2 struct{} + P1 *S1 + P2 *S2 + ) + var ( + ps1 *S1 + ps2 *S2 + p1 P1 + p2 P2 + ) + _ = ps1 == ps1 + _ = ps1 /* ERROR mismatched types */ == ps2 + _ = ps2 /* ERROR mismatched types */ == ps1 + + _ = p1 == p1 + _ = p1 /* ERROR mismatched types */ == p2 + + _ = p1 == ps1 +} + +func channels() { + // basics + var c, d chan int + _ = c == d + _ = c != d + _ = c == nil + _ = c /* ERROR < not defined */ < d + + // various element types (named types) + type ( + C1 chan int + C1r <-chan int + C1s chan<- int + C2 chan float32 + ) + var ( + c1 C1 + c1r C1r + c1s C1s + c1a chan int + c2 C2 + ) + _ = c1 == c1 + _ = c1 /* ERROR mismatched types */ == c1r + _ = c1 /* ERROR mismatched types */ == c1s + _ = c1r /* ERROR mismatched types */ == c1s + _ = c1 == c1a + _ = c1a == c1 + _ = c1 /* ERROR mismatched types */ == c2 + _ = c1a /* ERROR mismatched types */ == c2 + + // various element types (unnamed types) + var ( + d1 chan int + d1r <-chan int + d1s chan<- int + d1a chan<- int + d2 chan float32 + ) + _ = d1 == d1 + _ = d1 == d1r + _ = d1 == d1s + _ = d1r /* ERROR mismatched types */ == d1s + _ = d1 == d1a + _ = d1a == d1 + _ = d1 /* ERROR mismatched types */ == d2 + _ = d1a /* ERROR mismatched types */ == d2 +} + +// for interfaces test +type S1 struct{} +type S11 struct{} +type S2 struct{} +func (*S1) m() int +func (*S11) m() int +func (*S11) n() +func (*S2) m() float32 + +func interfaces() { + // basics + var i, j interface{ m() int } + _ = i == j + _ = i != j + _ = i == nil + _ = i /* ERROR < not defined */ < j + + // various interfaces + var ii interface { m() int; n() } + var k interface { m() float32 } + _ = i == ii + _ = i /* ERROR mismatched types */ == k + + // interfaces vs values + var s1 S1 + var s11 S11 + var s2 S2 + + _ = i == 0 /* ERROR cannot convert */ + _ = i /* ERROR mismatched types */ == s1 + _ = i == &s1 + _ = i == &s11 + + _ = i /* ERROR mismatched types */ == s2 + _ = i /* ERROR mismatched types */ == &s2 +} + +func slices() { + // basics + var s []int + _ = s == nil + _ = s != nil + _ = s /* ERROR < not defined */ < nil + + // slices are not otherwise comparable + _ = s /* ERROR == not defined */ == s + _ = s /* ERROR < not defined */ < s +} + +func maps() { + // basics + var m map[string]int + _ = m == nil + _ = m != nil + _ = m /* ERROR < not defined */ < nil + + // maps are not otherwise comparable + _ = m /* ERROR == not defined */ == m + _ = m /* ERROR < not defined */ < m +} + +func funcs() { + // basics + var f func(int) float32 + _ = f == nil + _ = f != nil + _ = f /* ERROR < not defined */ < nil + + // funcs are not otherwise comparable + _ = f /* ERROR == not defined */ == f + _ = f /* ERROR < not defined */ < f +} diff --git a/libgo/go/go/types/testdata/expr3.src b/libgo/go/go/types/testdata/expr3.src new file mode 100644 index 00000000000..ab1a9f684b8 --- /dev/null +++ b/libgo/go/go/types/testdata/expr3.src @@ -0,0 +1,558 @@ +// 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 expr3 + +import "time" + +func indexes() { + _ = 1 /* ERROR "cannot index" */ [0] + _ = indexes /* ERROR "cannot index" */ [0] + _ = ( /* ERROR "cannot slice" */ 12 + 3)[1:2] + + var a [10]int + _ = a[true /* ERROR "cannot convert" */ ] + _ = a["foo" /* ERROR "cannot convert" */ ] + _ = a[1.1 /* ERROR "truncated" */ ] + _ = a[1.0] + _ = a[- /* ERROR "negative" */ 1] + _ = a[- /* ERROR "negative" */ 1 :] + _ = a[: - /* ERROR "negative" */ 1] + _ = a[: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ] + _ = a[0: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ] + _ = a[0: /* ERROR "2nd index required" */ :10] + _ = a[:10:10] + + var a0 int + a0 = a[0] + _ = a0 + var a1 int32 + a1 = a /* ERROR "cannot use .* in assignment" */ [1] + _ = a1 + + _ = a[9] + _ = a[10 /* ERROR "index .* out of bounds" */ ] + _ = a[1 /* ERROR "overflows" */ <<100] + _ = a[10:] + _ = a[:10] + _ = a[10:10] + _ = a[11 /* ERROR "index .* out of bounds" */ :] + _ = a[: 11 /* ERROR "index .* out of bounds" */ ] + _ = a[: 1 /* ERROR "overflows" */ <<100] + _ = a[:10:10] + _ = a[:11 /* ERROR "index .* out of bounds" */ :10] + _ = a[:10:11 /* ERROR "index .* out of bounds" */ ] + _ = a[10:0:10] /* ERROR "invalid slice indices" */ + _ = a[0:10:0] /* ERROR "invalid slice indices" */ + _ = a[10:0:0] /* ERROR "invalid slice indices" */ + _ = &a /* ERROR "cannot take address" */ [:10] + + pa := &a + _ = pa[9] + _ = pa[10 /* ERROR "index .* out of bounds" */ ] + _ = pa[1 /* ERROR "overflows" */ <<100] + _ = pa[10:] + _ = pa[:10] + _ = pa[10:10] + _ = pa[11 /* ERROR "index .* out of bounds" */ :] + _ = pa[: 11 /* ERROR "index .* out of bounds" */ ] + _ = pa[: 1 /* ERROR "overflows" */ <<100] + _ = pa[:10:10] + _ = pa[:11 /* ERROR "index .* out of bounds" */ :10] + _ = pa[:10:11 /* ERROR "index .* out of bounds" */ ] + _ = pa[10:0:10] /* ERROR "invalid slice indices" */ + _ = pa[0:10:0] /* ERROR "invalid slice indices" */ + _ = pa[10:0:0] /* ERROR "invalid slice indices" */ + _ = &pa /* ERROR "cannot take address" */ [:10] + + var b [0]int + _ = b[0 /* ERROR "index .* out of bounds" */ ] + _ = b[:] + _ = b[0:] + _ = b[:0] + _ = b[0:0] + _ = b[0:0:0] + _ = b[1 /* ERROR "index .* out of bounds" */ :0:0] + + var s []int + _ = s[- /* ERROR "negative" */ 1] + _ = s[- /* ERROR "negative" */ 1 :] + _ = s[: - /* ERROR "negative" */ 1] + _ = s[0] + _ = s[1:2] + _ = s[2:1] /* ERROR "invalid slice indices" */ + _ = s[2:] + _ = s[: 1 /* ERROR "overflows" */ <<100] + _ = s[1 /* ERROR "overflows" */ <<100 :] + _ = s[1 /* ERROR "overflows" */ <<100 : 1 /* ERROR "overflows" */ <<100] + _ = s[: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ] + _ = s[:10:10] + _ = s[10:0:10] /* ERROR "invalid slice indices" */ + _ = s[0:10:0] /* ERROR "invalid slice indices" */ + _ = s[10:0:0] /* ERROR "invalid slice indices" */ + _ = &s /* ERROR "cannot take address" */ [:10] + + var m map[string]int + _ = m[0 /* ERROR "cannot convert" */ ] + _ = m /* ERROR "cannot slice" */ ["foo" : "bar"] + _ = m["foo"] + // ok is of type bool + type mybool bool + var ok mybool + _, ok = m["bar"] + _ = ok + + var t string + _ = t[- /* ERROR "negative" */ 1] + _ = t[- /* ERROR "negative" */ 1 :] + _ = t[: - /* ERROR "negative" */ 1] + _ = t /* ERROR "3-index slice of string" */ [1:2:3] + _ = "foo" /* ERROR "3-index slice of string" */ [1:2:3] + var t0 byte + t0 = t[0] + _ = t0 + var t1 rune + t1 = t /* ERROR "cannot use .* in assignment" */ [2] + _ = t1 + _ = ("foo" + "bar")[5] + _ = ("foo" + "bar")[6 /* ERROR "index .* out of bounds" */ ] + + const c = "foo" + _ = c[- /* ERROR "negative" */ 1] + _ = c[- /* ERROR "negative" */ 1 :] + _ = c[: - /* ERROR "negative" */ 1] + var c0 byte + c0 = c[0] + _ = c0 + var c2 float32 + c2 = c /* ERROR "cannot use .* in assignment" */ [2] + _ = c[3 /* ERROR "index .* out of bounds" */ ] + _ = ""[0 /* ERROR "index .* out of bounds" */ ] + _ = c2 + + _ = s[1<<30] // no compile-time error here + + // issue 4913 + type mystring string + var ss string + var ms mystring + var i, j int + ss = "foo"[1:2] + ss = "foo"[i:j] + ms = "foo" /* ERROR "cannot use .* in assignment" */ [1:2] + ms = "foo" /* ERROR "cannot use .* in assignment" */ [i:j] + _, _ = ss, ms +} + +type T struct { + x int + y func() +} + +func (*T) m() {} + +func method_expressions() { + _ = T /* ERROR "no field or method" */ .a + _ = T /* ERROR "has no method" */ .x + _ = T /* ERROR "not in method set" */ .m + _ = (*T).m + + var f func(*T) = T /* ERROR "not in method set" */ .m + var g func(*T) = (*T).m + _, _ = f, g + + _ = T /* ERROR "has no method" */ .y + _ = ( /* ERROR "has no method" */ *T).y +} + +func struct_literals() { + type T0 struct { + a, b, c int + } + + type T1 struct { + T0 + a, b int + u float64 + s string + } + + // keyed elements + _ = T1{} + _ = T1{a: 0, 1 /* ERROR "mixture of .* elements" */ } + _ = T1{aa /* ERROR "unknown field" */ : 0} + _ = T1{1 /* ERROR "invalid field name" */ : 0} + _ = T1{a: 0, s: "foo", u: 0, a /* ERROR "duplicate field" */: 10} + _ = T1{a: "foo" /* ERROR "cannot convert" */ } + _ = T1{c /* ERROR "unknown field" */ : 0} + _ = T1{T0: { /* ERROR "missing type" */ }} // struct literal element type may not be elided + _ = T1{T0: T0{}} + _ = T1{T0 /* ERROR "invalid field name" */ .a: 0} + + // unkeyed elements + _ = T0{1, 2, 3} + _ = T0{1, b /* ERROR "mixture" */ : 2, 3} + _ = T0{1, 2} /* ERROR "too few values" */ + _ = T0{1, 2, 3, 4 /* ERROR "too many values" */ } + _ = T0{1, "foo" /* ERROR "cannot convert" */, 3.4 /* ERROR "truncated" */} + + // invalid type + type P *struct{ + x int + } + _ = P /* ERROR "invalid composite literal type" */ {} + + // unexported fields + _ = time.Time{} + _ = time.Time{sec /* ERROR "unknown field" */ : 0} + _ = time.Time{ + 0 /* ERROR implicit assignment to unexported field sec in time.Time literal */, + 0 /* ERROR implicit assignment */ , + nil /* ERROR implicit assignment */ , + } +} + +func array_literals() { + type A0 [0]int + _ = A0{} + _ = A0{0 /* ERROR "index .* out of bounds" */} + _ = A0{0 /* ERROR "index .* out of bounds" */ : 0} + + type A1 [10]int + _ = A1{} + _ = A1{0, 1, 2} + _ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} + _ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /* ERROR "index .* out of bounds" */ } + _ = A1{- /* ERROR "negative" */ 1: 0} + _ = A1{8: 8, 9} + _ = A1{8: 8, 9, 10 /* ERROR "index .* out of bounds" */ } + _ = A1{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4} + _ = A1{5: 5, 6, 7, 3: 3, 4} + _ = A1{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ } + _ = A1{10 /* ERROR "index .* out of bounds" */ : 10, 10 /* ERROR "index .* out of bounds" */ : 10} + _ = A1{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ } + _ = A1{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4} + _ = A1{2.0} + _ = A1{2.1 /* ERROR "truncated" */ } + _ = A1{"foo" /* ERROR "cannot convert" */ } + + // indices must be integer constants + i := 1 + const f = 2.1 + const s = "foo" + _ = A1{i /* ERROR "index i must be integer constant" */ : 0} + _ = A1{f /* ERROR "truncated" */ : 0} + _ = A1{s /* ERROR "cannot convert" */ : 0} + + a0 := [...]int{} + assert(len(a0) == 0) + + a1 := [...]int{0, 1, 2} + assert(len(a1) == 3) + var a13 [3]int + var a14 [4]int + a13 = a1 + a14 = a1 /* ERROR "cannot use .* in assignment" */ + _, _ = a13, a14 + + a2 := [...]int{- /* ERROR "negative" */ 1: 0} + _ = a2 + + a3 := [...]int{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4} + assert(len(a3) == 5) // somewhat arbitrary + + a4 := [...]complex128{0, 1, 2, 1<<10-2: -1i, 1i, 400: 10, 12, 14} + assert(len(a4) == 1024) + + // composite literal element types may be elided + type T []int + _ = [10]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} + a6 := [...]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} + assert(len(a6) == 8) + + // recursively so + _ = [10][10]T{{}, [10]T{{}}, {{1, 2, 3}}} + + // from the spec + type Point struct { x, y float32 } + _ = [...]Point{Point{1.5, -3.5}, Point{0, 0}} + _ = [...]Point{{1.5, -3.5}, {0, 0}} + _ = [][]int{[]int{1, 2, 3}, []int{4, 5}} + _ = [][]int{{1, 2, 3}, {4, 5}} + _ = [...]*Point{&Point{1.5, -3.5}, &Point{0, 0}} + _ = [...]*Point{{1.5, -3.5}, {0, 0}} +} + +func slice_literals() { + type S0 []int + _ = S0{} + _ = S0{0, 1, 2} + _ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} + _ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + _ = S0{- /* ERROR "negative" */ 1: 0} + _ = S0{8: 8, 9} + _ = S0{8: 8, 9, 10} + _ = S0{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4} + _ = S0{5: 5, 6, 7, 3: 3, 4} + _ = S0{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ } + _ = S0{10: 10, 10 /* ERROR "duplicate index" */ : 10} + _ = S0{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ } + _ = S0{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4} + _ = S0{2.0} + _ = S0{2.1 /* ERROR "truncated" */ } + _ = S0{"foo" /* ERROR "cannot convert" */ } + + // indices must be resolved correctly + const index1 = 1 + _ = S0{index1: 1} + _ = S0{index2: 2} + _ = S0{index3 /* ERROR "undeclared name" */ : 3} + + // indices must be integer constants + i := 1 + const f = 2.1 + const s = "foo" + _ = S0{i /* ERROR "index i must be integer constant" */ : 0} + _ = S0{f /* ERROR "truncated" */ : 0} + _ = S0{s /* ERROR "cannot convert" */ : 0} + + // composite literal element types may be elided + type T []int + _ = []T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} + _ = [][]int{{1, 2, 3}, {4, 5}} + + // recursively so + _ = [][]T{{}, []T{{}}, {{1, 2, 3}}} + + // issue 17954 + type T0 *struct { s string } + _ = []T0{{}} + _ = []T0{{"foo"}} + + type T1 *struct{ int } + _ = []T1{} + _ = []T1{{0}, {1}, {2}} + + type T2 T1 + _ = []T2{} + _ = []T2{{0}, {1}, {2}} + + _ = map[T0]T2{} + _ = map[T0]T2{{}: {}} +} + +const index2 int = 2 + +type N int +func (N) f() {} + +func map_literals() { + type M0 map[string]int + type M1 map[bool]int + type M2 map[*int]int + + _ = M0{} + _ = M0{1 /* ERROR "missing key" */ } + _ = M0{1 /* ERROR "cannot convert" */ : 2} + _ = M0{"foo": "bar" /* ERROR "cannot convert" */ } + _ = M0{"foo": 1, "bar": 2, "foo" /* ERROR "duplicate key" */ : 3 } + + _ = map[interface{}]int{2: 1, 2 /* ERROR "duplicate key" */ : 1} + _ = map[interface{}]int{int(2): 1, int16(2): 1} + _ = map[interface{}]int{int16(2): 1, int16 /* ERROR "duplicate key" */ (2): 1} + + type S string + + _ = map[interface{}]int{"a": 1, "a" /* ERROR "duplicate key" */ : 1} + _ = map[interface{}]int{"a": 1, S("a"): 1} + _ = map[interface{}]int{S("a"): 1, S /* ERROR "duplicate key" */ ("a"): 1} + + type I interface { + f() + } + + _ = map[I]int{N(0): 1, N(2): 1} + _ = map[I]int{N(2): 1, N /* ERROR "duplicate key" */ (2): 1} + + // map keys must be resolved correctly + key1 := "foo" + _ = M0{key1: 1} + _ = M0{key2: 2} + _ = M0{key3 /* ERROR "undeclared name" */ : 2} + + var value int + _ = M1{true: 1, false: 0} + _ = M2{nil: 0, &value: 1} + + // composite literal element types may be elided + type T [2]int + _ = map[int]T{0: T{3, 4}, 1: {5, 6}} + + // recursively so + _ = map[int][]T{0: {}, 1: {{}, T{1, 2}}} + + // composite literal key types may be elided + _ = map[T]int{T{3, 4}: 0, {5, 6}: 1} + + // recursively so + _ = map[[2]T]int{{}: 0, {{}}: 1, [2]T{{}}: 2, {T{1, 2}}: 3} + + // composite literal element and key types may be elided + _ = map[T]T{{}: {}, {1, 2}: T{3, 4}, T{4, 5}: {}} + _ = map[T]M0{{} : {}, T{1, 2}: M0{"foo": 0}, {1, 3}: {"foo": 1}} + + // recursively so + _ = map[[2]T][]T{{}: {}, {{}}: {{}, T{1, 2}}, [2]T{{}}: nil, {T{1, 2}}: {{}, {}}} + + // from the spec + type Point struct { x, y float32 } + _ = map[string]Point{"orig": {0, 0}} + _ = map[*Point]string{{0, 0}: "orig"} + + // issue 17954 + type T0 *struct{ s string } + type T1 *struct{ int } + type T2 T1 + + _ = map[T0]T2{} + _ = map[T0]T2{{}: {}} +} + +var key2 string = "bar" + +type I interface { + m() +} + +type I2 interface { + m(int) +} + +type T1 struct{} +type T2 struct{} + +func (T2) m(int) {} + +type mybool bool + +func type_asserts() { + var x int + _ = x /* ERROR "not an interface" */ .(int) + + var e interface{} + var ok bool + x, ok = e.(int) + _ = ok + + // ok value is of type bool + var myok mybool + _, myok = e.(int) + _ = myok + + var t I + _ = t /* ERROR "use of .* outside type switch" */ .(type) + _ = t /* ERROR "missing method m" */ .(T) + _ = t.(*T) + _ = t /* ERROR "missing method m" */ .(T1) + _ = t /* ERROR "wrong type for method m" */ .(T2) + _ = t /* STRICT "wrong type for method m" */ .(I2) // only an error in strict mode (issue 8561) + + // e doesn't statically have an m, but may have one dynamically. + _ = e.(I2) +} + +func f0() {} +func f1(x int) {} +func f2(u float32, s string) {} +func fs(s []byte) {} +func fv(x ...int) {} +func fi(x ... interface{}) {} +func (T) fm(x ...int) + +func g0() {} +func g1() int { return 0} +func g2() (u float32, s string) { return } +func gs() []byte { return nil } + +func _calls() { + var x int + var y float32 + var s []int + + f0() + _ = f0 /* ERROR "used as value" */ () + f0(g0 /* ERROR "too many arguments" */ ) + + f1(0) + f1(x) + f1(10.0) + f1() /* ERROR "too few arguments" */ + f1(x, y /* ERROR "too many arguments" */ ) + f1(s /* ERROR "cannot use .* in argument" */ ) + f1(x ... /* ERROR "cannot use ..." */ ) + f1(g0 /* ERROR "used as value" */ ()) + f1(g1()) + // f1(g2()) // TODO(gri) missing position in error message + + f2() /* ERROR "too few arguments" */ + f2(3.14) /* ERROR "too few arguments" */ + f2(3.14, "foo") + f2(x /* ERROR "cannot use .* in argument" */ , "foo") + f2(g0 /* ERROR "used as value" */ ()) + f2(g1 /* ERROR "cannot use .* in argument" */ ()) /* ERROR "too few arguments" */ + f2(g2()) + + fs() /* ERROR "too few arguments" */ + fs(g0 /* ERROR "used as value" */ ()) + fs(g1 /* ERROR "cannot use .* in argument" */ ()) + fs(g2 /* ERROR "cannot use .* in argument" */ /* ERROR "too many arguments" */ ()) + fs(gs()) + + fv() + fv(1, 2.0, x) + fv(s /* ERROR "cannot use .* in argument" */ ) + fv(s...) + fv(x /* ERROR "cannot use" */ ...) + fv(1, s... /* ERROR "can only use ... with matching parameter" */ ) + fv(gs /* ERROR "cannot use .* in argument" */ ()) + fv(gs /* ERROR "cannot use .* in argument" */ ()...) + + var t T + t.fm() + t.fm(1, 2.0, x) + t.fm(s /* ERROR "cannot use .* in argument" */ ) + t.fm(g1()) + t.fm(1, s... /* ERROR "can only use ... with matching parameter" */ ) + t.fm(gs /* ERROR "cannot use .* in argument" */ ()) + t.fm(gs /* ERROR "cannot use .* in argument" */ ()...) + + T.fm(t, ) + T.fm(t, 1, 2.0, x) + T.fm(t, s /* ERROR "cannot use .* in argument" */ ) + T.fm(t, g1()) + T.fm(t, 1, s... /* ERROR "can only use ... with matching parameter" */ ) + T.fm(t, gs /* ERROR "cannot use .* in argument" */ ()) + T.fm(t, gs /* ERROR "cannot use .* in argument" */ ()...) + + var i interface{ fm(x ...int) } = t + i.fm() + i.fm(1, 2.0, x) + i.fm(s /* ERROR "cannot use .* in argument" */ ) + i.fm(g1()) + i.fm(1, s... /* ERROR "can only use ... with matching parameter" */ ) + i.fm(gs /* ERROR "cannot use .* in argument" */ ()) + i.fm(gs /* ERROR "cannot use .* in argument" */ ()...) + + fi() + fi(1, 2.0, x, 3.14, "foo") + fi(g2()) + fi(0, g2) + fi(0, g2 /* ERROR "2-valued g2" */ ()) +} + +func issue6344() { + type T []interface{} + var x T + fi(x...) // ... applies also to named slices +} diff --git a/libgo/go/go/types/testdata/gotos.src b/libgo/go/go/types/testdata/gotos.src new file mode 100644 index 00000000000..069a94bbbf4 --- /dev/null +++ b/libgo/go/go/types/testdata/gotos.src @@ -0,0 +1,560 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file is a modified copy of $GOROOT/test/goto.go. + +package gotos + +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 variable declaration at line 36" */ + x := 1 + _ = 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 variable declaration at line 58" */ + { + x := 1 + _ = x + } + x := 1 + _ = x +L: +} + +// goto across declaration in reverse okay +func _() { +L: + x := 1 + _ = x + goto L +} + +func _() { +L: L1: + x := 1 + _ = x + goto L + goto L1 +} + +// error shows first offending variable +func _() { + goto L /* ERROR "goto L jumps over variable declaration at line 84" */ + x := 1 + _ = x + y := 1 + _ = y +L: +} + +// goto not okay even if code path is dead +func _() { + goto L /* ERROR "goto L jumps over variable declaration" */ + x := 1 + _ = x + y := 1 + _ = y + return +L: +} + +// goto into outer block okay +func _() { + { + goto L + } +L: +} + +func _() { + { + goto L + goto L1 + } +L: L1: +} + +// goto backward into outer block okay +func _() { +L: + { + goto L + } +} + +func _() { +L: L1: + { + goto L + goto L1 + } +} + +// goto into inner block not okay +func _() { + goto L /* ERROR "goto L jumps into block" */ + { + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + goto L1 /* ERROR "goto L1 jumps into block" */ + { + L: L1: + } +} + +// goto backward into inner block still not okay +func _() { + { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + { + L: L1: + } + goto L /* ERROR "goto L jumps into block" */ + goto L1 /* ERROR "goto L1 jumps into block" */ +} + +// error shows first (outermost) offending block +func _() { + goto L /* ERROR "goto L jumps into block" */ + { + { + { + L: + } + } + } +} + +// error prefers block diagnostic over declaration diagnostic +func _() { + goto L /* ERROR "goto L jumps into block" */ + x := 1 + _ = x + { + 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" */ + if true { + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + if true { + L: + } else { + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + if true { + } else { + L: + } +} + +func _() { + if false { + L: + } else { + goto L /* ERROR "goto L jumps into block" */ + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else { + L: + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else if false { + L: + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else if false { + L: + } else { + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else if false { + } else { + L: + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else { + L: + } +} + +func _() { + if true { + L: + } else { + goto L /* ERROR "goto L jumps into block" */ + } +} + +// for + +func _() { + for { + goto L + } +L: +} + +func _() { + for { + goto L + L: + } +} + +func _() { + for { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for { + goto L + L1: + } +L: + goto L1 /* ERROR "goto L1 jumps into block" */ +} + +func _() { + for i < n { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = 0; i < n; i++ { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range x { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range c { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range m { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range s { + L: + } + goto L /* ERROR "goto L 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" */ + switch i { + case 0: + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + switch i { + case 0: + L: + ; + default: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + switch i { + case 0: + default: + L: + } +} + +func _() { + switch i { + default: + goto L /* ERROR "goto L jumps into block" */ + case 0: + L: + } +} + +func _() { + switch i { + case 0: + L: + ; + default: + goto L /* ERROR "goto L 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" */ + select { + case c <- 1: + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + select { + case c <- 1: + L: + ; + default: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + select { + case <-c: + default: + L: + } +} + +func _() { + select { + default: + goto L /* ERROR "goto L jumps into block" */ + case <-c: + L: + } +} + +func _() { + select { + case <-c: + L: + ; + default: + goto L /* ERROR "goto L jumps into block" */ + } +} diff --git a/libgo/go/go/types/testdata/importC.src b/libgo/go/go/types/testdata/importC.src new file mode 100644 index 00000000000..31436be6ada --- /dev/null +++ b/libgo/go/go/types/testdata/importC.src @@ -0,0 +1,10 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package importC + +import "C" +import _ /* ERROR cannot rename import "C" */ "C" +import foo /* ERROR cannot rename import "C" */ "C" +import . /* ERROR cannot rename import "C" */ "C" diff --git a/libgo/go/go/types/testdata/importdecl0a.src b/libgo/go/go/types/testdata/importdecl0a.src new file mode 100644 index 00000000000..463dcd083dd --- /dev/null +++ b/libgo/go/go/types/testdata/importdecl0a.src @@ -0,0 +1,53 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package importdecl0 + +import () + +import ( + // we can have multiple blank imports (was bug) + _ "math" + _ "net/rpc" + init /* ERROR "cannot declare init" */ "fmt" + // reflect defines a type "flag" which shows up in the gc export data + "reflect" + . /* ERROR "imported but not used" */ "reflect" +) + +import "math" /* ERROR "imported but not used" */ +import m /* ERROR "imported but not used as m" */ "math" +import _ "math" + +import ( + "math/big" /* ERROR "imported but not used" */ + b /* ERROR "imported but not used" */ "math/big" + _ "math/big" +) + +import "fmt" +import f1 "fmt" +import f2 "fmt" + +// reflect.flag must not be visible in this package +type flag int +type _ reflect /* ERROR "not exported" */ .flag + +// imported package name may conflict with local objects +type reflect /* ERROR "reflect already declared" */ int + +// dot-imported exported objects may conflict with local objects +type Value /* ERROR "Value already declared through dot-import of package reflect" */ struct{} + +var _ = fmt.Println // use "fmt" + +func _() { + f1.Println() // use "fmt" +} + +func _() { + _ = func() { + f2.Println() // use "fmt" + } +} diff --git a/libgo/go/go/types/testdata/importdecl0b.src b/libgo/go/go/types/testdata/importdecl0b.src new file mode 100644 index 00000000000..6844e709823 --- /dev/null +++ b/libgo/go/go/types/testdata/importdecl0b.src @@ -0,0 +1,33 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package importdecl0 + +import "math" +import m "math" + +import . "testing" // declares T in file scope +import . /* ERROR "imported but not used" */ "unsafe" +import . "fmt" // declares Println in file scope + +import ( + // TODO(gri) At the moment, 2 errors are reported because both go/parser + // and the type checker report it. Eventually, this test should not be + // done by the parser anymore. + "" /* ERROR invalid import path */ /* ERROR invalid import path */ + "a!b" /* ERROR invalid import path */ /* ERROR invalid import path */ + "abc\xffdef" /* ERROR invalid import path */ /* ERROR invalid import path */ +) + +// using "math" in this file doesn't affect its use in other files +const Pi0 = math.Pi +const Pi1 = m.Pi + +type _ T // use "testing" + +func _() func() interface{} { + return func() interface{} { + return Println // use "fmt" + } +} diff --git a/libgo/go/go/types/testdata/importdecl1a.src b/libgo/go/go/types/testdata/importdecl1a.src new file mode 100644 index 00000000000..8301820dda9 --- /dev/null +++ b/libgo/go/go/types/testdata/importdecl1a.src @@ -0,0 +1,11 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test case for issue 8969. + +package importdecl1 + +import . "unsafe" + +var _ Pointer // use dot-imported package unsafe diff --git a/libgo/go/go/types/testdata/importdecl1b.src b/libgo/go/go/types/testdata/importdecl1b.src new file mode 100644 index 00000000000..f24bb9ade97 --- /dev/null +++ b/libgo/go/go/types/testdata/importdecl1b.src @@ -0,0 +1,7 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package importdecl1 + +import . /* ERROR "imported but not used" */ "unsafe" diff --git a/libgo/go/go/types/testdata/init0.src b/libgo/go/go/types/testdata/init0.src new file mode 100644 index 00000000000..ef0349c70f5 --- /dev/null +++ b/libgo/go/go/types/testdata/init0.src @@ -0,0 +1,106 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// initialization cycles + +package init0 + +// initialization cycles (we don't know the types) +const ( + s0 /* ERROR initialization cycle */ = s0 + + x0 /* ERROR initialization cycle */ = y0 + y0 = x0 + + a0 = b0 + b0 /* ERROR initialization cycle */ = c0 + c0 = d0 + d0 = b0 +) + +var ( + s1 /* ERROR initialization cycle */ = s1 + + x1 /* ERROR initialization cycle */ = y1 + y1 = x1 + + a1 = b1 + b1 /* ERROR initialization cycle */ = c1 + c1 = d1 + d1 = b1 +) + +// initialization cycles (we know the types) +const ( + s2 /* ERROR initialization cycle */ int = s2 + + x2 /* ERROR initialization cycle */ int = y2 + y2 = x2 + + a2 = b2 + b2 /* ERROR initialization cycle */ int = c2 + c2 = d2 + d2 = b2 +) + +var ( + s3 /* ERROR initialization cycle */ int = s3 + + x3 /* ERROR initialization cycle */ int = y3 + y3 = x3 + + a3 = b3 + b3 /* ERROR initialization cycle */ int = c3 + c3 = d3 + d3 = b3 +) + +// cycles via struct fields + +type S1 struct { + f int +} +const cx3 S1 /* ERROR invalid constant type */ = S1{cx3.f} +var vx3 /* ERROR initialization cycle */ S1 = S1{vx3.f} + +// cycles via functions + +var x4 = x5 +var x5 /* ERROR initialization cycle */ = f1() +func f1() int { return x5*10 } + +var x6, x7 /* ERROR initialization cycle */ = f2() +var x8 = x7 +func f2() (int, int) { return f3() + f3(), 0 } +func f3() int { return x8 } + +// cycles via closures + +var x9 /* ERROR initialization cycle */ = func() int { return x9 }() + +var x10 /* ERROR initialization cycle */ = f4() + +func f4() int { + _ = func() { + _ = x10 + } + return 0 +} + +// cycles via method expressions + +type T1 struct{} + +func (T1) m() bool { _ = x11; return false } + +var x11 /* ERROR initialization cycle */ = T1.m(T1{}) + +// cycles via method values + +type T2 struct{} + +func (T2) m() bool { _ = x12; return false } + +var t1 T2 +var x12 /* ERROR initialization cycle */ = t1.m diff --git a/libgo/go/go/types/testdata/init1.src b/libgo/go/go/types/testdata/init1.src new file mode 100644 index 00000000000..39ca31466b5 --- /dev/null +++ b/libgo/go/go/types/testdata/init1.src @@ -0,0 +1,97 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// initialization cycles + +package init1 + +// issue 6683 (marked as WorkingAsIntended) + +type T0 struct{} + +func (T0) m() int { return y0 } + +var x0 = T0{} + +var y0 /* ERROR initialization cycle */ = x0.m() + +type T1 struct{} + +func (T1) m() int { return y1 } + +var x1 interface { + m() int +} = T1{} + +var y1 = x1.m() // no cycle reported, x1 is of interface type + +// issue 6703 (modified) + +var x2 /* ERROR initialization cycle */ = T2.m + +var y2 = x2 + +type T2 struct{} + +func (T2) m() int { + _ = y2 + return 0 +} + +var x3 /* ERROR initialization cycle */ = T3.m(T3{}) // <<<< added (T3{}) + +var y3 = x3 + +type T3 struct{} + +func (T3) m() int { + _ = y3 + return 0 +} + +var x4 /* ERROR initialization cycle */ = T4{}.m // <<<< added {} + +var y4 = x4 + +type T4 struct{} + +func (T4) m() int { + _ = y4 + return 0 +} + +var x5 /* ERROR initialization cycle */ = T5{}.m() // <<<< added () + +var y5 = x5 + +type T5 struct{} + +func (T5) m() int { + _ = y5 + return 0 +} + +// issue 4847 +// simplified test case + +var x6 = f6 +var y6 /* ERROR initialization cycle */ = f6 +func f6() { _ = y6 } + +// full test case + +type ( + E int + S int +) + +type matcher func(s *S) E + +func matchList(s *S) E { return matcher(matchAnyFn)(s) } + +var foo = matcher(matchList) + +var matchAny /* ERROR initialization cycle */ = matcher(matchList) + +func matchAnyFn(s *S) (err E) { return matchAny(s) } \ No newline at end of file diff --git a/libgo/go/go/types/testdata/init2.src b/libgo/go/go/types/testdata/init2.src new file mode 100644 index 00000000000..614db6c9491 --- /dev/null +++ b/libgo/go/go/types/testdata/init2.src @@ -0,0 +1,139 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// initialization cycles + +package init2 + +// cycles through functions + +func f1() int { _ = x1; return 0 } +var x1 /* ERROR initialization cycle */ = f1 + +func f2() int { _ = x2; return 0 } +var x2 /* ERROR initialization cycle */ = f2() + +// cycles through method expressions + +type T3 int +func (T3) m() int { _ = x3; return 0 } +var x3 /* ERROR initialization cycle */ = T3.m + +type T4 int +func (T4) m() int { _ = x4; return 0 } +var x4 /* ERROR initialization cycle */ = T4.m(0) + +type T3p int +func (*T3p) m() int { _ = x3p; return 0 } +var x3p /* ERROR initialization cycle */ = (*T3p).m + +type T4p int +func (*T4p) m() int { _ = x4p; return 0 } +var x4p /* ERROR initialization cycle */ = (*T4p).m(nil) + +// cycles through method expressions of embedded methods + +type T5 struct { E5 } +type E5 int +func (E5) m() int { _ = x5; return 0 } +var x5 /* ERROR initialization cycle */ = T5.m + +type T6 struct { E6 } +type E6 int +func (E6) m() int { _ = x6; return 0 } +var x6 /* ERROR initialization cycle */ = T6.m(T6{0}) + +type T5p struct { E5p } +type E5p int +func (*E5p) m() int { _ = x5p; return 0 } +var x5p /* ERROR initialization cycle */ = (*T5p).m + +type T6p struct { E6p } +type E6p int +func (*E6p) m() int { _ = x6p; return 0 } +var x6p /* ERROR initialization cycle */ = (*T6p).m(nil) + +// cycles through method values + +type T7 int +func (T7) m() int { _ = x7; return 0 } +var x7 /* ERROR initialization cycle */ = T7(0).m + +type T8 int +func (T8) m() int { _ = x8; return 0 } +var x8 /* ERROR initialization cycle */ = T8(0).m() + +type T7p int +func (*T7p) m() int { _ = x7p; return 0 } +var x7p /* ERROR initialization cycle */ = new(T7p).m + +type T8p int +func (*T8p) m() int { _ = x8p; return 0 } +var x8p /* ERROR initialization cycle */ = new(T8p).m() + +type T7v int +func (T7v) m() int { _ = x7v; return 0 } +var x7var T7v +var x7v /* ERROR initialization cycle */ = x7var.m + +type T8v int +func (T8v) m() int { _ = x8v; return 0 } +var x8var T8v +var x8v /* ERROR initialization cycle */ = x8var.m() + +type T7pv int +func (*T7pv) m() int { _ = x7pv; return 0 } +var x7pvar *T7pv +var x7pv /* ERROR initialization cycle */ = x7pvar.m + +type T8pv int +func (*T8pv) m() int { _ = x8pv; return 0 } +var x8pvar *T8pv +var x8pv /* ERROR initialization cycle */ = x8pvar.m() + +// cycles through method values of embedded methods + +type T9 struct { E9 } +type E9 int +func (E9) m() int { _ = x9; return 0 } +var x9 /* ERROR initialization cycle */ = T9{0}.m + +type T10 struct { E10 } +type E10 int +func (E10) m() int { _ = x10; return 0 } +var x10 /* ERROR initialization cycle */ = T10{0}.m() + +type T9p struct { E9p } +type E9p int +func (*E9p) m() int { _ = x9p; return 0 } +var x9p /* ERROR initialization cycle */ = new(T9p).m + +type T10p struct { E10p } +type E10p int +func (*E10p) m() int { _ = x10p; return 0 } +var x10p /* ERROR initialization cycle */ = new(T10p).m() + +type T9v struct { E9v } +type E9v int +func (E9v) m() int { _ = x9v; return 0 } +var x9var T9v +var x9v /* ERROR initialization cycle */ = x9var.m + +type T10v struct { E10v } +type E10v int +func (E10v) m() int { _ = x10v; return 0 } +var x10var T10v +var x10v /* ERROR initialization cycle */ = x10var.m() + +type T9pv struct { E9pv } +type E9pv int +func (*E9pv) m() int { _ = x9pv; return 0 } +var x9pvar *T9pv +var x9pv /* ERROR initialization cycle */ = x9pvar.m + +type T10pv struct { E10pv } +type E10pv int +func (*E10pv) m() int { _ = x10pv; return 0 } +var x10pvar *T10pv +var x10pv /* ERROR initialization cycle */ = x10pvar.m() diff --git a/libgo/go/go/types/testdata/issues.src b/libgo/go/go/types/testdata/issues.src new file mode 100644 index 00000000000..6579aa3b117 --- /dev/null +++ b/libgo/go/go/types/testdata/issues.src @@ -0,0 +1,188 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package issues + +import "fmt" + +func issue7035() { + type T struct{ X int } + _ = func() { + fmt.Println() // must refer to imported fmt rather than the fmt below + } + fmt := new(T) + _ = fmt.X +} + +func issue8066() { + const ( + _ = float32(340282356779733661637539395458142568447) + _ = float32(340282356779733661637539395458142568448 /* ERROR cannot convert */ ) + ) +} + +// Check that a missing identifier doesn't lead to a spurious error cascade. +func issue8799a() { + x, ok := missing /* ERROR undeclared */ () + _ = !ok + _ = x +} + +func issue8799b(x int, ok bool) { + x, ok = missing /* ERROR undeclared */ () + _ = !ok + _ = x +} + +func issue9182() { + type Point C /* ERROR undeclared */ .Point + // no error for composite literal based on unknown type + _ = Point{x: 1, y: 2} +} + +func f0() (a []int) { return } +func f1() (a []int, b int) { return } +func f2() (a, b []int) { return } + +func append_([]int, ...int) {} + +func issue9473(a []int, b ...int) { + // variadic builtin function + _ = append(f0()) + _ = append(f0(), f0()...) + _ = append(f1()) + _ = append(f2 /* ERROR cannot use .* in argument */ ()) + _ = append(f2()... /* ERROR cannot use ... */ ) + _ = append(f0(), f1 /* ERROR 2-valued f1 */ ()) + _ = append(f0(), f2 /* ERROR 2-valued f2 */ ()) + _ = append(f0(), f1 /* ERROR 2-valued f1 */ ()...) + _ = append(f0(), f2 /* ERROR 2-valued f2 */ ()...) + + // variadic user-defined function + append_(f0()) + append_(f0(), f0()...) + append_(f1()) + append_(f2 /* ERROR cannot use .* in argument */ ()) + append_(f2()... /* ERROR cannot use ... */ ) + append_(f0(), f1 /* ERROR 2-valued f1 */ ()) + append_(f0(), f2 /* ERROR 2-valued f2 */ ()) + append_(f0(), f1 /* ERROR 2-valued f1 */ ()...) + append_(f0(), f2 /* ERROR 2-valued f2 */ ()...) +} + +// Check that embedding a non-interface type in an interface results in a good error message. +func issue10979() { + type _ interface { + int /* ERROR int is not an interface */ + } + type T struct{} + type _ interface { + T /* ERROR T is not an interface */ + } + type _ interface { + nosuchtype /* ERROR undeclared name: nosuchtype */ + } + type _ interface { + fmt /* ERROR Nosuchtype not declared by package fmt */ .Nosuchtype + } + type _ interface { + nosuchpkg /* ERROR undeclared name: nosuchpkg */ .Nosuchtype + } + type I interface { + I /* ERROR I\.m \(value of type func\(I\)\) is not a type */ .m + m() + } +} + +// issue11347 +// These should not crash. +var a1, b1 /* ERROR cycle */ , c1 /* ERROR cycle */ b1 = 0 > 0<<""[""[c1]]>c1 +var a2, b2 /* ERROR cycle */ = 0 /* ERROR mismatch */ /* ERROR mismatch */ > 0<<""[b2] +var a3, b3 /* ERROR cycle */ = int /* ERROR mismatch */ /* ERROR mismatch */ (1<<""[b3]) + +// issue10260 +// Check that error messages explain reason for interface assignment failures. +type ( + I0 interface{} + I1 interface{ foo() } + I2 interface{ foo(x int) } + T0 struct{} + T1 struct{} + T2 struct{} +) + +func (*T1) foo() {} +func (*T2) foo(x int) {} + +func issue10260() { + var ( + i0 I0 + i1 I1 + i2 I2 + t0 *T0 + t1 *T1 + t2 *T2 + ) + i1 = i0 /* ERROR cannot use .* missing method foo */ + i1 = t0 /* ERROR cannot use .* missing method foo */ + i1 = i2 /* ERROR cannot use .* wrong type for method foo */ + i1 = t2 /* ERROR cannot use .* wrong type for method foo */ + i2 = i1 /* ERROR cannot use .* wrong type for method foo */ + i2 = t1 /* ERROR cannot use .* wrong type for method foo */ + + _ = func() I1 { return i0 /* ERROR cannot use .* missing method foo */ } + _ = func() I1 { return t0 /* ERROR cannot use .* missing method foo */ } + _ = func() I1 { return i2 /* ERROR cannot use .* wrong type for method foo */ } + _ = func() I1 { return t2 /* ERROR cannot use .* wrong type for method foo */ } + _ = func() I2 { return i1 /* ERROR cannot use .* wrong type for method foo */ } + _ = func() I2 { return t1 /* ERROR cannot use .* wrong type for method foo */ } + + // a few more - less exhaustive now + + f := func(I1, I2){} + f(i0 /* ERROR cannot use .* missing method foo */ , i1 /* ERROR cannot use .* wrong type for method foo */) + + _ = [...]I1{i0 /* ERROR cannot use .* missing method foo */ } + _ = [...]I1{i2 /* ERROR cannot use .* wrong type for method foo */ } + _ = []I1{i0 /* ERROR cannot use .* missing method foo */ } + _ = []I1{i2 /* ERROR cannot use .* wrong type for method foo */ } + _ = map[int]I1{0: i0 /* ERROR cannot use .* missing method foo */ } + _ = map[int]I1{0: i2 /* ERROR cannot use .* wrong type for method foo */ } + + make(chan I1) <- i0 /* ERROR cannot use .* in send: missing method foo */ + make(chan I1) <- i2 /* ERROR cannot use .* in send: wrong type for method foo */ +} + +// Check that constants representable as integers are in integer form +// before being used in operations that are only defined on integers. +func issue14229() { + // from the issue + const _ = int64(-1<<63) % 1e6 + + // related + const ( + a int = 3 + b = 4.0 + _ = a / b + _ = a % b + _ = b / a + _ = b % a + ) +} + +// Check that in a n:1 variable declaration with type and initialization +// expression the type is distributed to all variables of the lhs before +// the initialization expression assignment is checked. +func issue15755() { + // from issue + var i interface{} + type b bool + var x, y b = i.(b) + _ = x == y + + // related: we should see an error since the result of f1 is ([]int, int) + var u, v []int = f1 /* ERROR cannot use f1 */ () + _ = u + _ = v +} diff --git a/libgo/go/go/types/testdata/labels.src b/libgo/go/go/types/testdata/labels.src new file mode 100644 index 00000000000..9f424069654 --- /dev/null +++ b/libgo/go/go/types/testdata/labels.src @@ -0,0 +1,207 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file is a modified concatenation of the files +// $GOROOT/test/label.go and $GOROOT/test/label1.go. + +package labels + +var x int + +func f0() { +L1 /* ERROR "label L1 declared but not used" */ : + for { + } +L2 /* ERROR "label L2 declared but not used" */ : + select { + } +L3 /* ERROR "label L3 declared but not used" */ : + switch { + } +L4 /* ERROR "label L4 declared but not used" */ : + if true { + } +L5 /* ERROR "label L5 declared but not used" */ : + f0() +L6: + f0() +L6 /* ERROR "label L6 already declared" */ : + f0() + if x == 20 { + goto L6 + } + +L7: + for { + break L7 + break L8 /* ERROR "invalid break label L8" */ + } + +// A label must be directly associated with a switch, select, or +// for statement; it cannot be the label of a labeled statement. + +L7a /* ERROR "declared but not used" */ : L7b: + for { + break L7a /* ERROR "invalid break label L7a" */ + continue L7a /* ERROR "invalid continue label L7a" */ + continue L7b + } + +L8: + for { + if x == 21 { + continue L8 + continue L7 /* ERROR "invalid continue label L7" */ + } + } + +L9: + switch { + case true: + break L9 + defalt /* ERROR "label defalt declared but not used" */ : + } + +L10: + select { + default: + break L10 + break L9 /* ERROR "invalid break label L9" */ + } + + goto L10a +L10a: L10b: + select { + default: + break L10a /* ERROR "invalid break label L10a" */ + break L10b + continue L10b /* ERROR "invalid continue label L10b" */ + } +} + +func f1() { +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: + f1() + 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 + } + } +} + +// Additional tests not in the original files. + +func f2() { +L1 /* ERROR "label L1 declared but not used" */ : + if x == 0 { + for { + continue L1 /* ERROR "invalid continue label L1" */ + } + } +} + +func f3() { +L1: +L2: +L3: + for { + break L1 /* ERROR "invalid break label L1" */ + break L2 /* ERROR "invalid break label L2" */ + break L3 + continue L1 /* ERROR "invalid continue label L1" */ + continue L2 /* ERROR "invalid continue label L2" */ + continue L3 + goto L1 + goto L2 + goto L3 + } +} + +// Blank labels are never declared. + +func f4() { +_: +_: // multiple blank labels are ok + goto _ /* ERROR "label _ not declared" */ +} + +func f5() { +_: + for { + break _ /* ERROR "invalid break label _" */ + continue _ /* ERROR "invalid continue label _" */ + } +} + +func f6() { +_: + switch { + default: + break _ /* ERROR "invalid break label _" */ + } +} diff --git a/libgo/go/go/types/testdata/methodsets.src b/libgo/go/go/types/testdata/methodsets.src new file mode 100644 index 00000000000..89211468ead --- /dev/null +++ b/libgo/go/go/types/testdata/methodsets.src @@ -0,0 +1,214 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package methodsets + +type T0 struct {} + +func (T0) v0() {} +func (*T0) p0() {} + +type T1 struct {} // like T0 with different method names + +func (T1) v1() {} +func (*T1) p1() {} + +type T2 interface { + v2() + p2() +} + +type T3 struct { + T0 + *T1 + T2 +} + +// Method expressions +func _() { + var ( + _ func(T0) = T0.v0 + _ = T0 /* ERROR "not in method set" */ .p0 + + _ func (*T0) = (*T0).v0 + _ func (*T0) = (*T0).p0 + + // T1 is like T0 + + _ func(T2) = T2.v2 + _ func(T2) = T2.p2 + + _ func(T3) = T3.v0 + _ func(T3) = T3 /* ERROR "not in method set" */ .p0 + _ func(T3) = T3.v1 + _ func(T3) = T3.p1 + _ func(T3) = T3.v2 + _ func(T3) = T3.p2 + + _ func(*T3) = (*T3).v0 + _ func(*T3) = (*T3).p0 + _ func(*T3) = (*T3).v1 + _ func(*T3) = (*T3).p1 + _ func(*T3) = (*T3).v2 + _ func(*T3) = (*T3).p2 + ) +} + +// Method values with addressable receivers +func _() { + var ( + v0 T0 + _ func() = v0.v0 + _ func() = v0.p0 + ) + + var ( + p0 *T0 + _ func() = p0.v0 + _ func() = p0.p0 + ) + + // T1 is like T0 + + var ( + v2 T2 + _ func() = v2.v2 + _ func() = v2.p2 + ) + + var ( + v4 T3 + _ func() = v4.v0 + _ func() = v4.p0 + _ func() = v4.v1 + _ func() = v4.p1 + _ func() = v4.v2 + _ func() = v4.p2 + ) + + var ( + p4 *T3 + _ func() = p4.v0 + _ func() = p4.p0 + _ func() = p4.v1 + _ func() = p4.p1 + _ func() = p4.v2 + _ func() = p4.p2 + ) +} + +// Method calls with addressable receivers +func _() { + var v0 T0 + v0.v0() + v0.p0() + + var p0 *T0 + p0.v0() + p0.p0() + + // T1 is like T0 + + var v2 T2 + v2.v2() + v2.p2() + + var v4 T3 + v4.v0() + v4.p0() + v4.v1() + v4.p1() + v4.v2() + v4.p2() + + var p4 *T3 + p4.v0() + p4.p0() + p4.v1() + p4.p1() + p4.v2() + p4.p2() +} + +// Method values with value receivers +func _() { + var ( + _ func() = T0{}.v0 + _ func() = T0 /* ERROR "not in method set" */ {}.p0 + + _ func() = (&T0{}).v0 + _ func() = (&T0{}).p0 + + // T1 is like T0 + + // no values for T2 + + _ func() = T3{}.v0 + _ func() = T3 /* ERROR "not in method set" */ {}.p0 + _ func() = T3{}.v1 + _ func() = T3{}.p1 + _ func() = T3{}.v2 + _ func() = T3{}.p2 + + _ func() = (&T3{}).v0 + _ func() = (&T3{}).p0 + _ func() = (&T3{}).v1 + _ func() = (&T3{}).p1 + _ func() = (&T3{}).v2 + _ func() = (&T3{}).p2 + ) +} + +// Method calls with value receivers +func _() { + T0{}.v0() + T0 /* ERROR "not in method set" */ {}.p0() + + (&T0{}).v0() + (&T0{}).p0() + + // T1 is like T0 + + // no values for T2 + + T3{}.v0() + T3 /* ERROR "not in method set" */ {}.p0() + T3{}.v1() + T3{}.p1() + T3{}.v2() + T3{}.p2() + + (&T3{}).v0() + (&T3{}).p0() + (&T3{}).v1() + (&T3{}).p1() + (&T3{}).v2() + (&T3{}).p2() +} + +// *T has no methods if T is an interface type +func issue5918() { + var ( + err error + _ = err.Error() + _ func() string = err.Error + _ func(error) string = error.Error + + perr = &err + _ = perr /* ERROR "no field or method" */ .Error() + _ func() string = perr /* ERROR "no field or method" */ .Error + _ func(*error) string = ( /* ERROR "no field or method" */ *error).Error + ) + + type T *interface{ m() int } + var ( + x T + _ = (*x).m() + _ = (*x).m + + _ = x /* ERROR "no field or method" */ .m() + _ = x /* ERROR "no field or method" */ .m + _ = T /* ERROR "no field or method" */ .m + ) +} diff --git a/libgo/go/go/types/testdata/shifts.src b/libgo/go/go/types/testdata/shifts.src new file mode 100644 index 00000000000..099c9ecc7cd --- /dev/null +++ b/libgo/go/go/types/testdata/shifts.src @@ -0,0 +1,341 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package shifts + +func shifts0() { + // basic constant shifts + const ( + s = 10 + _ = 0<<0 + _ = 1<> s) + _, _, _ = u, v, x +} + +func shifts4() { + // shifts in comparisons w/ untyped operands + var s uint + + _ = 1<> 1.1 /* ERROR "must be unsigned integer" */ // example from issue 11325 + _ = 0 >> 1.1 /* ERROR "must be unsigned integer" */ + _ = 0 << 1.1 /* ERROR "must be unsigned integer" */ + _ = 0 >> 1. + _ = 1 >> 1.1 /* ERROR "must be unsigned integer" */ + _ = 1 >> 1. + _ = 1. >> 1 + _ = 1. >> 1. + _ = 1.1 /* ERROR "must be integer" */ >> 1 +} + +func issue11594() { + var _ = complex64 /* ERROR "must be integer" */ (1) << 2 // example from issue 11594 + _ = float32 /* ERROR "must be integer" */ (0) << 1 + _ = float64 /* ERROR "must be integer" */ (0) >> 2 + _ = complex64 /* ERROR "must be integer" */ (0) << 3 + _ = complex64 /* ERROR "must be integer" */ (0) >> 4 +} diff --git a/libgo/go/go/types/testdata/stmt0.src b/libgo/go/go/types/testdata/stmt0.src new file mode 100644 index 00000000000..87f08e4314f --- /dev/null +++ b/libgo/go/go/types/testdata/stmt0.src @@ -0,0 +1,980 @@ +// 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. + +// statements + +package stmt0 + +func assignments0() (int, int) { + var a, b, c int + var ch chan int + f0 := func() {} + f1 := func() int { return 1 } + f2 := func() (int, int) { return 1, 2 } + f3 := func() (int, int, int) { return 1, 2, 3 } + + a, b, c = 1, 2, 3 + a, b, c = 1 /* ERROR "assignment count mismatch" */ , 2 + a, b, c = 1 /* ERROR "assignment count mismatch" */ , 2, 3, 4 + _, _, _ = a, b, c + + a = f0 /* ERROR "used as value" */ () + a = f1() + a = f2 /* ERROR "assignment count mismatch" */ () + a, b = f2() + a, b, c = f2 /* ERROR "assignment count mismatch" */ () + a, b, c = f3() + a, b = f3 /* ERROR "assignment count mismatch" */ () + + a, b, c = <- /* ERROR "assignment count mismatch" */ ch + + return /* ERROR "wrong number of return values" */ + return /* ERROR "wrong number of return values" */ 1 + return 1, 2 + return /* ERROR "wrong number of return values" */ 1, 2, 3 +} + +func assignments1() { + b, i, f, c, s := false, 1, 1.0, 1i, "foo" + b = i /* ERROR "cannot use .* in assignment" */ + i = f /* ERROR "cannot use .* in assignment" */ + f = c /* ERROR "cannot use .* in assignment" */ + c = s /* ERROR "cannot use .* in assignment" */ + s = b /* ERROR "cannot use .* in assignment" */ + + v0, v1, v2 := 1 /* ERROR "mismatch" */ , 2, 3, 4 + _, _, _ = v0, v1, v2 + + b = true + + i += 1 + i += "foo" /* ERROR "cannot convert.*int" */ + + f -= 1 + f /= 0 + f = float32(0)/0 /* ERROR "division by zero" */ + f -= "foo" /* ERROR "cannot convert.*float64" */ + + c *= 1 + c /= 0 + + s += "bar" + s += 1 /* ERROR "cannot convert.*string" */ + + var u64 uint64 + u64 += 1<FS$5RU7~2?v;79du#tuwYQ>a&%Fgu_O4vfdD?GSMM7;DjgQN$$5yJ5Wm9E z+5bP`$n$a@o=x-l8#oqN8qI&s(D|rVAxZ9n%ri5ALOz#2%tAd1O%M6amNPJH^j176 T`tP7S&>99$S3j3^P6NS%G|}k|4ie z28Oc9XDvXyByV>Y28LC=%0@t5f~SjPh{WaI^M+gp3^-T=3csiv4Q}hPY)zR|f6C0w zxJ2XcWoMTCF7}HoGFZJm8u^!HI&jaJ_kuGy=R#8y15drw_Xvx6CN;KWxv0ZanUbL``{xlqk(oYc)I$ztaD0e0sz+MK9T?c literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftbbn0g02.sng b/libgo/go/image/png/testdata/pngsuite/ftbbn0g02.sng new file mode 100644 index 00000000000..9686a6a2eef --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftbbn0g02.sng @@ -0,0 +1,45 @@ +#SNG: from ftbbn0g02.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using grayscale; +} +gAMA {0.45455} +bKGD {gray: 0;} +tRNS { + gray: 0; +} +IMAGE { + pixels hex +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00aaaaaaaaaaaaaa000000000000000000000000000000000000000000000000 +00aaaaaaaaaaaaaaaa0000000000000000000000000000000000000000000000 +00aaaaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000 +00aaaaaa0000aaaaaaaa00000000000000000000000000000000000000000000 +00aaaaaa000000aaaaaa00000000000000000000000000000000000000000000 +00aaaaaa000000aaaaaa00aaaaaa000000aaaaaa000000000000000000000000 +00aaaaaa00aaaaaaaaaa00aaaaaa000000aaaaaa000000000000000000000000 +00aaaaaaaaaaaaaaaaaa00aaaaaaaa0000aaaaaa000000000000000000000000 +00aaaaaaaaaaaaaaaa0000aaaaaaaa0000aaaaaa000000000000000000000000 +00aaaaaaaaaa0000000000aaaaaaaaaa00aaaaaa000000000000000000000000 +00aaaaaa00000000000000aaaaaaaaaa00aaaaaa0000000000aaaaaaaaaa0000 +00aaaaaa00000000000000aaaaaaaaaaaaaaaaaa000000aaaaaaaaaaaaaaaa00 +00aaaaaa00000000000000aaaaaaaaaaaaaaaaaa000000aaaaaaaaaaaaaaaa00 +00aaaaaa00000000000000aaaaaaaaaaaaaaaaaa0000aaaaaaaaaa00aaaaaa00 +0000000000000000000000aaaaaa00aaaaaaaaaa0000aaaaaaaa000000000000 +0000000000000000000000aaaaaa00aaaaaaaaaa0000aaaaaa00000000000000 +0000000000000000000000aaaaaa0000aaaaaaaa0000aaaaaa0000aaaaaa0000 +0000000000000000000000aaaaaa000000aaaaaa0000aaaaaa00aaaaaaaaaa00 +0000000000000000000000aaaaaa000000aaaaaa0000aaaaaa0000aaaaaaaa00 +00000000000000000000000000000000000000000000aaaaaa00000000aaaa00 +00000000000000000000000000000000000000000000aaaaaaaa0000aaaaaa00 +00000000000000000000000000000000000000000000aaaaaaaaaaaaaaaaaa00 +0000000000000000000000000000000000000000000000aaaaaaaaaaaaaaaa00 +000000000000000000000000000000000000000000000000aaaaaaaaaaaa0000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +} diff --git a/libgo/go/image/png/testdata/pngsuite/ftbbn0g04.png b/libgo/go/image/png/testdata/pngsuite/ftbbn0g04.png new file mode 100644 index 0000000000000000000000000000000000000000..39a7050d27af28f3bcb7bfc6b071cae91f8c091b GIT binary patch literal 429 zcmV;e0aE^nP)eGf1AoYPn=%bN?oV&q3&xZP#{- zd#wGeV8okcyH@o)cboHb1rrf^jB^?sG2T2?@G1n)CJc@hyhCf)&E8%^0~1oF;v>7S z;6sBJiji@r0Yq=mmR;)Ojr>$W46R-Sau7HO7xZFtI1{|4z%-nLbW=B z3o0EAC)h$;8WIR1rohQ#w444G0#1m$Dj66xet|L#R>4C36e7xMM0T)(aSAa2XfV)D zcEU#my$(kCaRx~QL^LgQ_;=)3gHxFOXBZJd{maEJLqY3H<>rDuET^1Yth7z0>+1gi X{l69U>r1pj4E?y3$fw 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 literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftbgn3p08.sng b/libgo/go/image/png/testdata/pngsuite/ftbgn3p08.sng new file mode 100644 index 00000000000..0e3b7bd77dc --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftbgn3p08.sng @@ -0,0 +1,292 @@ +#SNG: from ftbgn3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) + (170,170,170) # rgb = (0xaa,0xaa,0xaa) +} +bKGD {index: 245} +tRNS { + 0} +IMAGE { + pixels hex +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000e0ea66000000000000000000000000000000 +0000000000000000000000de02a336e43903f4f0000000000000000000000000 +000000000000000069ef1a358680062eb017b0ab7af459500000000000000000 +0000000000667c0ea9cc803979937917a03a878787b0e2ae8ae75c0000000000 +00005cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c690000 +00007823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e0000 +0000e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef0000 +00006c9f229d981a23282828282828282828282828282828a7b445c3c8de0000 +00005ca249d63d140f139f272727272727272727a5a528af44c3c8ce43000000 +0000009a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1000000 +000000965b58b53811940d0b090b1823a3a3252ab4d24c269957571088000000 +000000946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877000000 +00000088c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950000000 +00000002bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a900000000 +0000007b47636ec441b23d4edb3f09078bac4315f340ec855a82995f00000000 +00000059bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b00000000 +0000006cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086000000000 +00000050bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e60000000000 +00000000add6d6bf61c16f566eb20e0d924475bd578572c61e6d340000000000 +0000000016d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b0000000000 +00000000550c47b3365bd45d6f33110f1a4575cbf2c0521e0802000000000000 +000000000000e7ac36be625e7031131122455a0a2f0a99c6e700000000000000 +000000000000006a9e37d36270331613a545f181e53032e80000000000000000 +00000000000000005088c5d371311816a8464b7374ee89000000000000000000 +0000000000000000000077b654a29b18acc24a722a5500000000000000000000 +0000000000000000000000d78a9f9e9b3548c38ac90000000000000000000000 +00000000000000000000000000ef1f9e3cc20200000000000000000000000000 +0000000000000000000000000000e89736780000000000000000000000000000 +00000000000000000000000000000060e0000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +} diff --git a/libgo/go/image/png/testdata/pngsuite/ftbrn2c08.png b/libgo/go/image/png/testdata/pngsuite/ftbrn2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..5cca0d621047cacf1637cf7d77e997d51cc6b15a GIT binary patch literal 1633 zcmV-n2A=teP))6_}Akuqmh*5X4X^rIbM;BH-v?$kU01p_ErCl=u4~ zL7fbz&H-~9!(}3aFu`RZW&unzb50QkgK2!RYsr=o3t~2tT^d3tzx&+X@9uj)%)Vj6 z{|IpB&Yj-g-pR?y{}^!Z-o3WAwzRagh=_<-fB!T`$I~7jJzDL9k&%A|7#|<+>gvkP z&5eqRQiO&cb#=`%Gt&SnAO*+-su`xq!J$j392p#Z_UzeG0aH^`SFc_zD=UkSkAGjG zNZGY3d;R({hG_tbfDeIqE;r1MUWVZftDkNW!h zs;jG$lamt?5{`w2W;;5Ta5(kAS>OWD3k(34fhLB@x3Eyz+ozkGX8`3uA)t^*Vq;_J zARVu%si6?50P_I-{r&0b>GXAy-pZYvJ_kMn+JSRiZt1pd#bWVg8=D~(>oza}`~v)> zM}7e)8HRFA`iDhFM^mix0K>z>DwQfHCnqyAGc`3;6%f#2ZhqFvO5^8uBq=H7FUwFU zT6XLhvbG*uwdz+cchJo2l$~8_P|)B15EmC05)$I?@88+kIS+9E{(W+tk&&UwQ56&v z(A`o(AH0rH_Tk~-0RaJGvDnww_wL=h^8j=?>6z)a6}IeCY}aO2b*Z|fq@=L0@WhD| zsSDdty^(jSiA*M&bM5WzEtks;bWvVj9&?GoHDC(zc6o7eG4)bKMMY_8X?Aw@u?6h# z;lshf`|a#hY<3Bkd&JHz$kWs3`0?Wg0OXPTF&CY{G^|Igi;9ZKH36!ss;DvOr&_J1 zx~1t&sZ>(M4;(lkk?c1!`x@w{b_L!AqU`OZt*xyF0OXE$lBa8(+d4*aQ!-UaQ=##! z_w+pDSx{e4UteEaTT3@Y0IErFaIj1kyl&n1z;8e!i?yF&L_nC8m3(Mu$N-?Zxp_n7 z2DAX*=>Wn$A?4)L>VvOzv*1+iR99Em(9l2wMRh0dROro{PXe>RH6x>UEG*vQa@TOV zQlU`t^yyOrfcExwL7@Om)cL>za2|4U%W^%=c<5%V3NB?X6h0+EjKsu5@-7xf85_?~ z_(n!?E-s$Cckkx$Tm=FtNq~V#ChO_xan5qaMSv9N2jF-3*7yqRh3Ek)Au1KoO;8fV zprIvzKyXeU{%KoVxrc`zkCz5CFib&h?McIcn>TN|Dcy8{RDkAq5^L3Kg|$LmUsXU< zBBJ4(W03sGWO5UeaSET!R&3c4%;9JOl9gkorlAz5VF1mVSE84$J}Q`0nqU|>1Di@4 ze5+F&_hR?T%1UBTp~Aw#cJ55qhku#R59RT^^+74-!fSSE~<7VgEJh?uUa0qm; z8Ez47t52=QkANEJ0t(=x^_iQy^73*TT0XxG7zGZwyYCSQ1YB+maEUU=$|_zAke{D# zTyIS3>>TO5U9}y3y6WrNG#}mt-ZU1(ApHmo3|zUggX&{s6zS#V<>Yh_y5_4hF$wDK z?p_S=`P`~WeyGw#>B+X26iZPz^D41kPE3=O0g4z6qf*N)=*PsGE4-+(Dp2{ zw2Zxeeeh*hh5=+_V`EuaSwV3@IIpj54kWn}jYdNZ8e`JrO`E(~ENUAnPWZ-+iMMY3 zY|zhwfLVQ0wY0S8#Df-Q7G&8n5<6nh7)vA)kx0bn+nAbqczMM?d^oX?lf?jYc4O#< zON|S4tujMN`;Hh?Jz7|PetuiGZY4pbYg^pItKUTv6B8tGw0Wp##Go?l literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftbrn2c08.sng b/libgo/go/image/png/testdata/pngsuite/ftbrn2c08.sng new file mode 100644 index 00000000000..9569bdaf78c --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftbrn2c08.sng @@ -0,0 +1,45 @@ +#SNG: from ftbrn2c08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color; +} +gAMA {1.0000} +bKGD {red: 255; green: 0; blue: 0;} +tRNS { + red: 255; green: 255; blue: 255; +} +IMAGE { + pixels hex +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff e3e3e3 c9c9c9 f1f1f1 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff e8e8e8 b5b5b5 7e7e7e 656565 6e5252 7e2e2e a64343 c79090 ebdddd ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff eeeeee bfbfbf 898989 676767 6b5d5d 7a3939 8a1212 8d0000 850000 770000 840000 9a0101 a22d2d bf7d7d ddd0d0 fcfcfc ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff f2f2f2 c4c4c4 959595 727272 6f6b6b 774444 871e1e 950101 9f0000 910000 800000 720c0c 612d2d 530e0e 500000 590000 850000 920606 7a6666 a0a0a0 cfcfcf f8f8f8 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff f7f7f7 cacaca 9a9a9a 767676 737373 7c5d5d 872e2e 930707 9e0000 a90000 b00000 c90000 cf0000 b90000 a20101 8c1919 852a2a 7f1313 810000 960000 8f0000 6b5353 6e6e6e 737373 767676 9b9b9b c4c4c4 eeeeee ffffff ffffff +ffffff ffffff cccccc 7f7f7f 767676 757575 757575 962f2f b80000 b40000 b60000 ad0c0c 943a3a 925050 b92323 d60202 e20000 ef0000 e70000 da0000 cf0000 ba0000 7d0101 6f6b6b 757575 757575 757575 757575 6a6a6a 9a9a9a ffffff ffffff +ffffff ffffff dcdcdc 858585 888888 848484 7b7b7b 855454 b71313 a91d1d 8d4f4f 787575 777777 777777 777777 816b6b aa4141 d62020 ec1010 e90c0c d01212 a52828 7b5858 777777 777777 777777 707070 5c5c5c 525252 bdbdbd ffffff ffffff +ffffff ffffff eaeaea 848484 818181 858885 8e8e8e 898989 7f7f7f 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 767676 636363 545454 505050 4c4c4c e6e6e6 ffffff ffffff +ffffff ffffff f8f8f8 7f847f 259725 04a504 39a439 8b948b 939393 8f8f8f 838383 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7a7a7a 7a7a7a 797979 6a6a6a 575757 505050 4c4c4c 494949 595959 ffffff ffffff ffffff +ffffff ffffff ffffff 8a8a8a 01b301 00c600 00f200 59b659 929292 959595 979797 949494 878787 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 717171 5a5a60 282885 040493 0c0c78 282858 46464a 828282 ffffff ffffff ffffff +ffffff ffffff ffffff 929292 0cab0c 00bd00 00f400 20dd20 919191 949494 979797 999999 9b9b9b 999999 8b8b8b 7f7f7f 7e7e7e 7e7e7e 7d7d7d 777777 626262 535360 1212be 0000cc 000092 000069 000067 2a2a55 acacac ffffff ffffff ffffff +ffffff ffffff ffffff 949494 16a116 00b400 00e200 00f400 76a276 939393 8d978d 469e46 46a746 8e9e8e 9e9e9e 9c9c9c 8e8e8e 7e7e7e 6a6a6a 5a5a5a 57575a 1818cd 0000f0 0000a0 020260 01013d 000061 1d1d59 d6d6d6 ffffff ffffff ffffff +ffffff ffffff ffffff a4a4a4 219821 00aa00 00c800 00f400 3bca3b 929292 4aac4a 00bc00 00a900 2f9a2f 9d9d9d 9f9f9f a0a0a0 7a7a7a 5a5a5a 595959 3131a1 0000ff 0000c6 03035b 191924 0c0c15 0c0c55 3b3b53 fbfbfb ffffff ffffff ffffff +ffffff ffffff ffffff b6b6b6 2b8f2b 00a200 00ad00 00eb00 07ed07 899589 43a743 00c900 009900 389538 9c9c9c 9e9e9e 9f9f9f 747474 595959 505067 0505f5 0000f0 030370 383846 484848 161639 2b2b55 727272 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff c7c7c7 348634 00b100 008d00 00d200 00f300 4c9b4c 3b9e3b 00c700 009800 3d943d 9b9b9b 9d9d9d 9e9e9e 6e6e6e 595959 2b2bad 0000ff 0000a6 252559 43434f 16167e 00009f 01018e 9c9ca1 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff d8d8d8 3e7d3e 00b100 007b00 00b800 00f100 178b17 3b9c3b 00c600 009700 3d933d 9a9a9a 9b9b9b 9d9d9d 676767 575759 0909ee 0000f0 04046b 33335a 070790 00009e 00007c 0d0d5d c7c7c7 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff eaeaea 477447 00ad00 008500 099809 00dc00 00a700 239823 00c300 009600 3f923f 989898 9a9a9a 9c9c9c 616161 42427f 0000ff 0000b9 1a1a5d 161649 00007b 00006b 00006b 1c1c56 f4f4f4 ffffff ffffff ffffff ffffff +ffffff ffffff ffffff fcfcfc 506c50 00a900 009500 2d772d 00c100 00c500 019301 00c100 009000 4b914b 979797 999999 9a9a9a 5a5a5a 2b2ba4 0000f6 000086 2f2f53 191930 020263 000073 00009b 4d4d70 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff 687368 00a400 00a400 3e653e 14a514 00d400 008b00 00bf00 008e00 4a904a 959595 979797 969696 575757 1a1ab5 0000de 000068 3f3f4b 2b2b2b 0c0c6d 0000b3 00006b 868692 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff 8c8c8c 059e05 00b000 346634 408540 00ca00 009700 00bc00 008c00 498e49 939393 959595 8f8f8f 565656 0f0fb7 0000b9 030366 474747 2f2f64 0000a2 00009d 090958 c5c5c5 ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff fafafa 90b090 348534 616461 636a63 06af06 00ae00 00b900 008b00 538d53 919191 939393 898989 555555 0a0aa8 00009d 070763 34345c 04049b 0000b1 1a1a4d b5b5bb ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff d0d0d0 6d6d6d 656565 2d8f2d 00b200 00b600 008900 558b55 8f8f8f 919191 818181 555555 15157e 000084 010165 010184 000091 1c1c6e ceced0 ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ececec 868686 587058 00af00 00b300 008800 538953 8d8d8d 8f8f8f 7a7a7a 545454 2c2c49 02026b 000064 000063 292974 dfdfe5 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff fcfcfc aaaaaa 219821 00b000 008600 578757 8b8b8b 8d8d8d 747474 535353 3d3d3d 1a1a23 0d0d43 474772 ededef ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff d1d6d1 389b38 2d772d 7d817d 888888 8b8b8b 6d6d6d 525252 4f4f4f 373737 777777 fafafa ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff efefef a0a0a0 838383 868686 888888 676767 515151 505050 a0a0a0 fdfdfd ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff fefefe c0c0c0 858585 868686 616161 525252 b7b7b7 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff dedede 909090 656565 cccccc ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff f5f5f5 e3e3e3 ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff +} diff --git a/libgo/go/image/png/testdata/pngsuite/ftbwn0g16.png b/libgo/go/image/png/testdata/pngsuite/ftbwn0g16.png new file mode 100644 index 0000000000000000000000000000000000000000..99bdeed2b3b8564302d449e6578c4aca0f6261f5 GIT binary patch literal 1313 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 literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftbyn3p08.sng b/libgo/go/image/png/testdata/pngsuite/ftbyn3p08.sng new file mode 100644 index 00000000000..5d619873304 --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftbyn3p08.sng @@ -0,0 +1,292 @@ +#SNG: from ftbyn3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) + (255,255, 0) # rgb = (0xff,0xff,0x00) yellow1 +} +bKGD {index: 245} +tRNS { + 0} +IMAGE { + pixels hex +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000e0ea66000000000000000000000000000000 +0000000000000000000000de02a336e43903f4f0000000000000000000000000 +000000000000000069ef1a358680062eb017b0ab7af459500000000000000000 +0000000000667c0ea9cc803979937917a03a878787b0e2ae8ae75c0000000000 +00005cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c690000 +00007823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e0000 +0000e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef0000 +00006c9f229d981a23282828282828282828282828282828a7b445c3c8de0000 +00005ca249d63d140f139f272727272727272727a5a528af44c3c8ce43000000 +0000009a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1000000 +000000965b58b53811940d0b090b1823a3a3252ab4d24c269957571088000000 +000000946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877000000 +00000088c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950000000 +00000002bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a900000000 +0000007b47636ec441b23d4edb3f09078bac4315f340ec855a82995f00000000 +00000059bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b00000000 +0000006cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086000000000 +00000050bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e60000000000 +00000000add6d6bf61c16f566eb20e0d924475bd578572c61e6d340000000000 +0000000016d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b0000000000 +00000000550c47b3365bd45d6f33110f1a4575cbf2c0521e0802000000000000 +000000000000e7ac36be625e7031131122455a0a2f0a99c6e700000000000000 +000000000000006a9e37d36270331613a545f181e53032e80000000000000000 +00000000000000005088c5d371311816a8464b7374ee89000000000000000000 +0000000000000000000077b654a29b18acc24a722a5500000000000000000000 +0000000000000000000000d78a9f9e9b3548c38ac90000000000000000000000 +00000000000000000000000000ef1f9e3cc20200000000000000000000000000 +0000000000000000000000000000e89736780000000000000000000000000000 +00000000000000000000000000000060e0000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +} diff --git a/libgo/go/image/png/testdata/pngsuite/ftp0n0g08.png b/libgo/go/image/png/testdata/pngsuite/ftp0n0g08.png new file mode 100644 index 0000000000000000000000000000000000000000..333465fcdc9f10f7f25b2d999b558f5421983ecc GIT binary patch literal 719 zcmV;=0xe{x-64Dw5ISbDJfGPNXYF1fsnx~?7~M3eMD*m6rOMo0;2$rUW>-c(^**S*Ycd0zuX+u!1|S9WB+#F78QX<>lo? ziQz$h-hRnIWoQ!H=elq>2fX`s$g4Md}>$Ugu1e*ygBpcmqZ3DNb_5HNEsBtg8Fz$MsRgsRcUEt!R)#7 z@*=Hdg|%Ijgaqfp6x>M8@W|(*DezA>78ATBV zGiJ?6^pq7`pj8TmNNXtGQ7M(fr#kNOGpUKtO+a# zE}lAlTDXoRkAt?j2v0jgK~H>oU`AO)UQprWsr_L}qI~YALPA1E5ej}SPEJnGOv?!@ zojAEOR7Ob9QdC4?8%mP9keiy8ksVOlKd~`Xk)KCEK=mA2ntaoimYx|<+}mFjqR+?8 zZTJ8q(f(PLp6*}V-CGiDD=qBv7F)8vQWR0&(VZLQZ(jZjd%k$Tpt-FhJuqOwUu^jT z1pXapZA%Q=jx2U BP!RwC literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftp0n0g08.sng b/libgo/go/image/png/testdata/pngsuite/ftp0n0g08.sng new file mode 100644 index 00000000000..c8abd338936 --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftp0n0g08.sng @@ -0,0 +1,41 @@ +#SNG: from ftp0n0g08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using grayscale; +} +gAMA {1.0000} +IMAGE { + pixels hex +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7fe3c9f17f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7fe8b57e655a4661a1e17f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7feebf8967614d362a2824282f5091d4fc7f7f7f7f7f7f7f7f +7f7f7f7f7ff2c495726c533e2e302c272b3d23181b28306ca0cff87f7f7f7f7f +7f7ff7ca9a76736649313033353c3e38313c4533272d2b5a6e73769bc4ee7f7f +7f7fcc7f7675754e3736373c55645042444845423e38266c757575756a9a7f7f +7f7fdc8588847b6344476276777777726157524e4b4e63777777705c52bd7f7f +7f7fea8481878e897f797979797979797979797979797979766354504ce67f7f +7f7ff88268627890938f837b7b7b7b7b7b7b7b7b7a7a796a57504c49597f7f7f +7f7f7f8a69748e8f92959794877c7c7c7c7c7c7c7c715b3314182d46827f7f7f +7f7f7f92696f8f8f919497999b998b7f7e7e7d7762542517110c0c2fac7f7f7f +7f7f7f946769848f9093937a7f979e9c8e7e6a5a572d1b120d080b24d67f7f7f +7f7f7fa46764758f8f92836e636e9d9fa07a5a593e1d160d1a0d143efb7f7f7f +7f7f7fb6665f658a8e907e765a6e9c9e9f745953201b0f3a481a30727f7f7f7f +7f7f7fc76468537b8e7a757559709b9d9e6e593a1d132b442212119d7f7f7f7f +7f7f7fd86368486c8d5b7474586f9a9b9d6757231b103717120e16c77f7f7f7f +7f7f7fea61654e5d816268725870989a9c61491d15221c0e0c0c23f47f7f7f7f +7f7f7ffc6063575871735771547497999a5a391c0f331c0d0d12517f7f7f7f7f +7f7f7f7f6e606055697c51705373959796572c190c402b17140c877f7f7f7f7f +7f7f7f7f8c5f67516876586e527193958f5622150e4735121212c57f7f7f7f7f +7f7f7f7ffaa363636769666c5175919389551c121139151420b67f7f7f7f7f7f +7f7f7f7f7f7fd06d6566686b50758f918155210f0c101025ce7f7f7f7f7f7f7f +7f7f7f7f7f7f7fec8666676950738d8f7a542f0e0b0b31e07f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7ffcaa67674f738b8d74533d1b134ced7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7fd472587f888b6d524f3777fa7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7fefa0838688675150a0fd7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7ffec085866152b77f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7fde9065cc7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7ff5e37f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f +} diff --git a/libgo/go/image/png/testdata/pngsuite/ftp0n2c08.png b/libgo/go/image/png/testdata/pngsuite/ftp0n2c08.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6e42cb420fd08ecd78340256157fa5f8a22934 GIT binary patch literal 1594 zcmV-A2F3Y_P)u542F>)wJ;-zU<0Ta5X4X^rIbM; zBH-v?$kU01p_ErCl=u4~L7fbz&H-~9!(}3aFu`RZW&unzb50QkgK2zirzKlPEQpyV zJ88Z&UwhB*+;h+QpNot)Z1^7mZr{G$*Vi{SHT9YSckkY9Z*NaePmhd@j0*@zcXT}E z>DjB%+#enNPk@PuiSF+1yu7^V=xBLZ*b!IPd^0mOpafEZETD#AngxPxg<^DQ=;_m^ zO9f0%PhYumrM$d6AtB*?xjc2}&YX4Y${D5+CG4W_vSdOD(DVN&-oB_@QeZU}a320`R0!vG! zgF}Y7c_vT+6ajLvI4&-Z7Si(C+FA;c5-<-iFfc$*`Z-x=6;4i{1D^pMz*&|p+q$(x zB)Vj4J8WQZ3z!6c0e;dUzW@{rLwimBm&L@yP^|L+BO@b9r7|}+H!CYEEiFwM7}#lU ze#Y8b?eBj$IXU%j%aqGow{IV|u^C^v@>iA}GBZ1AZ=V(%{LdfavLmWItxn1d>CixU>w z(z&H&q%@~cmeiGMuLdu#(_V!Qg$)f2b#--gLIj|kgoK1hr6FtAeh>TxG#MD|V;DCe z+}c_;JUpxi(9+VfzG^*Mf$y{cVZV^}t ze*#wx4d1b}e2ZmQv#dlY6hC?LL=T{&qk~_>M>ADEa39m2fL{qvo7rko-xdG82;t3ZKJ~Z{8fjKg!o$ON?8wlCe~HHnv#{{d1tq7Cl~vHp z%#3~jNv`NUkyhKvAxIVA8=wbFDWm}$)k06v92)E2}b{Rj#QTCt*&@?&Ti zD zl4Z+2B9B~dgtK!fhf@n&;PLjfw||-Og6SEVLqkKcv9UCP1w{gUs+$RUkfbMoF`VR)x@ASCQaVB z(Z|4m%7&5?v0+2f&6_{#^|K%#LswL-t*u(|pn;hUX^xb{ju_O&VzJoG&5g&iH8u70 z_D*>4U~(ZRivi~B`tWs^S{JHXMW%x09Wf|-G_d^r{kLq{LV`-iwz!9v--{+ECrRLF z@=(%OV07*qoM6N<$f`h#14gdfE literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftp0n2c08.sng b/libgo/go/image/png/testdata/pngsuite/ftp0n2c08.sng new file mode 100644 index 00000000000..d41c7eb36c1 --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftp0n2c08.sng @@ -0,0 +1,41 @@ +#SNG: from ftp0n2c08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color; +} +gAMA {1.0000} +IMAGE { + pixels hex +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f e3e3e3 c9c9c9 f1f1f1 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f e8e8e8 b5b5b5 7e7e7e 656565 6e5252 7e2e2e a64343 c79090 ebdddd 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f eeeeee bfbfbf 898989 676767 6b5d5d 7a3939 8a1212 8d0000 850000 770000 840000 9a0101 a22d2d bf7d7d ddd0d0 fcfcfc 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f f2f2f2 c4c4c4 959595 727272 6f6b6b 774444 871e1e 950101 9f0000 910000 800000 720c0c 612d2d 530e0e 500000 590000 850000 920606 7a6666 a0a0a0 cfcfcf f8f8f8 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f f7f7f7 cacaca 9a9a9a 767676 737373 7c5d5d 872e2e 930707 9e0000 a90000 b00000 c90000 cf0000 b90000 a20101 8c1919 852a2a 7f1313 810000 960000 8f0000 6b5353 6e6e6e 737373 767676 9b9b9b c4c4c4 eeeeee 7f7f7f 7f7f7f +7f7f7f 7f7f7f cccccc 7f7f7f 767676 757575 757575 962f2f b80000 b40000 b60000 ad0c0c 943a3a 925050 b92323 d60202 e20000 ef0000 e70000 da0000 cf0000 ba0000 7d0101 6f6b6b 757575 757575 757575 757575 6a6a6a 9a9a9a 7f7f7f 7f7f7f +7f7f7f 7f7f7f dcdcdc 858585 888888 848484 7b7b7b 855454 b71313 a91d1d 8d4f4f 787575 777777 777777 777777 816b6b aa4141 d62020 ec1010 e90c0c d01212 a52828 7b5858 777777 777777 777777 707070 5c5c5c 525252 bdbdbd 7f7f7f 7f7f7f +7f7f7f 7f7f7f eaeaea 848484 818181 858885 8e8e8e 898989 7f7f7f 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 797979 767676 636363 545454 505050 4c4c4c e6e6e6 7f7f7f 7f7f7f +7f7f7f 7f7f7f f8f8f8 7f847f 259725 04a504 39a439 8b948b 939393 8f8f8f 838383 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7b7b7b 7a7a7a 7a7a7a 797979 6a6a6a 575757 505050 4c4c4c 494949 595959 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 8a8a8a 01b301 00c600 00f200 59b659 929292 959595 979797 949494 878787 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 7c7c7c 717171 5a5a60 282885 040493 0c0c78 282858 46464a 828282 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 929292 0cab0c 00bd00 00f400 20dd20 919191 949494 979797 999999 9b9b9b 999999 8b8b8b 7f7f7f 7e7e7e 7e7e7e 7d7d7d 777777 626262 535360 1212be 0000cc 000092 000069 000067 2a2a55 acacac 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 949494 16a116 00b400 00e200 00f400 76a276 939393 8d978d 469e46 46a746 8e9e8e 9e9e9e 9c9c9c 8e8e8e 7e7e7e 6a6a6a 5a5a5a 57575a 1818cd 0000f0 0000a0 020260 01013d 000061 1d1d59 d6d6d6 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f a4a4a4 219821 00aa00 00c800 00f400 3bca3b 929292 4aac4a 00bc00 00a900 2f9a2f 9d9d9d 9f9f9f a0a0a0 7a7a7a 5a5a5a 595959 3131a1 0000ff 0000c6 03035b 191924 0c0c15 0c0c55 3b3b53 fbfbfb 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f b6b6b6 2b8f2b 00a200 00ad00 00eb00 07ed07 899589 43a743 00c900 009900 389538 9c9c9c 9e9e9e 9f9f9f 747474 595959 505067 0505f5 0000f0 030370 383846 484848 161639 2b2b55 727272 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f c7c7c7 348634 00b100 008d00 00d200 00f300 4c9b4c 3b9e3b 00c700 009800 3d943d 9b9b9b 9d9d9d 9e9e9e 6e6e6e 595959 2b2bad 0000ff 0000a6 252559 43434f 16167e 00009f 01018e 9c9ca1 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f d8d8d8 3e7d3e 00b100 007b00 00b800 00f100 178b17 3b9c3b 00c600 009700 3d933d 9a9a9a 9b9b9b 9d9d9d 676767 575759 0909ee 0000f0 04046b 33335a 070790 00009e 00007c 0d0d5d c7c7c7 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f eaeaea 477447 00ad00 008500 099809 00dc00 00a700 239823 00c300 009600 3f923f 989898 9a9a9a 9c9c9c 616161 42427f 0000ff 0000b9 1a1a5d 161649 00007b 00006b 00006b 1c1c56 f4f4f4 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f fcfcfc 506c50 00a900 009500 2d772d 00c100 00c500 019301 00c100 009000 4b914b 979797 999999 9a9a9a 5a5a5a 2b2ba4 0000f6 000086 2f2f53 191930 020263 000073 00009b 4d4d70 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 687368 00a400 00a400 3e653e 14a514 00d400 008b00 00bf00 008e00 4a904a 959595 979797 969696 575757 1a1ab5 0000de 000068 3f3f4b 2b2b2b 0c0c6d 0000b3 00006b 868692 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 8c8c8c 059e05 00b000 346634 408540 00ca00 009700 00bc00 008c00 498e49 939393 959595 8f8f8f 565656 0f0fb7 0000b9 030366 474747 2f2f64 0000a2 00009d 090958 c5c5c5 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f fafafa 90b090 348534 616461 636a63 06af06 00ae00 00b900 008b00 538d53 919191 939393 898989 555555 0a0aa8 00009d 070763 34345c 04049b 0000b1 1a1a4d b5b5bb 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f d0d0d0 6d6d6d 656565 2d8f2d 00b200 00b600 008900 558b55 8f8f8f 919191 818181 555555 15157e 000084 010165 010184 000091 1c1c6e ceced0 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f ececec 868686 587058 00af00 00b300 008800 538953 8d8d8d 8f8f8f 7a7a7a 545454 2c2c49 02026b 000064 000063 292974 dfdfe5 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f fcfcfc aaaaaa 219821 00b000 008600 578757 8b8b8b 8d8d8d 747474 535353 3d3d3d 1a1a23 0d0d43 474772 ededef 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f d1d6d1 389b38 2d772d 7d817d 888888 8b8b8b 6d6d6d 525252 4f4f4f 373737 777777 fafafa 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f efefef a0a0a0 838383 868686 888888 676767 515151 505050 a0a0a0 fdfdfd 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f fefefe c0c0c0 858585 868686 616161 525252 b7b7b7 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f dedede 909090 656565 cccccc 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f f5f5f5 e3e3e3 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f 7f7f7f +} diff --git a/libgo/go/image/png/testdata/pngsuite/ftp0n3p08.png b/libgo/go/image/png/testdata/pngsuite/ftp0n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..69a69e5872234d96cab4cbb017a0933fbfedba81 GIT binary patch literal 1476 zcmWlXc~H^`6vv-Om}J3dn5OOMOgg5aIm=3#R_~R8*9gm+#ueDlIJqsFg@0;tH{|b8}HqQ5Jw$Ebasl zi9{wQqx{s={QP`?_T1du%K+m5+1c6W&Yc6O&&;#KYi za0xyG{0*U@p&=n5OeT{~rxS7s!NI{ht9Awk26}jqu-LA432IQH$P*->1%a<=E7fhf7KmpiNEL?|$g$1|@ z&=;ZU0fm$KWEP7BFz+mN_CD$D>KXyBfJUPQ1qHz$U@Noz`t>V3 z0Y5*#_4Rf5=AAr|%l))v3zbTRZXmD;`udA>dIa18XhRr(3s9%iK@&&<11kswKn|(| zCKfuzi4TRu*jp4GWDgcp#{666_U|?<$;@lL6fyrT=v@~MF43;U zZ$6b_)kkb?TQRlFx@L1DFHuvCdiGRV@qSb5o3SyX=dqWIo~SD}lgtU8-0hinIc|l^ zwZpyIy{+Kp3qku~jyuQS{wOJTffqk}ylg!rGf@@8WYp~qRTEe@i_6M#f}U2WR@4MfM)1HJRjPCMx~ z7uM(-p3*y>&A)fhi1A3;cS(L+J1;&pqWL&it>CX0-+eBqO{=g-lKzNGvG(`sNqtRF zeg3%mDzvL|F3Eho_0DyETn8H%dc!?dA!#0>Q=Vr9#{-Ga&|1#6CAW+Q0sfY$`N-&; z^0c=#@%4)8jy6X3lL6u3JAW=?c#tm>K2a$#(Q?|Uz}T^+pWADD@MB|q8>&Xr948aj zsY1|Z7&ad@u4wr4W%TE{WS7U&Rh^yI#(OsCtq$vQ3|A*M_uLm%-A~M)I@BiVUyS#YR$&g!`CNx58tIE z|3D@=NLJY$Q%;J12ZU?1w#&^2c5EzDN05DZLoa2szJ*SEwwg0|Mem<$Yn1cWcz^cq z-}lxrB6iz%k1R&3=>`|KS%};k)l(YskH!jI!g#-(&O>3hx)5(GX8X3fe_&q16?&Zr z)72bEymR&OySDOI3mZ0C3tSEiO=8X3u^BG}uBukDWrMyZ$LQ%Y4sr7@il=hRi%!IK N0G~qvls0mN@PBi2fm#3n literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftp0n3p08.sng b/libgo/go/image/png/testdata/pngsuite/ftp0n3p08.sng new file mode 100644 index 00000000000..f1f8448d002 --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftp0n3p08.sng @@ -0,0 +1,288 @@ +#SNG: from ftp0n3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) +} +IMAGE { + pixels hex +2323232323232323232323232323232323232323232323232323232323232323 +2323232323232323232323232323232323232323232323232323232323232323 +2323232323232323232323232323e0ea66232323232323232323232323232323 +2323232323232323232323de02a336e43903f4f0232323232323232323232323 +232323232323232369ef1a358680062eb017b0ab7af459502323232323232323 +2323232323667c0ea9cc803979937917a03a878787b0e2ae8ae75c2323232323 +23235cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c692323 +23237823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e2323 +2323e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef2323 +23236c9f229d981a23282828282828282828282828282828a7b445c3c8de2323 +23235ca249d63d140f139f272727272727272727a5a528af44c3c8ce43232323 +2323239a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1232323 +232323965b58b53811940d0b090b1823a3a3252ab4d24c269957571088232323 +232323946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877232323 +23232388c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950232323 +23232302bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a923232323 +2323237b47636ec441b23d4edb3f09078bac4315f340ec855a82995f23232323 +23232359bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b23232323 +2323236cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086023232323 +23232350bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e62323232323 +23232323add6d6bf61c16f566eb20e0d924475bd578572001e6d342323232323 +2323232316d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b2323232323 +23232323550c47b3365bd45d6f33110f1a4575cbf2c0521e0802232323232323 +232323232323e7ac36be625e7031131122455a0a2f0a9900e723232323232323 +232323232323236a9e37d36270331613a545f181e53032e82323232323232323 +23232323232323235088c5d371311816a8464b7374ee89232323232323232323 +2323232323232323232377b654a29b18acc24a722a5523232323232323232323 +2323232323232323232323d78a9f9e9b3548c38ac92323232323232323232323 +232323232323232323232323c6ef1f9e3cc20223232323232323232323232323 +2323232323232323232323232323e89736782323232323232323232323232323 +23232323232323232323232323232360e0232323232323232323232323232323 +2323232323232323232323232323232323232323232323232323232323232323 +} diff --git a/libgo/go/image/png/testdata/pngsuite/ftp1n3p08.png b/libgo/go/image/png/testdata/pngsuite/ftp1n3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..a6c9f35a86271c056e955f637a8769381eb03827 GIT binary patch literal 1483 zcmWlXdpOez7{_0ijw~Xj6ZLfH5mEEBP|@KrEtkTuS}m>SI;>1?8{6D(v$V!$$}kk^ z;zXQM92O%H=ShmnbXw(ZQ8_r3^Xq+{_x=9)zVGMz<@$KL>7tBL0HEvPj`Ks*k)Uu?Q@xn6z>Z3lMM-Q#6tfUZ$jg9xOySS8oYSdsZ?58S}Ku90Gh5`xl#{MR8%wt zP*_-43Lq2;*RS7_pPzr}(xrd%E)}>Vg+~H{0|EmB;S209 z+JEZQsgoy9!bij)vJ2CNNF)M$vKCsqg}Grc6c_?OKR+KIALs+qBGU~U&cS2w^z{7x z{X6{3T?w5=n_Ror-Q69U!8X)ZUHvP8K!G~|wFu*%2C7slr~p15FS4}-9)W zgA1TkDj@~(fB8jCjUG%S0R(${)B5}SM@HTPu)4duH*Un5nj+Sda5!dbYwOg=2pWA9 zg`xngv~oCl+wa{*R;b1Lc@x0-<4`CPvRn@w_UQh+Ac}Mk^OKb>f7-E19*W;}xs}~! zRlIciNyF__FM9f7*5I)-+cbPa1|k-TrQvsONlsb*)pnz$h0|UcNA3@z)MNfwE}Uv0 zIbFH+_Zk14HEp3y&g@1-ft^E-J#CK+WhE5TXruYlt&^-N^P3g#I=H!w`R}L=sT9s{ zCuD1uhCdG)aY*zhVd3F}HZMyY{g2C62iLwz8h1Q_?PFhSvbid>^O4P?YqRlh((eZd z#_aspCH=EBx%*CRO=qIG-J;L_AlZKBgiu)@&Tb|Ii=AapW?Zqp>gYA)sH#J5XB+h; zk9wYVqsyC_bvIrV9&w7WX>VWUAVpP~na{j&$UYNXX^m&}Uyx5RnnjA&4L3VdD!1H_ zD#Iq{ZueA8l;TIb`kpn$X5SsBHj?FpV!HrYcY~@^RN}pDGk;X^V&G~0qorYaOP*rv z^qN~4t3n!C(Ta6lUVkRto3S5$_!4xZm;=Uxwl-UlXk<^TD! zwrXx-kZ%7r>OqrnxrwlgbC>i*G{g?VCRx6GHc+-!v-|w+aMq(Z)3<$!sgDrNgW zt{66;txYft&kQV}Qtm74k`-qO{C2WMU5|#0wUn?oyC~|ghKx56YPk5`Xp_O#x8g2M X(5+n&l!#upArS?SL*BSr7fRay;V71Q literal 0 HcmV?d00001 diff --git a/libgo/go/image/png/testdata/pngsuite/ftp1n3p08.sng b/libgo/go/image/png/testdata/pngsuite/ftp1n3p08.sng new file mode 100644 index 00000000000..2d179e2e991 --- /dev/null +++ b/libgo/go/image/png/testdata/pngsuite/ftp1n3p08.sng @@ -0,0 +1,290 @@ +#SNG: from ftp1n3p08.png +IHDR { + width: 32; height: 32; bitdepth: 8; + using color palette; +} +gAMA {1.0000} +PLTE { + (255,255,255) # rgb = (0xff,0xff,0xff) grey100 + (128, 86, 86) # rgb = (0x80,0x56,0x56) + (181,181,184) # rgb = (0xb5,0xb5,0xb8) + (168, 66, 66) # rgb = (0xa8,0x42,0x42) + (159,159,159) # rgb = (0x9f,0x9f,0x9f) + (177, 32, 32) # rgb = (0xb1,0x20,0x20) + (139, 21, 21) # rgb = (0x8b,0x15,0x15) + (157,157,157) # rgb = (0x9d,0x9d,0x9d) + ( 27, 27, 89) # rgb = (0x1b,0x1b,0x59) + (155,155,155) # rgb = (0x9b,0x9b,0x9b) + ( 0, 0,132) # rgb = (0x00,0x00,0x84) + (153,153,153) # rgb = (0x99,0x99,0x99) grey60 + (143,167,143) # rgb = (0x8f,0xa7,0x8f) + (151,151,151) # rgb = (0x97,0x97,0x97) + (149,149,149) # rgb = (0x95,0x95,0x95) + (147,147,147) # rgb = (0x93,0x93,0x93) + ( 41, 41, 86) # rgb = (0x29,0x29,0x56) + (145,145,145) # rgb = (0x91,0x91,0x91) grey57 + ( 0, 0,155) # rgb = (0x00,0x00,0x9b) + (143,143,143) # rgb = (0x8f,0x8f,0x8f) grey56 + (139,149,139) # rgb = (0x8b,0x95,0x8b) + ( 46, 46,167) # rgb = (0x2e,0x2e,0xa7) + (141,141,141) # rgb = (0x8d,0x8d,0x8d) + (128, 0, 0) # rgb = (0x80,0x00,0x00) + (139,139,139) # rgb = (0x8b,0x8b,0x8b) + (185, 0, 0) # rgb = (0xb9,0x00,0x00) + (137,137,137) # rgb = (0x89,0x89,0x89) + ( 12, 12,213) # rgb = (0x0c,0x0c,0xd5) + (120,117,117) # rgb = (0x78,0x75,0x75) + (135,135,135) # rgb = (0x87,0x87,0x87) grey53 + ( 0, 0,178) # rgb = (0x00,0x00,0xb2) + (133,133,133) # rgb = (0x85,0x85,0x85) grey52 + (165, 0, 0) # rgb = (0xa5,0x00,0x00) + (222, 0, 0) # rgb = (0xde,0x00,0x00) + (129,129,129) # rgb = (0x81,0x81,0x81) + (127,127,127) # rgb = (0x7f,0x7f,0x7f) grey50 + ( 0, 0,158) # rgb = (0x00,0x00,0x9e) + (125,125,125) # rgb = (0x7d,0x7d,0x7d) grey49 + ( 0, 0,201) # rgb = (0x00,0x00,0xc9) + (123,123,123) # rgb = (0x7b,0x7b,0x7b) + (121,121,121) # rgb = (0x79,0x79,0x79) + ( 55, 55, 86) # rgb = (0x37,0x37,0x56) + (119,119,119) # rgb = (0x77,0x77,0x77) + (117,117,117) # rgb = (0x75,0x75,0x75) grey46 + (115,115,115) # rgb = (0x73,0x73,0x73) grey45 + ( 72,169, 72) # rgb = (0x48,0xa9,0x48) + (142, 0, 0) # rgb = (0x8e,0x00,0x00) + ( 2, 2,100) # rgb = (0x02,0x02,0x64) + ( 0, 0, 98) # rgb = (0x00,0x00,0x62) + ( 86,137, 86) # rgb = (0x56,0x89,0x56) + ( 40, 40,124) # rgb = (0x28,0x28,0x7c) + ( 83,139, 83) # rgb = (0x53,0x8b,0x53) + (137,137,143) # rgb = (0x89,0x89,0x8f) + (103,103,103) # rgb = (0x67,0x67,0x67) + (101,101,101) # rgb = (0x65,0x65,0x65) + ( 93,109, 93) # rgb = (0x5d,0x6d,0x5d) + ( 19,229, 19) # rgb = (0x13,0xe5,0x13) + (134, 38, 38) # rgb = (0x86,0x26,0x26) + (111, 45, 45) # rgb = (0x6f,0x2d,0x2d) + ( 68,145, 68) # rgb = (0x44,0x91,0x44) + ( 97, 97, 97) # rgb = (0x61,0x61,0x61) grey38 + ( 59,157, 59) # rgb = (0x3b,0x9d,0x3b) + ( 68,137, 68) # rgb = (0x44,0x89,0x44) + ( 61,147, 61) # rgb = (0x3d,0x93,0x3d) + ( 0, 0,164) # rgb = (0x00,0x00,0xa4) + ( 0,243, 0) # rgb = (0x00,0xf3,0x00) + ( 0,241, 0) # rgb = (0x00,0xf1,0x00) + ( 89, 89, 89) # rgb = (0x59,0x59,0x59) grey35 + ( 87, 87, 87) # rgb = (0x57,0x57,0x57) grey34 + ( 85, 85, 85) # rgb = (0x55,0x55,0x55) + ( 83, 83, 83) # rgb = (0x53,0x53,0x53) + ( 52,133, 52) # rgb = (0x34,0x85,0x34) + ( 81, 81, 81) # rgb = (0x51,0x51,0x51) + ( 36,151, 36) # rgb = (0x24,0x97,0x24) + ( 79, 79, 79) # rgb = (0x4f,0x4f,0x4f) grey31 + ( 58, 58, 65) # rgb = (0x3a,0x3a,0x41) + ( 16, 16,186) # rgb = (0x10,0x10,0xba) + (178, 15, 15) # rgb = (0xb2,0x0f,0x0f) + ( 0,199, 0) # rgb = (0x00,0xc7,0x00) + ( 0,197, 0) # rgb = (0x00,0xc5,0x00) + (252,252,252) # rgb = (0xfc,0xfc,0xfc) grey99 + ( 0,195, 0) # rgb = (0x00,0xc3,0x00) + ( 4, 4,151) # rgb = (0x04,0x04,0x97) + ( 0,193, 0) # rgb = (0x00,0xc1,0x00) + ( 45,119, 45) # rgb = (0x2d,0x77,0x2d) + (250,250,250) # rgb = (0xfa,0xfa,0xfa) grey98 + ( 0,191, 0) # rgb = (0x00,0xbf,0x00) + ( 0, 0,104) # rgb = (0x00,0x00,0x68) + ( 0,189, 0) # rgb = (0x00,0xbd,0x00) + (218,212,212) # rgb = (0xda,0xd4,0xd4) + ( 16, 16,123) # rgb = (0x10,0x10,0x7b) + ( 9,173, 9) # rgb = (0x09,0xad,0x09) + (248,248,248) # rgb = (0xf8,0xf8,0xf8) + ( 0,185, 0) # rgb = (0x00,0xb9,0x00) + ( 0,183, 0) # rgb = (0x00,0xb7,0x00) + (156,156,161) # rgb = (0x9c,0x9c,0xa1) + (246,246,246) # rgb = (0xf6,0xf6,0xf6) + ( 12,161, 12) # rgb = (0x0c,0xa1,0x0c) + ( 0,179, 0) # rgb = (0x00,0xb3,0x00) + ( 0,177, 0) # rgb = (0x00,0xb1,0x00) + ( 16,145, 16) # rgb = (0x10,0x91,0x10) + ( 0,171, 0) # rgb = (0x00,0xab,0x00) + (242,242,242) # rgb = (0xf2,0xf2,0xf2) grey95 + ( 0,169, 0) # rgb = (0x00,0xa9,0x00) + ( 0,167, 0) # rgb = (0x00,0xa7,0x00) + (238,238,238) # rgb = (0xee,0xee,0xee) + (236,236,236) # rgb = (0xec,0xec,0xec) + ( 0,151, 0) # rgb = (0x00,0x97,0x00) + (234,234,234) # rgb = (0xea,0xea,0xea) + ( 0, 0,107) # rgb = (0x00,0x00,0x6b) + ( 0,141, 0) # rgb = (0x00,0x8d,0x00) + ( 0,139, 0) # rgb = (0x00,0x8b,0x00) green4 + ( 0,137, 0) # rgb = (0x00,0x89,0x00) + ( 0,135, 0) # rgb = (0x00,0x87,0x00) + ( 49, 49, 49) # rgb = (0x31,0x31,0x31) + ( 25, 25, 42) # rgb = (0x19,0x19,0x2a) + ( 7, 7, 64) # rgb = (0x07,0x07,0x40) + ( 18, 18,174) # rgb = (0x12,0x12,0xae) + ( 9, 9,238) # rgb = (0x09,0x09,0xee) + (211,214,211) # rgb = (0xd3,0xd6,0xd3) + (204,204,204) # rgb = (0xcc,0xcc,0xcc) grey80 + (147, 0, 0) # rgb = (0x93,0x00,0x00) + (163, 42, 42) # rgb = (0xa3,0x2a,0x2a) + (198,198,198) # rgb = (0xc6,0xc6,0xc6) + (196,196,196) # rgb = (0xc4,0xc4,0xc4) grey77 + (204, 0, 0) # rgb = (0xcc,0x00,0x00) + (211, 10, 10) # rgb = (0xd3,0x0a,0x0a) + (129,107,107) # rgb = (0x81,0x6b,0x6b) + (120, 62, 62) # rgb = (0x78,0x3e,0x3e) + ( 3, 3,109) # rgb = (0x03,0x03,0x6d) + ( 0, 0,159) # rgb = (0x00,0x00,0x9f) + ( 10, 10, 86) # rgb = (0x0a,0x0a,0x56) + ( 70, 70, 72) # rgb = (0x46,0x46,0x48) + ( 65, 65, 77) # rgb = (0x41,0x41,0x4d) + (115, 93, 93) # rgb = (0x73,0x5d,0x5d) + ( 81, 7, 7) # rgb = (0x51,0x07,0x07) + (168,168,168) # rgb = (0xa8,0xa8,0xa8) grey66 + (237,237,239) # rgb = (0xed,0xed,0xef) + (160,160,160) # rgb = (0xa0,0xa0,0xa0) + (158,158,158) # rgb = (0x9e,0x9e,0x9e) grey62 + (156,156,156) # rgb = (0x9c,0x9c,0x9c) grey61 + ( 0, 0,185) # rgb = (0x00,0x00,0xb9) + (154,154,154) # rgb = (0x9a,0x9a,0x9a) + (178, 0, 0) # rgb = (0xb2,0x00,0x00) + (152,152,152) # rgb = (0x98,0x98,0x98) + (235, 0, 0) # rgb = (0xeb,0x00,0x00) + (150,150,150) # rgb = (0x96,0x96,0x96) grey59 + (158, 0, 0) # rgb = (0x9e,0x00,0x00) + (148,148,148) # rgb = (0x94,0x94,0x94) grey58 + ( 19, 19, 28) # rgb = (0x13,0x13,0x1c) + (146,146,146) # rgb = (0x92,0x92,0x92) + (144,144,144) # rgb = (0x90,0x90,0x90) + (142,142,142) # rgb = (0x8e,0x8e,0x8e) + ( 0, 0,145) # rgb = (0x00,0x00,0x91) + (138,138,138) # rgb = (0x8a,0x8a,0x8a) grey54 + (136,136,136) # rgb = (0x88,0x88,0x88) + (118,162,118) # rgb = (0x76,0xa2,0x76) + (133,136,133) # rgb = (0x85,0x88,0x85) + (134,134,134) # rgb = (0x86,0x86,0x86) + (132,132,132) # rgb = (0x84,0x84,0x84) + (120, 15, 15) # rgb = (0x78,0x0f,0x0f) + (130,130,130) # rgb = (0x82,0x82,0x82) grey51 + (126,130,126) # rgb = (0x7e,0x82,0x7e) + (126,126,126) # rgb = (0x7e,0x7e,0x7e) + (124,124,124) # rgb = (0x7c,0x7c,0x7c) + (122,122,122) # rgb = (0x7a,0x7a,0x7a) grey48 + ( 74,192, 74) # rgb = (0x4a,0xc0,0x4a) + (118,118,118) # rgb = (0x76,0x76,0x76) + (116,116,116) # rgb = (0x74,0x74,0x74) + (114,114,114) # rgb = (0x72,0x72,0x72) + (112,112,112) # rgb = (0x70,0x70,0x70) grey44 + (152, 0, 0) # rgb = (0x98,0x00,0x00) + (110,110,110) # rgb = (0x6e,0x6e,0x6e) grey43 + (106,112,106) # rgb = (0x6a,0x70,0x6a) + (122,102,102) # rgb = (0x7a,0x66,0x66) + (106,106,106) # rgb = (0x6a,0x6a,0x6a) + (132, 0, 0) # rgb = (0x84,0x00,0x00) + ( 68,162, 68) # rgb = (0x44,0xa2,0x44) + ( 75,150, 75) # rgb = (0x4b,0x96,0x4b) + ( 97,100, 97) # rgb = (0x61,0x64,0x61) + ( 98, 98, 98) # rgb = (0x62,0x62,0x62) + ( 0,244, 0) # rgb = (0x00,0xf4,0x00) + ( 56,152, 56) # rgb = (0x38,0x98,0x38) + ( 92, 92, 92) # rgb = (0x5c,0x5c,0x5c) grey36 + ( 90, 90, 90) # rgb = (0x5a,0x5a,0x5a) + ( 0,230, 0) # rgb = (0x00,0xe6,0x00) + ( 2, 2, 93) # rgb = (0x02,0x02,0x5d) + ( 66,120, 66) # rgb = (0x42,0x78,0x42) + ( 86, 86, 86) # rgb = (0x56,0x56,0x56) + ( 0, 0,240) # rgb = (0x00,0x00,0xf0) + ( 46,148, 46) # rgb = (0x2e,0x94,0x2e) + ( 71,104, 71) # rgb = (0x47,0x68,0x47) + ( 49, 49, 96) # rgb = (0x31,0x31,0x60) + ( 0,216, 0) # rgb = (0x00,0xd8,0x00) + ( 82, 82, 82) # rgb = (0x52,0x52,0x52) grey32 + ( 80, 80, 80) # rgb = (0x50,0x50,0x50) + ( 0,206, 0) # rgb = (0x00,0xce,0x00) + ( 33,152, 33) # rgb = (0x21,0x98,0x21) + ( 20, 20,109) # rgb = (0x14,0x14,0x6d) + ( 0,200, 0) # rgb = (0x00,0xc8,0x00) + ( 76, 76, 76) # rgb = (0x4c,0x4c,0x4c) + (253,253,253) # rgb = (0xfd,0xfd,0xfd) + ( 0,198, 0) # rgb = (0x00,0xc6,0x00) + ( 0, 0,157) # rgb = (0x00,0x00,0x9d) + (111,107,107) # rgb = (0x6f,0x6b,0x6b) + (234, 14, 14) # rgb = (0xea,0x0e,0x0e) + ( 72, 72, 72) # rgb = (0x48,0x48,0x48) + ( 0,188, 0) # rgb = (0x00,0xbc,0x00) + ( 52,102, 52) # rgb = (0x34,0x66,0x34) + ( 2, 2,245) # rgb = (0x02,0x02,0xf5) + ( 83, 83, 96) # rgb = (0x53,0x53,0x60) + ( 0,176, 0) # rgb = (0x00,0xb0,0x00) + ( 0,174, 0) # rgb = (0x00,0xae,0x00) + (183, 0, 0) # rgb = (0xb7,0x00,0x00) + ( 0,164, 0) # rgb = (0x00,0xa4,0x00) + (239,239,239) # rgb = (0xef,0xef,0xef) + ( 0,162, 0) # rgb = (0x00,0xa2,0x00) + (143, 79, 79) # rgb = (0x8f,0x4f,0x4f) + (149, 52, 52) # rgb = (0x95,0x34,0x34) + ( 0,152, 0) # rgb = (0x00,0x98,0x00) + ( 0,150, 0) # rgb = (0x00,0x96,0x00) + ( 0,146, 0) # rgb = (0x00,0x92,0x00) + (231,231,231) # rgb = (0xe7,0xe7,0xe7) + ( 0,140, 0) # rgb = (0x00,0x8c,0x00) + (227,227,227) # rgb = (0xe3,0xe3,0xe3) grey89 + ( 0,128, 0) # rgb = (0x00,0x80,0x00) + (146, 6, 6) # rgb = (0x92,0x06,0x06) + ( 1, 1,111) # rgb = (0x01,0x01,0x6f) + (100, 86, 89) # rgb = (0x64,0x56,0x59) + ( 0, 0,100) # rgb = (0x00,0x00,0x64) + ( 78, 78,107) # rgb = (0x4e,0x4e,0x6b) + (207,207,207) # rgb = (0xcf,0xcf,0xcf) grey81 + (221,221,224) # rgb = (0xdd,0xdd,0xe0) + ( 0, 0,123) # rgb = (0x00,0x00,0x7b) + (201,201,201) # rgb = (0xc9,0xc9,0xc9) grey79 + ( 22, 22, 65) # rgb = (0x16,0x16,0x41) + ( 33, 33, 89) # rgb = (0x21,0x21,0x59) + ( 87, 87, 89) # rgb = (0x57,0x57,0x59) + ( 68, 68,120) # rgb = (0x44,0x44,0x78) + (191,191,191) # rgb = (0xbf,0xbf,0xbf) grey75 + (235,221,221) # rgb = (0xeb,0xdd,0xdd) + ( 45, 45, 84) # rgb = (0x2d,0x2d,0x54) + ( 10, 10, 96) # rgb = (0x0a,0x0a,0x60) + ( 0, 0,255) # rgb = (0x00,0x00,0xff) blue1 + (191,125,125) # rgb = (0xbf,0x7d,0x7d) +} +tRNS { + 0} +IMAGE { + pixels hex +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000e0ea66000000000000000000000000000000 +0000000000000000000000de02a336e43903f4f0000000000000000000000000 +000000000000000069ef1a358680062eb017b0ab7af459500000000000000000 +0000000000667c0ea9cc803979937917a03a878787b0e2ae8ae75c0000000000 +00005cea8ea72c8639e293208f7d7d19200639a017ab2ee4ac2ca7097c690000 +00007823a72b2bda198fd54ddad90521219191217d1917cc2b2b2b2baf8e0000 +0000e81f9b9f27014d05d91c2a2a2a7f037ecdcd7e7a012a2a2aaab7c2ef0000 +00006c9f229d981a23282828282828282828282828282828a7b445c3c8de0000 +00005ca249d63d140f139f272727272727272727a5a528af44c3c8ce43000000 +0000009a62ca41a6960e0d941da4a4a4a4a4a4a4a4a9b732525a1084a1000000 +000000965b58b53811940d0b090b1823a3a3252ab4d24c269957571088000000 +000000946162b9b59c0f14b12d0c8b8c98a3afb8ed1bbd82ba74300877000000 +00000088c565c7b5a6962dcf67be07048aa5b84315f326ba7395832950000000 +00000002bed8d4b94214b1c7dbb68c8b04a843e6d1bd814bceeb10a900000000 +0000007b47636ec441b23d4edb3f09078bac4315f340ec855a82995f00000000 +00000059bb63e15d42643dca6b3f8e090735ed76bd81c05224e9f27b00000000 +0000006cbbd47161c1684951dc3f908e8c3ceef38d08ebe96d6d086000000000 +00000050bf67dc54534fdd53ddb20d0b8eb815d10af1732fe312e60000000000 +00000000add6d6bf61c16f566eb20e0d924475bd578572c61e6d340000000000 +0000000016d8d3d03ec76bcfdf3b0f0e13bc4c8d2f84c040cb837b0000000000 +00000000550c47b3365bd45d6f33110f1a4575cbf2c0521e0802000000000000 +000000000000e7ac36be625e7031131122455a0a2f0a99c6e700000000000000 +000000000000006a9e37d36270331613a545f181e53032e80000000000000000 +00000000000000005088c5d371311816a8464b7374ee89000000000000000000 +0000000000000000000077b654a29b18acc24a722a5500000000000000000000 +0000000000000000000000d78a9f9e9b3548c38ac90000000000000000000000 +00000000000000000000000000ef1f9e3cc20200000000000000000000000000 +0000000000000000000000000000e89736780000000000000000000000000000 +00000000000000000000000000000060e0000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +} diff --git a/libgo/go/mime/testdata/test.types.plan9 b/libgo/go/mime/testdata/test.types.plan9 new file mode 100644 index 00000000000..19dbf41cce1 --- /dev/null +++ b/libgo/go/mime/testdata/test.types.plan9 @@ -0,0 +1,8 @@ +# Copyright 2013 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + + + # mime package test +.t1 application test - y # Simple test +.t2 text test - y # Text test diff --git a/libgo/go/net/http/serve_test.go b/libgo/go/net/http/serve_test.go index 072da2552bc..681dff193aa 100644 --- a/libgo/go/net/http/serve_test.go +++ b/libgo/go/net/http/serve_test.go @@ -5173,3 +5173,142 @@ func TestServerDuplicateBackgroundRead(t *testing.T) { } wg.Wait() } + +// Test that the bufio.Reader returned by Hijack includes any buffered +// byte (from the Server's backgroundRead) in its buffer. We want the +// Handler code to be able to tell that a byte is available via +// bufio.Reader.Buffered(), without resorting to Reading it +// (potentially blocking) to get at it. +func TestServerHijackGetsBackgroundByte(t *testing.T) { + if runtime.GOOS == "plan9" { + t.Skip("skipping test; see https://golang.org/issue/18657") + } + setParallel(t) + defer afterTest(t) + done := make(chan struct{}) + inHandler := make(chan bool, 1) + ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { + defer close(done) + + // Tell the client to send more data after the GET request. + inHandler <- true + + // Wait until the HTTP server sees the extra data + // after the GET request. The HTTP server fires the + // close notifier here, assuming it's a pipelined + // request, as documented. + select { + case <-w.(CloseNotifier).CloseNotify(): + case <-time.After(5 * time.Second): + t.Error("timeout") + return + } + + conn, buf, err := w.(Hijacker).Hijack() + if err != nil { + t.Error(err) + return + } + defer conn.Close() + n := buf.Reader.Buffered() + if n != 1 { + t.Errorf("buffered data = %d; want 1", n) + } + peek, err := buf.Reader.Peek(3) + if string(peek) != "foo" || err != nil { + t.Errorf("Peek = %q, %v; want foo, nil", peek, err) + } + })) + defer ts.Close() + + cn, err := net.Dial("tcp", ts.Listener.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer cn.Close() + if _, err := cn.Write([]byte("GET / HTTP/1.1\r\nHost: e.com\r\n\r\n")); err != nil { + t.Fatal(err) + } + <-inHandler + if _, err := cn.Write([]byte("foo")); err != nil { + t.Fatal(err) + } + + if err := cn.(*net.TCPConn).CloseWrite(); err != nil { + t.Fatal(err) + } + select { + case <-done: + case <-time.After(2 * time.Second): + t.Error("timeout") + } +} + +// Like TestServerHijackGetsBackgroundByte above but sending a +// immediate 1MB of data to the server to fill up the server's 4KB +// buffer. +func TestServerHijackGetsBackgroundByte_big(t *testing.T) { + if runtime.GOOS == "plan9" { + t.Skip("skipping test; see https://golang.org/issue/18657") + } + setParallel(t) + defer afterTest(t) + done := make(chan struct{}) + const size = 8 << 10 + ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { + defer close(done) + + // Wait until the HTTP server sees the extra data + // after the GET request. The HTTP server fires the + // close notifier here, assuming it's a pipelined + // request, as documented. + select { + case <-w.(CloseNotifier).CloseNotify(): + case <-time.After(5 * time.Second): + t.Error("timeout") + return + } + + conn, buf, err := w.(Hijacker).Hijack() + if err != nil { + t.Error(err) + return + } + defer conn.Close() + slurp, err := ioutil.ReadAll(buf.Reader) + if err != nil { + t.Error("Copy: %v", err) + } + allX := true + for _, v := range slurp { + if v != 'x' { + allX = false + } + } + if len(slurp) != size { + t.Errorf("read %d; want %d", len(slurp), size) + } else if !allX { + t.Errorf("read %q; want %d 'x'", slurp, size) + } + })) + defer ts.Close() + + cn, err := net.Dial("tcp", ts.Listener.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer cn.Close() + if _, err := fmt.Fprintf(cn, "GET / HTTP/1.1\r\nHost: e.com\r\n\r\n%s", + strings.Repeat("x", size)); err != nil { + t.Fatal(err) + } + if err := cn.(*net.TCPConn).CloseWrite(); err != nil { + t.Fatal(err) + } + + select { + case <-done: + case <-time.After(2 * time.Second): + t.Error("timeout") + } +} diff --git a/libgo/go/net/http/server.go b/libgo/go/net/http/server.go index 96236489bd9..df70a15193b 100644 --- a/libgo/go/net/http/server.go +++ b/libgo/go/net/http/server.go @@ -164,7 +164,7 @@ type Flusher interface { // should always test for this ability at runtime. type Hijacker interface { // Hijack lets the caller take over the connection. - // After a call to Hijack(), the HTTP server library + // After a call to Hijack the HTTP server library // will not do anything else with the connection. // // It becomes the caller's responsibility to manage @@ -174,6 +174,9 @@ type Hijacker interface { // already set, depending on the configuration of the // Server. It is the caller's responsibility to set // or clear those deadlines as needed. + // + // The returned bufio.Reader may contain unprocessed buffered + // data from the client. Hijack() (net.Conn, *bufio.ReadWriter, error) } @@ -293,6 +296,11 @@ func (c *conn) hijackLocked() (rwc net.Conn, buf *bufio.ReadWriter, err error) { rwc.SetDeadline(time.Time{}) buf = bufio.NewReadWriter(c.bufr, bufio.NewWriter(rwc)) + if c.r.hasByte { + if _, err := c.bufr.Peek(c.bufr.Buffered() + 1); err != nil { + return nil, nil, fmt.Errorf("unexpected Peek failure reading buffered byte: %v", err) + } + } c.setState(rwc, StateHijacked) return } diff --git a/libgo/go/net/http/transport_test.go b/libgo/go/net/http/transport_test.go index d5ddf6a1232..a58b1839cc6 100644 --- a/libgo/go/net/http/transport_test.go +++ b/libgo/go/net/http/transport_test.go @@ -36,6 +36,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "testing" "time" ) @@ -2545,6 +2546,13 @@ type closerFunc func() error func (f closerFunc) Close() error { return f() } +type writerFuncConn struct { + net.Conn + write func(p []byte) (n int, err error) +} + +func (c writerFuncConn) Write(p []byte) (n int, err error) { return c.write(p) } + // Issue 4677. If we try to reuse a connection that the server is in the // process of closing, we may end up successfully writing out our request (or a // portion of our request) only to find a connection error when we try to read @@ -2557,66 +2565,78 @@ func (f closerFunc) Close() error { return f() } func TestRetryIdempotentRequestsOnError(t *testing.T) { defer afterTest(t) + var ( + mu sync.Mutex + logbuf bytes.Buffer + ) + logf := func(format string, args ...interface{}) { + mu.Lock() + defer mu.Unlock() + fmt.Fprintf(&logbuf, format, args...) + logbuf.WriteByte('\n') + } + ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { + logf("Handler") + w.Header().Set("X-Status", "ok") })) defer ts.Close() - tr := &Transport{} + var writeNumAtomic int32 + tr := &Transport{ + Dial: func(network, addr string) (net.Conn, error) { + logf("Dial") + c, err := net.Dial(network, ts.Listener.Addr().String()) + if err != nil { + logf("Dial error: %v", err) + return nil, err + } + return &writerFuncConn{ + Conn: c, + write: func(p []byte) (n int, err error) { + if atomic.AddInt32(&writeNumAtomic, 1) == 2 { + logf("intentional write failure") + return 0, errors.New("second write fails") + } + logf("Write(%q)", p) + return c.Write(p) + }, + }, nil + }, + } + defer tr.CloseIdleConnections() c := &Client{Transport: tr} - const N = 2 - retryc := make(chan struct{}, N) SetRoundTripRetried(func() { - retryc <- struct{}{} + logf("Retried.") }) defer SetRoundTripRetried(nil) - for n := 0; n < 100; n++ { - // open 2 conns - errc := make(chan error, N) - for i := 0; i < N; i++ { - // start goroutines, send on errc - go func() { - res, err := c.Get(ts.URL) - if err == nil { - res.Body.Close() - } - errc <- err - }() - } - for i := 0; i < N; i++ { - if err := <-errc; err != nil { - t.Fatal(err) - } - } - - ts.CloseClientConnections() - for i := 0; i < N; i++ { - go func() { - res, err := c.Get(ts.URL) - if err == nil { - res.Body.Close() - } - errc <- err - }() + for i := 0; i < 3; i++ { + res, err := c.Get("http://fake.golang/") + if err != nil { + t.Fatalf("i=%d: Get = %v", i, err) } + res.Body.Close() + } - for i := 0; i < N; i++ { - if err := <-errc; err != nil { - t.Fatal(err) - } - } - for i := 0; i < N; i++ { - select { - case <-retryc: - // we triggered a retry, test was successful - t.Logf("finished after %d runs\n", n) - return - default: - } - } + mu.Lock() + got := logbuf.String() + mu.Unlock() + const want = `Dial +Write("GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n") +Handler +intentional write failure +Retried. +Dial +Write("GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n") +Handler +Write("GET / HTTP/1.1\r\nHost: fake.golang\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n") +Handler +` + if got != want { + t.Errorf("Log of events differs. Got:\n%s\nWant:\n%s", got, want) } - t.Fatal("did not trigger any retries") } // Issue 6981 diff --git a/libgo/go/os/os_test.go b/libgo/go/os/os_test.go index 10a74c2062a..dcc8d762bf8 100644 --- a/libgo/go/os/os_test.go +++ b/libgo/go/os/os_test.go @@ -52,12 +52,15 @@ var sysdir = func() *sysDir { case "darwin": switch runtime.GOARCH { case "arm", "arm64": + /// At this point the test harness has not had a chance + // to move us into the ./src/os directory, so the + // current working directory is the root of the app. wd, err := syscall.Getwd() if err != nil { wd = err.Error() } return &sysDir{ - filepath.Join(wd, "..", ".."), + wd, []string{ "ResourceRules.plist", "Info.plist", diff --git a/libgo/go/reflect/all_test.go b/libgo/go/reflect/all_test.go index f51e95fd734..6b143df00e1 100644 --- a/libgo/go/reflect/all_test.go +++ b/libgo/go/reflect/all_test.go @@ -26,6 +26,8 @@ import ( "unsafe" ) +var sink interface{} + func TestBool(t *testing.T) { v := ValueOf(true) if v.Bool() != true { @@ -5348,6 +5350,72 @@ func TestCallGC(t *testing.T) { f2("four", "five5", "six666", "seven77", "eight888") } +// Issue 18635 (function version). +func TestKeepFuncLive(t *testing.T) { + // Test that we keep makeFuncImpl live as long as it is + // referenced on the stack. + typ := TypeOf(func(i int) {}) + var f, g func(in []Value) []Value + f = func(in []Value) []Value { + clobber() + i := int(in[0].Int()) + if i > 0 { + // We can't use Value.Call here because + // runtime.call* will keep the makeFuncImpl + // alive. However, by converting it to an + // interface value and calling that, + // reflect.callReflect is the only thing that + // can keep the makeFuncImpl live. + // + // Alternate between f and g so that if we do + // reuse the memory prematurely it's more + // likely to get obviously corrupted. + MakeFunc(typ, g).Interface().(func(i int))(i - 1) + } + return nil + } + g = func(in []Value) []Value { + clobber() + i := int(in[0].Int()) + MakeFunc(typ, f).Interface().(func(i int))(i) + return nil + } + MakeFunc(typ, f).Call([]Value{ValueOf(10)}) +} + +// Issue 18635 (method version). +type KeepMethodLive struct{} + +func (k KeepMethodLive) Method1(i int) { + clobber() + if i > 0 { + ValueOf(k).MethodByName("Method2").Interface().(func(i int))(i - 1) + } +} + +func (k KeepMethodLive) Method2(i int) { + clobber() + ValueOf(k).MethodByName("Method1").Interface().(func(i int))(i) +} + +func TestKeepMethodLive(t *testing.T) { + // Test that we keep methodValue live as long as it is + // referenced on the stack. + KeepMethodLive{}.Method1(10) +} + +// clobber tries to clobber unreachable memory. +func clobber() { + runtime.GC() + for i := 1; i < 32; i++ { + for j := 0; j < 10; j++ { + obj := make([]*byte, i) + sink = obj + } + } + runtime.GC() +} + type funcLayoutTest struct { rcvr, t Type size, argsize, retOffset uintptr diff --git a/libgo/go/reflect/type.go b/libgo/go/reflect/type.go index 07a355d5e41..29d89f7176d 100644 --- a/libgo/go/reflect/type.go +++ b/libgo/go/reflect/type.go @@ -1677,7 +1677,7 @@ func FuncOf(in, out []Type, variadic bool) Type { *ft = *prototype // Build a hash and minimally populate ft. - var hash uint32 = 8 + var hash uint32 var fin, fout []*rtype shift := uint(1) for _, in := range in { @@ -1697,6 +1697,7 @@ func FuncOf(in, out []Type, variadic bool) Type { hash++ } hash <<= 4 + hash += 8 ft.hash = hash ft.in = fin ft.out = fout diff --git a/libgo/go/runtime/testdata/testprogcgo/threadpanic_unix.c b/libgo/go/runtime/testdata/testprogcgo/threadpanic_unix.c new file mode 100644 index 00000000000..c426452c2b0 --- /dev/null +++ b/libgo/go/runtime/testdata/testprogcgo/threadpanic_unix.c @@ -0,0 +1,26 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !plan9,!windows + +#include +#include +#include + +void gopanic(void); + +static void* +die(void* x) +{ + gopanic(); + return 0; +} + +void +start(void) +{ + pthread_t t; + if(pthread_create(&t, 0, die, 0) != 0) + printf("pthread_create failed\n"); +} diff --git a/libgo/go/runtime/testdata/testprogcgo/threadpanic_windows.c b/libgo/go/runtime/testdata/testprogcgo/threadpanic_windows.c new file mode 100644 index 00000000000..ba66d0f5c95 --- /dev/null +++ b/libgo/go/runtime/testdata/testprogcgo/threadpanic_windows.c @@ -0,0 +1,23 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include +#include +#include + +void gopanic(void); + +static unsigned int __attribute__((__stdcall__)) +die(void* x) +{ + gopanic(); + return 0; +} + +void +start(void) +{ + if(_beginthreadex(0, 0, die, 0, 0, 0) != 0) + printf("_beginthreadex failed\n"); +} diff --git a/libgo/go/runtime/testdata/testprogcgo/tracebackctxt_c.c b/libgo/go/runtime/testdata/testprogcgo/tracebackctxt_c.c new file mode 100644 index 00000000000..900cada0d3d --- /dev/null +++ b/libgo/go/runtime/testdata/testprogcgo/tracebackctxt_c.c @@ -0,0 +1,91 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The C definitions for tracebackctxt.go. That file uses //export so +// it can't put function definitions in the "C" import comment. + +#include +#include + +// Functions exported from Go. +extern void G1(void); +extern void G2(void); + +void C1() { + G1(); +} + +void C2() { + G2(); +} + +struct cgoContextArg { + uintptr_t context; +}; + +struct cgoTracebackArg { + uintptr_t context; + uintptr_t sigContext; + uintptr_t* buf; + uintptr_t max; +}; + +struct cgoSymbolizerArg { + uintptr_t pc; + const char* file; + uintptr_t lineno; + const char* func; + uintptr_t entry; + uintptr_t more; + uintptr_t data; +}; + +// Uses atomic adds and subtracts to catch the possibility of +// erroneous calls from multiple threads; that should be impossible in +// this test case, but we check just in case. +static int contextCount; + +int getContextCount() { + return __sync_add_and_fetch(&contextCount, 0); +} + +void tcContext(void* parg) { + struct cgoContextArg* arg = (struct cgoContextArg*)(parg); + if (arg->context == 0) { + arg->context = __sync_add_and_fetch(&contextCount, 1); + } else { + if (arg->context != __sync_add_and_fetch(&contextCount, 0)) { + abort(); + } + __sync_sub_and_fetch(&contextCount, 1); + } +} + +void tcTraceback(void* parg) { + int base, i; + struct cgoTracebackArg* arg = (struct cgoTracebackArg*)(parg); + if (arg->context == 0) { + // This shouldn't happen in this program. + abort(); + } + // Return a variable number of PC values. + base = arg->context << 8; + for (i = 0; i < arg->context; i++) { + if (i < arg->max) { + arg->buf[i] = base + i; + } + } +} + +void tcSymbolizer(void *parg) { + struct cgoSymbolizerArg* arg = (struct cgoSymbolizerArg*)(parg); + if (arg->pc == 0) { + return; + } + // Report two lines per PC returned by traceback, to test more handling. + arg->more = arg->file == NULL; + arg->file = "tracebackctxt.go"; + arg->func = "cFunction"; + arg->lineno = arg->pc + (arg->more << 16); +} diff --git a/libgo/go/testing/benchmark.go b/libgo/go/testing/benchmark.go index c033ce5fecb..bcebb418c42 100644 --- a/libgo/go/testing/benchmark.go +++ b/libgo/go/testing/benchmark.go @@ -219,7 +219,7 @@ func (b *B) run1() bool { } // Only print the output if we know we are not going to proceed. // Otherwise it is printed in processBench. - if b.hasSub || b.finished { + if atomic.LoadInt32(&b.hasSub) != 0 || b.finished { tag := "BENCH" if b.skipped { tag = "SKIP" @@ -460,10 +460,13 @@ func (ctx *benchContext) processBench(b *B) { // // A subbenchmark is like any other benchmark. A benchmark that calls Run at // least once will not be measured itself and will be called once with N=1. +// +// Run may be called simultaneously from multiple goroutines, but all such +// calls must happen before the outer benchmark function for b returns. func (b *B) Run(name string, f func(b *B)) bool { // Since b has subbenchmarks, we will no longer run it as a benchmark itself. // Release the lock and acquire it on exit to ensure locks stay paired. - b.hasSub = true + atomic.StoreInt32(&b.hasSub, 1) benchmarkLock.Unlock() defer benchmarkLock.Lock() diff --git a/libgo/go/testing/sub_test.go b/libgo/go/testing/sub_test.go index 8d5d9206f03..bb7b3e09255 100644 --- a/libgo/go/testing/sub_test.go +++ b/libgo/go/testing/sub_test.go @@ -6,6 +6,7 @@ package testing import ( "bytes" + "fmt" "regexp" "strings" "sync/atomic" @@ -515,3 +516,19 @@ func TestBenchmarkOutput(t *T) { Benchmark(func(b *B) { b.Error("do not print this output") }) Benchmark(func(b *B) {}) } + +func TestParallelSub(t *T) { + c := make(chan int) + block := make(chan int) + for i := 0; i < 10; i++ { + go func(i int) { + <-block + t.Run(fmt.Sprint(i), func(t *T) {}) + c <- 1 + }(i) + } + close(block) + for i := 0; i < 10; i++ { + <-c + } +} diff --git a/libgo/go/testing/testing.go b/libgo/go/testing/testing.go index 8364c8e4144..bbeb95692a1 100644 --- a/libgo/go/testing/testing.go +++ b/libgo/go/testing/testing.go @@ -216,6 +216,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "time" ) @@ -267,8 +268,8 @@ type common struct { skipped bool // Test of benchmark has been skipped. finished bool // Test function has completed. done bool // Test is finished and all subtests have completed. - hasSub bool - raceErrors int // number of races detected during test + hasSub int32 // written atomically + raceErrors int // number of races detected during test parent *common level int // Nesting depth of test or benchmark. @@ -645,7 +646,7 @@ func tRunner(t *T, fn func(t *T)) { // Do not lock t.done to allow race detector to detect race in case // the user does not appropriately synchronizes a goroutine. t.done = true - if t.parent != nil && !t.hasSub { + if t.parent != nil && atomic.LoadInt32(&t.hasSub) == 0 { t.setRan() } t.signal <- true @@ -659,8 +660,11 @@ func tRunner(t *T, fn func(t *T)) { // Run runs f as a subtest of t called name. It reports whether f succeeded. // Run will block until all its parallel subtests have completed. +// +// Run may be called simultaneously from multiple goroutines, but all such +// calls must happen before the outer test function for t returns. func (t *T) Run(name string, f func(t *T)) bool { - t.hasSub = true + atomic.StoreInt32(&t.hasSub, 1) testName, ok := t.context.match.fullName(&t.common, name) if !ok { return true diff --git a/libgo/merge.sh b/libgo/merge.sh index 8a92a2ecd4d..c750a5d808b 100755 --- a/libgo/merge.sh +++ b/libgo/merge.sh @@ -147,7 +147,7 @@ done (cd ${NEWDIR}/src && find . -name testdata -print) | while read d; do skip=false - case "$f" in + case "$d" in ./cmd/cgo/* | ./cmd/go/* | ./cmd/gofmt/* | ./cmd/internal/browser/*) ;; ./cmd/*) -- 2.30.2