[dev.boringcrypto] all: merge master into dev.boringcrypto

Change-Id: I29cf70cab6b4c28891dce2a3ccf18b690ff568a0
diff --git a/misc/cgo/errors/errors_test.go b/misc/cgo/errors/errors_test.go
index f727158..e6bac0f 100644
--- a/misc/cgo/errors/errors_test.go
+++ b/misc/cgo/errors/errors_test.go
@@ -63,7 +63,7 @@
 	defer os.RemoveAll(dir)
 
 	dst := filepath.Join(dir, strings.TrimSuffix(file, ".go"))
-	cmd := exec.Command("go", "build", "-gcflags=-L", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
+	cmd := exec.Command("go", "build", "-gcflags=-L -e", "-o="+dst, path(file)) // TODO(gri) no need for -gcflags=-L if go tool is adjusted
 	out, err := cmd.CombinedOutput()
 	if err == nil {
 		t.Errorf("expected cgo to fail but it succeeded")
@@ -107,21 +107,10 @@
 	for _, file := range []string{
 		"err1.go",
 		"err2.go",
-		"err3.go",
-		"issue7757.go",
-		"issue8442.go",
 		"issue11097a.go",
 		"issue11097b.go",
-		"issue13129.go",
-		"issue13423.go",
-		"issue13467.go",
-		"issue13635.go",
-		"issue13830.go",
-		"issue16116.go",
-		"issue16591.go",
 		"issue18452.go",
 		"issue18889.go",
-		"issue26745.go",
 		"issue28721.go",
 	} {
 		check(t, file)
diff --git a/misc/cgo/errors/ptr_test.go b/misc/cgo/errors/ptr_test.go
index 629f4c9..ba4f4ad 100644
--- a/misc/cgo/errors/ptr_test.go
+++ b/misc/cgo/errors/ptr_test.go
@@ -7,21 +7,25 @@
 package errorstest
 
 import (
-	"bufio"
 	"bytes"
+	"flag"
 	"fmt"
 	"io/ioutil"
 	"os"
 	"os/exec"
 	"path/filepath"
 	"strings"
+	"sync/atomic"
 	"testing"
 )
 
+var tmp = flag.String("tmp", "", "use `dir` for temporary files and do not clean up")
+
 // ptrTest is the tests without the boilerplate.
 type ptrTest struct {
 	name      string   // for reporting
 	c         string   // the cgo comment
+	c1        string   // cgo comment forced into non-export cgo file
 	imports   []string // a list of imports
 	support   string   // supporting functions
 	body      string   // the body of the main function
@@ -39,253 +43,248 @@
 	{
 		// Passing a pointer to a struct that contains a Go pointer.
 		name: "ptr1",
-		c:    `typedef struct s { int *p; } s; void f(s *ps) {}`,
-		body: `C.f(&C.s{new(C.int)})`,
+		c:    `typedef struct s1 { int *p; } s1; void f1(s1 *ps) {}`,
+		body: `C.f1(&C.s1{new(C.int)})`,
 		fail: true,
 	},
 	{
 		// Passing a pointer to a struct that contains a Go pointer.
 		name: "ptr2",
-		c:    `typedef struct s { int *p; } s; void f(s *ps) {}`,
-		body: `p := &C.s{new(C.int)}; C.f(p)`,
+		c:    `typedef struct s2 { int *p; } s2; void f2(s2 *ps) {}`,
+		body: `p := &C.s2{new(C.int)}; C.f2(p)`,
 		fail: true,
 	},
 	{
 		// Passing a pointer to an int field of a Go struct
 		// that (irrelevantly) contains a Go pointer.
 		name: "ok1",
-		c:    `struct s { int i; int *p; }; void f(int *p) {}`,
-		body: `p := &C.struct_s{i: 0, p: new(C.int)}; C.f(&p.i)`,
+		c:    `struct s3 { int i; int *p; }; void f3(int *p) {}`,
+		body: `p := &C.struct_s3{i: 0, p: new(C.int)}; C.f3(&p.i)`,
 		fail: false,
 	},
 	{
 		// Passing a pointer to a pointer field of a Go struct.
-		name: "ptr-field",
-		c:    `struct s { int i; int *p; }; void f(int **p) {}`,
-		body: `p := &C.struct_s{i: 0, p: new(C.int)}; C.f(&p.p)`,
+		name: "ptrfield",
+		c:    `struct s4 { int i; int *p; }; void f4(int **p) {}`,
+		body: `p := &C.struct_s4{i: 0, p: new(C.int)}; C.f4(&p.p)`,
 		fail: true,
 	},
 	{
 		// Passing a pointer to a pointer field of a Go
 		// struct, where the field does not contain a Go
 		// pointer, but another field (irrelevantly) does.
-		name: "ptr-field-ok",
-		c:    `struct s { int *p1; int *p2; }; void f(int **p) {}`,
-		body: `p := &C.struct_s{p1: nil, p2: new(C.int)}; C.f(&p.p1)`,
+		name: "ptrfieldok",
+		c:    `struct s5 { int *p1; int *p2; }; void f5(int **p) {}`,
+		body: `p := &C.struct_s5{p1: nil, p2: new(C.int)}; C.f5(&p.p1)`,
 		fail: false,
 	},
 	{
 		// Passing the address of a slice with no Go pointers.
-		name:    "slice-ok-1",
-		c:       `void f(void **p) {}`,
+		name:    "sliceok1",
+		c:       `void f6(void **p) {}`,
 		imports: []string{"unsafe"},
-		body:    `s := []unsafe.Pointer{nil}; C.f(&s[0])`,
+		body:    `s := []unsafe.Pointer{nil}; C.f6(&s[0])`,
 		fail:    false,
 	},
 	{
 		// Passing the address of a slice with a Go pointer.
-		name:    "slice-ptr-1",
-		c:       `void f(void **p) {}`,
+		name:    "sliceptr1",
+		c:       `void f7(void **p) {}`,
 		imports: []string{"unsafe"},
-		body:    `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f(&s[0])`,
+		body:    `i := 0; s := []unsafe.Pointer{unsafe.Pointer(&i)}; C.f7(&s[0])`,
 		fail:    true,
 	},
 	{
 		// Passing the address of a slice with a Go pointer,
 		// where we are passing the address of an element that
 		// is not a Go pointer.
-		name:    "slice-ptr-2",
-		c:       `void f(void **p) {}`,
+		name:    "sliceptr2",
+		c:       `void f8(void **p) {}`,
 		imports: []string{"unsafe"},
-		body:    `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f(&s[0])`,
+		body:    `i := 0; s := []unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f8(&s[0])`,
 		fail:    true,
 	},
 	{
 		// Passing the address of a slice that is an element
 		// in a struct only looks at the slice.
-		name:    "slice-ok-2",
-		c:       `void f(void **p) {}`,
+		name:    "sliceok2",
+		c:       `void f9(void **p) {}`,
 		imports: []string{"unsafe"},
-		support: `type S struct { p *int; s []unsafe.Pointer }`,
-		body:    `i := 0; p := &S{p:&i, s:[]unsafe.Pointer{nil}}; C.f(&p.s[0])`,
+		support: `type S9 struct { p *int; s []unsafe.Pointer }`,
+		body:    `i := 0; p := &S9{p:&i, s:[]unsafe.Pointer{nil}}; C.f9(&p.s[0])`,
 		fail:    false,
 	},
 	{
 		// Passing the address of a slice of an array that is
 		// an element in a struct, with a type conversion.
-		name:    "slice-ok-3",
-		c:       `void f(void* p) {}`,
+		name:    "sliceok3",
+		c:       `void f10(void* p) {}`,
 		imports: []string{"unsafe"},
-		support: `type S struct { p *int; a [4]byte }`,
-		body:    `i := 0; p := &S{p:&i}; s := p.a[:]; C.f(unsafe.Pointer(&s[0]))`,
+		support: `type S10 struct { p *int; a [4]byte }`,
+		body:    `i := 0; p := &S10{p:&i}; s := p.a[:]; C.f10(unsafe.Pointer(&s[0]))`,
 		fail:    false,
 	},
 	{
 		// Passing the address of a slice of an array that is
 		// an element in a struct, with a type conversion.
-		name:    "slice-ok-4",
-		c:       `typedef void* PV; void f(PV p) {}`,
+		name:    "sliceok4",
+		c:       `typedef void* PV11; void f11(PV11 p) {}`,
 		imports: []string{"unsafe"},
-		support: `type S struct { p *int; a [4]byte }`,
-		body:    `i := 0; p := &S{p:&i}; C.f(C.PV(unsafe.Pointer(&p.a[0])))`,
+		support: `type S11 struct { p *int; a [4]byte }`,
+		body:    `i := 0; p := &S11{p:&i}; C.f11(C.PV11(unsafe.Pointer(&p.a[0])))`,
 		fail:    false,
 	},
 	{
 		// Passing the address of a static variable with no
 		// pointers doesn't matter.
 		name:    "varok",
-		c:       `void f(char** parg) {}`,
-		support: `var hello = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
-		body:    `parg := [1]*C.char{&hello[0]}; C.f(&parg[0])`,
+		c:       `void f12(char** parg) {}`,
+		support: `var hello12 = [...]C.char{'h', 'e', 'l', 'l', 'o'}`,
+		body:    `parg := [1]*C.char{&hello12[0]}; C.f12(&parg[0])`,
 		fail:    false,
 	},
 	{
 		// Passing the address of a static variable with
 		// pointers does matter.
-		name:    "var",
-		c:       `void f(char*** parg) {}`,
-		support: `var hello = [...]*C.char{new(C.char)}`,
-		body:    `parg := [1]**C.char{&hello[0]}; C.f(&parg[0])`,
+		name:    "var1",
+		c:       `void f13(char*** parg) {}`,
+		support: `var hello13 = [...]*C.char{new(C.char)}`,
+		body:    `parg := [1]**C.char{&hello13[0]}; C.f13(&parg[0])`,
 		fail:    true,
 	},
 	{
 		// Storing a Go pointer into C memory should fail.
 		name: "barrier",
 		c: `#include <stdlib.h>
-                    char **f1() { return malloc(sizeof(char*)); }
-                    void f2(char **p) {}`,
-		body:      `p := C.f1(); *p = new(C.char); C.f2(p)`,
+                    char **f14a() { return malloc(sizeof(char*)); }
+                    void f14b(char **p) {}`,
+		body:      `p := C.f14a(); *p = new(C.char); C.f14b(p)`,
 		fail:      true,
 		expensive: true,
 	},
 	{
 		// Storing a Go pointer into C memory by assigning a
 		// large value should fail.
-		name: "barrier-struct",
+		name: "barrierstruct",
 		c: `#include <stdlib.h>
-                    struct s { char *a[10]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}`,
-		body:      `p := C.f1(); p.a = [10]*C.char{new(C.char)}; C.f2(p)`,
+                    struct s15 { char *a[10]; };
+                    struct s15 *f15() { return malloc(sizeof(struct s15)); }
+                    void f15b(struct s15 *p) {}`,
+		body:      `p := C.f15(); p.a = [10]*C.char{new(C.char)}; C.f15b(p)`,
 		fail:      true,
 		expensive: true,
 	},
 	{
 		// Storing a Go pointer into C memory using a slice
 		// copy should fail.
-		name: "barrier-slice",
+		name: "barrierslice",
 		c: `#include <stdlib.h>
-                    struct s { char *a[10]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}`,
-		body:      `p := C.f1(); copy(p.a[:], []*C.char{new(C.char)}); C.f2(p)`,
+                    struct s16 { char *a[10]; };
+                    struct s16 *f16() { return malloc(sizeof(struct s16)); }
+                    void f16b(struct s16 *p) {}`,
+		body:      `p := C.f16(); copy(p.a[:], []*C.char{new(C.char)}); C.f16b(p)`,
 		fail:      true,
 		expensive: true,
 	},
 	{
 		// A very large value uses a GC program, which is a
 		// different code path.
-		name: "barrier-gcprog-array",
+		name: "barriergcprogarray",
 		c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}`,
-		body:      `p := C.f1(); p.a = [32769]*C.char{new(C.char)}; C.f2(p)`,
+                    struct s17 { char *a[32769]; };
+                    struct s17 *f17() { return malloc(sizeof(struct s17)); }
+                    void f17b(struct s17 *p) {}`,
+		body:      `p := C.f17(); p.a = [32769]*C.char{new(C.char)}; C.f17b(p)`,
 		fail:      true,
 		expensive: true,
 	},
 	{
 		// Similar case, with a source on the heap.
-		name: "barrier-gcprog-array-heap",
+		name: "barriergcprogarrayheap",
 		c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s *f1() { return malloc(sizeof(struct s)); }
-                    void f2(struct s *p) {}
-                    void f3(void *p) {}`,
+                    struct s18 { char *a[32769]; };
+                    struct s18 *f18() { return malloc(sizeof(struct s18)); }
+                    void f18b(struct s18 *p) {}
+                    void f18c(void *p) {}`,
 		imports:   []string{"unsafe"},
-		body:      `p := C.f1(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f2(p); n[0] = nil; C.f3(unsafe.Pointer(n))`,
+		body:      `p := C.f18(); n := &[32769]*C.char{new(C.char)}; p.a = *n; C.f18b(p); n[0] = nil; C.f18c(unsafe.Pointer(n))`,
 		fail:      true,
 		expensive: true,
 	},
 	{
 		// A GC program with a struct.
-		name: "barrier-gcprog-struct",
+		name: "barriergcprogstruct",
 		c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s2 { struct s f; };
-                    struct s2 *f1() { return malloc(sizeof(struct s2)); }
-                    void f2(struct s2 *p) {}`,
-		body:      `p := C.f1(); p.f = C.struct_s{[32769]*C.char{new(C.char)}}; C.f2(p)`,
+                    struct s19a { char *a[32769]; };
+                    struct s19b { struct s19a f; };
+                    struct s19b *f19() { return malloc(sizeof(struct s19b)); }
+                    void f19b(struct s19b *p) {}`,
+		body:      `p := C.f19(); p.f = C.struct_s19a{[32769]*C.char{new(C.char)}}; C.f19b(p)`,
 		fail:      true,
 		expensive: true,
 	},
 	{
 		// Similar case, with a source on the heap.
-		name: "barrier-gcprog-struct-heap",
+		name: "barriergcprogstructheap",
 		c: `#include <stdlib.h>
-                    struct s { char *a[32769]; };
-                    struct s2 { struct s f; };
-                    struct s2 *f1() { return malloc(sizeof(struct s2)); }
-                    void f2(struct s2 *p) {}
-                    void f3(void *p) {}`,
+                    struct s20a { char *a[32769]; };
+                    struct s20b { struct s20a f; };
+                    struct s20b *f20() { return malloc(sizeof(struct s20b)); }
+                    void f20b(struct s20b *p) {}
+                    void f20c(void *p) {}`,
 		imports:   []string{"unsafe"},
-		body:      `p := C.f1(); n := &C.struct_s{[32769]*C.char{new(C.char)}}; p.f = *n; C.f2(p); n.a[0] = nil; C.f3(unsafe.Pointer(n))`,
+		body:      `p := C.f20(); n := &C.struct_s20a{[32769]*C.char{new(C.char)}}; p.f = *n; C.f20b(p); n.a[0] = nil; C.f20c(unsafe.Pointer(n))`,
 		fail:      true,
 		expensive: true,
 	},
 	{
 		// Exported functions may not return Go pointers.
 		name: "export1",
-		c:    `extern unsigned char *GoFn();`,
-		support: `//export GoFn
-                          func GoFn() *byte { return new(byte) }`,
-		body: `C.GoFn()`,
+		c:    `extern unsigned char *GoFn21();`,
+		support: `//export GoFn21
+                          func GoFn21() *byte { return new(byte) }`,
+		body: `C.GoFn21()`,
 		fail: true,
 	},
 	{
 		// Returning a C pointer is fine.
 		name: "exportok",
 		c: `#include <stdlib.h>
-                    extern unsigned char *GoFn();`,
-		support: `//export GoFn
-                          func GoFn() *byte { return (*byte)(C.malloc(1)) }`,
-		body: `C.GoFn()`,
+                    extern unsigned char *GoFn22();`,
+		support: `//export GoFn22
+                          func GoFn22() *byte { return (*byte)(C.malloc(1)) }`,
+		body: `C.GoFn22()`,
 	},
 	{
 		// Passing a Go string is fine.
-		name: "pass-string",
+		name: "passstring",
 		c: `#include <stddef.h>
-                    typedef struct { const char *p; ptrdiff_t n; } gostring;
-                    gostring f(gostring s) { return s; }`,
+                    typedef struct { const char *p; ptrdiff_t n; } gostring23;
+                    gostring23 f23(gostring23 s) { return s; }`,
 		imports: []string{"unsafe"},
-		body:    `s := "a"; r := C.f(*(*C.gostring)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
+		body:    `s := "a"; r := C.f23(*(*C.gostring23)(unsafe.Pointer(&s))); if *(*string)(unsafe.Pointer(&r)) != s { panic(r) }`,
 	},
 	{
 		// Passing a slice of Go strings fails.
-		name:    "pass-string-slice",
-		c:       `void f(void *p) {}`,
+		name:    "passstringslice",
+		c:       `void f24(void *p) {}`,
 		imports: []string{"strings", "unsafe"},
-		support: `type S struct { a [1]string }`,
-		body:    `s := S{a:[1]string{strings.Repeat("a", 2)}}; C.f(unsafe.Pointer(&s.a[0]))`,
+		support: `type S24 struct { a [1]string }`,
+		body:    `s := S24{a:[1]string{strings.Repeat("a", 2)}}; C.f24(unsafe.Pointer(&s.a[0]))`,
 		fail:    true,
 	},
 	{
 		// Exported functions may not return strings.
-		name:    "ret-string",
-		c:       `extern void f();`,
+		name:    "retstring",
+		c:       `extern void f25();`,
 		imports: []string{"strings"},
-		support: `//export GoStr
-                          func GoStr() string { return strings.Repeat("a", 2) }`,
-		body: `C.f()`,
-		extra: []extra{
-			{
-				"call.c",
-				`#include <stddef.h>
-                                 typedef struct { const char *p; ptrdiff_t n; } gostring;
-                                 extern gostring GoStr();
-                                 void f() { GoStr(); }`,
-			},
-		},
+		support: `//export GoStr25
+                          func GoStr25() string { return strings.Repeat("a", 2) }`,
+		body: `C.f25()`,
+		c1: `#include <stddef.h>
+                                 typedef struct { const char *p; ptrdiff_t n; } gostring25;
+                                 extern gostring25 GoStr25();
+                                 void f25() { GoStr25(); }`,
 		fail: true,
 	},
 	{
@@ -296,37 +295,37 @@
 		// that is, we are testing something that is not unsafe.
 		name: "ptrdata1",
 		c: `#include <stdlib.h>
-                    void f(void* p) {}`,
+                    void f26(void* p) {}`,
 		imports: []string{"unsafe"},
-		support: `type S struct { p *int; a [8*8]byte; u uintptr }`,
-		body:    `i := 0; p := &S{u:uintptr(unsafe.Pointer(&i))}; q := (*S)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f(unsafe.Pointer(q))`,
+		support: `type S26 struct { p *int; a [8*8]byte; u uintptr }`,
+		body:    `i := 0; p := &S26{u:uintptr(unsafe.Pointer(&i))}; q := (*S26)(C.malloc(C.size_t(unsafe.Sizeof(*p)))); *q = *p; C.f26(unsafe.Pointer(q))`,
 		fail:    false,
 	},
 	{
 		// Like ptrdata1, but with a type that uses a GC program.
 		name: "ptrdata2",
 		c: `#include <stdlib.h>
-                    void f(void* p) {}`,
+                    void f27(void* p) {}`,
 		imports: []string{"unsafe"},
-		support: `type S struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
-		body:    `i := 0; p := S{u:uintptr(unsafe.Pointer(&i))}; q := (*S)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f(unsafe.Pointer(q))`,
+		support: `type S27 struct { p *int; a [32769*8]byte; q *int; u uintptr }`,
+		body:    `i := 0; p := S27{u:uintptr(unsafe.Pointer(&i))}; q := (*S27)(C.malloc(C.size_t(unsafe.Sizeof(p)))); *q = p; C.f27(unsafe.Pointer(q))`,
 		fail:    false,
 	},
 	{
 		// Check deferred pointers when they are used, not
 		// when the defer statement is run.
-		name: "defer",
-		c:    `typedef struct s { int *p; } s; void f(s *ps) {}`,
-		body: `p := &C.s{}; defer C.f(p); p.p = new(C.int)`,
+		name: "defer1",
+		c:    `typedef struct s28 { int *p; } s28; void f28(s28 *ps) {}`,
+		body: `p := &C.s28{}; defer C.f28(p); p.p = new(C.int)`,
 		fail: true,
 	},
 	{
 		// Check a pointer to a union if the union has any
 		// pointer fields.
 		name:    "union1",
-		c:       `typedef union { char **p; unsigned long i; } u; void f(u *pu) {}`,
+		c:       `typedef union { char **p; unsigned long i; } u29; void f29(u29 *pu) {}`,
 		imports: []string{"unsafe"},
-		body:    `var b C.char; p := &b; C.f((*C.u)(unsafe.Pointer(&p)))`,
+		body:    `var b C.char; p := &b; C.f29((*C.u29)(unsafe.Pointer(&p)))`,
 		fail:    true,
 	},
 	{
@@ -336,55 +335,55 @@
 		// integer that happens to have the same
 		// representation as a pointer.
 		name:    "union2",
-		c:       `typedef union { unsigned long i; } u; void f(u *pu) {}`,
+		c:       `typedef union { unsigned long i; } u39; void f39(u39 *pu) {}`,
 		imports: []string{"unsafe"},
-		body:    `var b C.char; p := &b; C.f((*C.u)(unsafe.Pointer(&p)))`,
+		body:    `var b C.char; p := &b; C.f39((*C.u39)(unsafe.Pointer(&p)))`,
 		fail:    false,
 	},
 	{
 		// Test preemption while entering a cgo call. Issue #21306.
-		name:    "preempt-during-call",
-		c:       `void f() {}`,
+		name:    "preemptduringcall",
+		c:       `void f30() {}`,
 		imports: []string{"runtime", "sync"},
-		body:    `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
+		body:    `var wg sync.WaitGroup; wg.Add(100); for i := 0; i < 100; i++ { go func(i int) { for j := 0; j < 100; j++ { C.f30(); runtime.GOMAXPROCS(i) }; wg.Done() }(i) }; wg.Wait()`,
 		fail:    false,
 	},
 	{
 		// Test poller deadline with cgocheck=2.  Issue #23435.
 		name:    "deadline",
-		c:       `#define US 10`,
+		c:       `#define US31 10`,
 		imports: []string{"os", "time"},
-		body:    `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US * time.Microsecond))`,
+		body:    `r, _, _ := os.Pipe(); r.SetDeadline(time.Now().Add(C.US31 * time.Microsecond))`,
 		fail:    false,
 	},
 	{
 		// Test for double evaluation of channel receive.
-		name:    "chan-recv",
-		c:       `void f(char** p) {}`,
+		name:    "chanrecv",
+		c:       `void f32(char** p) {}`,
 		imports: []string{"time"},
-		body:    `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f(&(<-c)[0]);`,
+		body:    `c := make(chan []*C.char, 2); c <- make([]*C.char, 1); go func() { time.Sleep(10 * time.Second); panic("received twice from chan") }(); C.f32(&(<-c)[0]);`,
 		fail:    false,
 	},
 	{
 		// Test that converting the address of a struct field
 		// to unsafe.Pointer still just checks that field.
 		// Issue #25941.
-		name:    "struct-field",
-		c:       `void f(void* p) {}`,
+		name:    "structfield",
+		c:       `void f33(void* p) {}`,
 		imports: []string{"unsafe"},
-		support: `type S struct { p *int; a [8]byte; u uintptr }`,
-		body:    `s := &S{p: new(int)}; C.f(unsafe.Pointer(&s.a))`,
+		support: `type S33 struct { p *int; a [8]byte; u uintptr }`,
+		body:    `s := &S33{p: new(int)}; C.f33(unsafe.Pointer(&s.a))`,
 		fail:    false,
 	},
 	{
 		// Test that converting multiple struct field
 		// addresses to unsafe.Pointer still just checks those
 		// fields. Issue #25941.
-		name:    "struct-field-2",
-		c:       `void f(void* p, int r, void* s) {}`,
+		name:    "structfield2",
+		c:       `void f34(void* p, int r, void* s) {}`,
 		imports: []string{"unsafe"},
-		support: `type S struct { a [8]byte; p *int; b int64; }`,
-		body:    `s := &S{p: new(int)}; C.f(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
+		support: `type S34 struct { a [8]byte; p *int; b int64; }`,
+		body:    `s := &S34{p: new(int)}; C.f34(unsafe.Pointer(&s.a), 32, unsafe.Pointer(&s.b))`,
 		fail:    false,
 	},
 	{
@@ -392,18 +391,18 @@
 		// evaluated when a deferred function is deferred, not
 		// when it is run.
 		name:    "defer2",
-		c:       `void f(char **pc) {}`,
-		support: `type S1 struct { s []*C.char }; type S2 struct { ps *S1 }`,
-		body:    `p := &S2{&S1{[]*C.char{nil}}}; defer C.f(&p.ps.s[0]); p.ps = nil`,
+		c:       `void f35(char **pc) {}`,
+		support: `type S35a struct { s []*C.char }; type S35b struct { ps *S35a }`,
+		body:    `p := &S35b{&S35a{[]*C.char{nil}}}; defer C.f35(&p.ps.s[0]); p.ps = nil`,
 		fail:    false,
 	},
 	{
 		// Test that indexing into a function call still
 		// examines only the slice being indexed.
 		name:    "buffer",
-		c:       `void f(void *p) {}`,
+		c:       `void f36(void *p) {}`,
 		imports: []string{"bytes", "unsafe"},
-		body:    `var b bytes.Buffer; b.WriteString("a"); C.f(unsafe.Pointer(&b.Bytes()[0]))`,
+		body:    `var b bytes.Buffer; b.WriteString("a"); C.f36(unsafe.Pointer(&b.Bytes()[0]))`,
 		fail:    false,
 	},
 	{
@@ -411,8 +410,8 @@
 		name:    "finalizer",
 		c:       `// Nothing to declare.`,
 		imports: []string{"os"},
-		support: `func open() { os.Open(os.Args[0]) }; var G [][]byte`,
-		body:    `for i := 0; i < 10000; i++ { G = append(G, make([]byte, 4096)); if i % 100 == 0 { G = nil; open() } }`,
+		support: `func open37() { os.Open(os.Args[0]) }; var G37 [][]byte`,
+		body:    `for i := 0; i < 10000; i++ { G37 = append(G37, make([]byte, 4096)); if i % 100 == 0 { G37 = nil; open37() } }`,
 		fail:    false,
 	},
 	{
@@ -420,103 +419,155 @@
 		name:    "structof",
 		c:       `// Nothing to declare.`,
 		imports: []string{"reflect"},
-		support: `type MyInt int; func (i MyInt) Get() int { return int(i) }; type Getter interface { Get() int }`,
-		body:    `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt", Type: reflect.TypeOf(MyInt(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter).Get()`,
+		support: `type MyInt38 int; func (i MyInt38) Get() int { return int(i) }; type Getter38 interface { Get() int }`,
+		body:    `t := reflect.StructOf([]reflect.StructField{{Name: "MyInt38", Type: reflect.TypeOf(MyInt38(0)), Anonymous: true}}); v := reflect.New(t).Elem(); v.Interface().(Getter38).Get()`,
 		fail:    false,
 	},
 }
 
 func TestPointerChecks(t *testing.T) {
+	dir, exe := buildPtrTests(t)
+
+	// We (TestPointerChecks) return before the parallel subtest functions do,
+	// so we can't just defer os.RemoveAll(dir). Instead we have to wait for
+	// the parallel subtests to finish. This code looks racy but is not:
+	// the add +1 run in serial before testOne blocks. The -1 run in parallel
+	// after testOne finishes.
+	var pending int32
 	for _, pt := range ptrTests {
 		pt := pt
 		t.Run(pt.name, func(t *testing.T) {
-			testOne(t, pt)
+			atomic.AddInt32(&pending, +1)
+			defer func() {
+				if atomic.AddInt32(&pending, -1) == 0 {
+					println("removing", dir)
+					os.RemoveAll(dir)
+				}
+			}()
+			testOne(t, pt, exe)
 		})
 	}
 }
 
-func testOne(t *testing.T, pt ptrTest) {
-	t.Parallel()
-
-	gopath, err := ioutil.TempDir("", filepath.Base(t.Name()))
-	if err != nil {
-		t.Fatal(err)
+func buildPtrTests(t *testing.T) (dir, exe string) {
+	var gopath string
+	if *tmp != "" {
+		gopath = *tmp
+		dir = ""
+	} else {
+		d, err := ioutil.TempDir("", filepath.Base(t.Name()))
+		if err != nil {
+			t.Fatal(err)
+		}
+		dir = d
+		gopath = d
 	}
-	defer os.RemoveAll(gopath)
 
 	src := filepath.Join(gopath, "src", "ptrtest")
 	if err := os.MkdirAll(src, 0777); err != nil {
 		t.Fatal(err)
 	}
 
-	name := filepath.Join(src, fmt.Sprintf("%s.go", filepath.Base(t.Name())))
-	f, err := os.Create(name)
-	if err != nil {
-		t.Fatal(err)
-	}
+	// Prepare two cgo inputs: one for standard cgo and one for //export cgo.
+	// (The latter cannot have C definitions, only declarations.)
+	var cgo1, cgo2 bytes.Buffer
+	fmt.Fprintf(&cgo1, "package main\n\n/*\n")
+	fmt.Fprintf(&cgo2, "package main\n\n/*\n")
 
-	b := bufio.NewWriter(f)
-	fmt.Fprintln(b, `package main`)
-	fmt.Fprintln(b)
-	fmt.Fprintln(b, `/*`)
-	fmt.Fprintln(b, pt.c)
-	fmt.Fprintln(b, `*/`)
-	fmt.Fprintln(b, `import "C"`)
-	fmt.Fprintln(b)
-	for _, imp := range pt.imports {
-		fmt.Fprintln(b, `import "`+imp+`"`)
+	// C code
+	for _, pt := range ptrTests {
+		cgo := &cgo1
+		if strings.Contains(pt.support, "//export") {
+			cgo = &cgo2
+		}
+		fmt.Fprintf(cgo, "%s\n", pt.c)
+		fmt.Fprintf(&cgo1, "%s\n", pt.c1)
 	}
-	if len(pt.imports) > 0 {
-		fmt.Fprintln(b)
-	}
-	if len(pt.support) > 0 {
-		fmt.Fprintln(b, pt.support)
-		fmt.Fprintln(b)
-	}
-	fmt.Fprintln(b, `func main() {`)
-	fmt.Fprintln(b, pt.body)
-	fmt.Fprintln(b, `}`)
+	fmt.Fprintf(&cgo1, "*/\nimport \"C\"\n\n")
+	fmt.Fprintf(&cgo2, "*/\nimport \"C\"\n\n")
 
-	if err := b.Flush(); err != nil {
-		t.Fatalf("flushing %s: %v", name, err)
-	}
-	if err := f.Close(); err != nil {
-		t.Fatalf("closing %s: %v", name, err)
-	}
+	// Imports
+	did1 := make(map[string]bool)
+	did2 := make(map[string]bool)
+	did1["os"] = true // for ptrTestMain
+	fmt.Fprintf(&cgo1, "import \"os\"\n")
 
-	for _, e := range pt.extra {
-		if err := ioutil.WriteFile(filepath.Join(src, e.name), []byte(e.contents), 0644); err != nil {
-			t.Fatalf("writing %s: %v", e.name, err)
+	for _, pt := range ptrTests {
+		did := did1
+		cgo := &cgo1
+		if strings.Contains(pt.support, "//export") {
+			did = did2
+			cgo = &cgo2
+		}
+		for _, imp := range pt.imports {
+			if !did[imp] {
+				did[imp] = true
+				fmt.Fprintf(cgo, "import %q\n", imp)
+			}
 		}
 	}
 
-	gomod := fmt.Sprintf("module %s\n", filepath.Base(src))
-	if err := ioutil.WriteFile(filepath.Join(src, "go.mod"), []byte(gomod), 0666); err != nil {
-		t.Fatalf("writing go.mod: %v", err)
+	// Func support and bodies.
+	for _, pt := range ptrTests {
+		cgo := &cgo1
+		if strings.Contains(pt.support, "//export") {
+			cgo = &cgo2
+		}
+		fmt.Fprintf(cgo, "%s\nfunc %s() {\n%s\n}\n", pt.support, pt.name, pt.body)
 	}
 
-	args := func(cmd *exec.Cmd) string {
-		return strings.Join(cmd.Args, " ")
+	// Func list and main dispatch.
+	fmt.Fprintf(&cgo1, "var funcs = map[string]func() {\n")
+	for _, pt := range ptrTests {
+		fmt.Fprintf(&cgo1, "\t%q: %s,\n", pt.name, pt.name)
+	}
+	fmt.Fprintf(&cgo1, "}\n\n")
+	fmt.Fprintf(&cgo1, "%s\n", ptrTestMain)
+
+	if err := ioutil.WriteFile(filepath.Join(src, "cgo1.go"), cgo1.Bytes(), 0666); err != nil {
+		t.Fatal(err)
+	}
+	if err := ioutil.WriteFile(filepath.Join(src, "cgo2.go"), cgo2.Bytes(), 0666); err != nil {
+		t.Fatal(err)
 	}
 
-	cmd := exec.Command("go", "build")
+	cmd := exec.Command("go", "build", "-o", "ptrtest.exe")
 	cmd.Dir = src
 	cmd.Env = append(os.Environ(), "GOPATH="+gopath)
-	buf, err := cmd.CombinedOutput()
+	out, err := cmd.CombinedOutput()
 	if err != nil {
-		t.Logf("%#q:\n%s", args(cmd), buf)
-		t.Fatalf("failed to build: %v", err)
+		t.Fatalf("go build: %v\n%s", err, out)
 	}
 
-	exe := filepath.Join(src, filepath.Base(src))
-	cmd = exec.Command(exe)
-	cmd.Dir = src
+	return dir, filepath.Join(src, "ptrtest.exe")
+}
+
+const ptrTestMain = `
+func main() {
+	for _, arg := range os.Args[1:] {
+		f := funcs[arg]
+		if f == nil {
+			panic("missing func "+arg)
+		}
+		f()
+	}
+}
+`
+
+func testOne(t *testing.T, pt ptrTest, exe string) {
+	t.Parallel()
+
+	newcmd := func(cgocheck string) *exec.Cmd {
+		cmd := exec.Command(exe, pt.name)
+		cmd.Env = append(os.Environ(), "GODEBUG=cgocheck="+cgocheck)
+		return cmd
+	}
 
 	if pt.expensive {
-		cmd.Env = cgocheckEnv("1")
+		cmd := newcmd("1")
 		buf, err := cmd.CombinedOutput()
 		if err != nil {
-			t.Logf("%#q:\n%s", args(cmd), buf)
+			t.Logf("%s", buf)
 			if pt.fail {
 				t.Fatalf("test marked expensive, but failed when not expensive: %v", err)
 			} else {
@@ -524,54 +575,45 @@
 			}
 		}
 
-		cmd = exec.Command(exe)
-		cmd.Dir = src
 	}
 
+	cmd := newcmd("")
 	if pt.expensive {
-		cmd.Env = cgocheckEnv("2")
+		cmd = newcmd("2")
 	}
 
-	buf, err = cmd.CombinedOutput()
+	buf, err := cmd.CombinedOutput()
 	if pt.fail {
 		if err == nil {
-			t.Logf("%#q:\n%s", args(cmd), buf)
+			t.Logf("%s", buf)
 			t.Fatalf("did not fail as expected")
 		} else if !bytes.Contains(buf, []byte("Go pointer")) {
-			t.Logf("%#q:\n%s", args(cmd), buf)
+			t.Logf("%s", buf)
 			t.Fatalf("did not print expected error (failed with %v)", err)
 		}
 	} else {
 		if err != nil {
-			t.Logf("%#q:\n%s", args(cmd), buf)
+			t.Logf("%s", buf)
 			t.Fatalf("failed unexpectedly: %v", err)
 		}
 
 		if !pt.expensive {
 			// Make sure it passes with the expensive checks.
-			cmd := exec.Command(exe)
-			cmd.Dir = src
-			cmd.Env = cgocheckEnv("2")
+			cmd := newcmd("2")
 			buf, err := cmd.CombinedOutput()
 			if err != nil {
-				t.Logf("%#q:\n%s", args(cmd), buf)
+				t.Logf("%s", buf)
 				t.Fatalf("failed unexpectedly with expensive checks: %v", err)
 			}
 		}
 	}
 
 	if pt.fail {
-		cmd = exec.Command(exe)
-		cmd.Dir = src
-		cmd.Env = cgocheckEnv("0")
+		cmd := newcmd("0")
 		buf, err := cmd.CombinedOutput()
 		if err != nil {
-			t.Logf("%#q:\n%s", args(cmd), buf)
+			t.Logf("%s", buf)
 			t.Fatalf("failed unexpectedly with GODEBUG=cgocheck=0: %v", err)
 		}
 	}
 }
-
-func cgocheckEnv(val string) []string {
-	return append(os.Environ(), "GODEBUG=cgocheck="+val)
-}
diff --git a/misc/cgo/errors/testdata/err1.go b/misc/cgo/errors/testdata/err1.go
index 2c232cf..ced7443 100644
--- a/misc/cgo/errors/testdata/err1.go
+++ b/misc/cgo/errors/testdata/err1.go
@@ -10,6 +10,10 @@
 void test() {
 	xxx;		// ERROR HERE
 }
+
+// Issue 8442.  Cgo output unhelpful error messages for
+// invalid C preambles.
+void issue8442foo(UNDEF*); // ERROR HERE
 */
 import "C"
 
diff --git a/misc/cgo/errors/testdata/err2.go b/misc/cgo/errors/testdata/err2.go
index 3ab410b..1d22401 100644
--- a/misc/cgo/errors/testdata/err2.go
+++ b/misc/cgo/errors/testdata/err2.go
@@ -4,10 +4,99 @@
 
 package main
 
+/*
+#include <stdio.h>
+
+typedef struct foo foo_t;
+typedef struct bar bar_t;
+
+foo_t *foop;
+
+long double x = 0;
+
+static int transform(int x) { return x; }
+
+typedef void v;
+void F(v** p) {}
+
+void fvi(void *p, int x) {}
+
+void fppi(int** p) {}
+
+int i;
+void fi(int i) {}
+*/
 import "C"
+import (
+	"unsafe"
+)
 
 func main() {
 	s := ""
 	_ = s
 	C.malloc(s) // ERROR HERE
+
+	x := (*C.bar_t)(nil)
+	C.foop = x // ERROR HERE
+
+	// issue 13129: used to output error about C.unsignedshort with CC=clang
+	var x C.ushort
+	x = int(0) // ERROR HERE: C\.ushort
+
+	// issue 13423
+	_ = C.fopen() // ERROR HERE
+
+	// issue 13467
+	var x rune = '✈'
+	var _ rune = C.transform(x) // ERROR HERE: C\.int
+
+	// issue 13635: used to output error about C.unsignedchar.
+	// This test tests all such types.
+	var (
+		_ C.uchar         = "uc"  // ERROR HERE: C\.uchar
+		_ C.schar         = "sc"  // ERROR HERE: C\.schar
+		_ C.ushort        = "us"  // ERROR HERE: C\.ushort
+		_ C.uint          = "ui"  // ERROR HERE: C\.uint
+		_ C.ulong         = "ul"  // ERROR HERE: C\.ulong
+		_ C.longlong      = "ll"  // ERROR HERE: C\.longlong
+		_ C.ulonglong     = "ull" // ERROR HERE: C\.ulonglong
+		_ C.complexfloat  = "cf"  // ERROR HERE: C\.complexfloat
+		_ C.complexdouble = "cd"  // ERROR HERE: C\.complexdouble
+	)
+
+	// issue 13830
+	// cgo converts C void* to Go unsafe.Pointer, so despite appearances C
+	// void** is Go *unsafe.Pointer. This test verifies that we detect the
+	// problem at build time.
+	{
+		type v [0]byte
+
+		f := func(p **v) {
+			C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
+		}
+		var p *v
+		f(&p)
+	}
+
+	// issue 16116
+	_ = C.fvi(1) // ERROR HERE
+
+	// Issue 16591: Test that we detect an invalid call that was being
+	// hidden by a type conversion inserted by cgo checking.
+	{
+		type x *C.int
+		var p *x
+		C.fppi(p) // ERROR HERE
+	}
+
+	// issue 26745
+	_ = func(i int) int {
+		return C.i + 1 // ERROR HERE: :13
+	}
+	_ = func(i int) {
+		C.fi(i) // ERROR HERE: :6
+	}
+
+	C.fi = C.fi // ERROR HERE
+
 }
diff --git a/misc/cgo/errors/testdata/err3.go b/misc/cgo/errors/testdata/err3.go
deleted file mode 100644
index 609e1a0..0000000
--- a/misc/cgo/errors/testdata/err3.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-typedef struct foo foo_t;
-typedef struct bar bar_t;
-
-foo_t *foop;
-*/
-import "C"
-
-func main() {
-	x := (*C.bar_t)(nil)
-	C.foop = x // ERROR HERE
-}
diff --git a/misc/cgo/errors/testdata/issue13129.go b/misc/cgo/errors/testdata/issue13129.go
deleted file mode 100644
index 057bce4..0000000
--- a/misc/cgo/errors/testdata/issue13129.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// issue 13129: used to output error about C.unsignedshort with CC=clang
-
-package main
-
-import "C"
-
-func main() {
-	var x C.ushort
-	x = int(0) // ERROR HERE: C\.ushort
-}
diff --git a/misc/cgo/errors/testdata/issue13423.go b/misc/cgo/errors/testdata/issue13423.go
deleted file mode 100644
index fc19157..0000000
--- a/misc/cgo/errors/testdata/issue13423.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// #include <stdio.h>
-import "C"
-
-func main() {
-	_ = C.fopen() // ERROR HERE
-}
diff --git a/misc/cgo/errors/testdata/issue13467.go b/misc/cgo/errors/testdata/issue13467.go
deleted file mode 100644
index e061880..0000000
--- a/misc/cgo/errors/testdata/issue13467.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package p
-
-/*
-static int transform(int x) { return x; }
-*/
-import "C"
-
-func F() {
-	var x rune = '✈'
-	var _ rune = C.transform(x) // ERROR HERE: C\.int
-}
diff --git a/misc/cgo/errors/testdata/issue13635.go b/misc/cgo/errors/testdata/issue13635.go
deleted file mode 100644
index 3f38f5d..0000000
--- a/misc/cgo/errors/testdata/issue13635.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// issue 13635: used to output error about C.unsignedchar.
-// This test tests all such types.
-
-package pkg
-
-import "C"
-
-func main() {
-	var (
-		_ C.uchar         = "uc"  // ERROR HERE: C\.uchar
-		_ C.schar         = "sc"  // ERROR HERE: C\.schar
-		_ C.ushort        = "us"  // ERROR HERE: C\.ushort
-		_ C.uint          = "ui"  // ERROR HERE: C\.uint
-		_ C.ulong         = "ul"  // ERROR HERE: C\.ulong
-		_ C.longlong      = "ll"  // ERROR HERE: C\.longlong
-		_ C.ulonglong     = "ull" // ERROR HERE: C\.ulonglong
-		_ C.complexfloat  = "cf"  // ERROR HERE: C\.complexfloat
-		_ C.complexdouble = "cd"  // ERROR HERE: C\.complexdouble
-	)
-}
diff --git a/misc/cgo/errors/testdata/issue13830.go b/misc/cgo/errors/testdata/issue13830.go
deleted file mode 100644
index ac20c82..0000000
--- a/misc/cgo/errors/testdata/issue13830.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo converts C void* to Go unsafe.Pointer, so despite appearances C
-// void** is Go *unsafe.Pointer. This test verifies that we detect the
-// problem at build time.
-
-package main
-
-// typedef void v;
-// void F(v** p) {}
-import "C"
-
-import "unsafe"
-
-type v [0]byte
-
-func f(p **v) {
-	C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
-}
-
-func main() {
-	var p *v
-	f(&p)
-}
diff --git a/misc/cgo/errors/testdata/issue16116.go b/misc/cgo/errors/testdata/issue16116.go
deleted file mode 100644
index 1e01cab..0000000
--- a/misc/cgo/errors/testdata/issue16116.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// void f(void *p, int x) {}
-import "C"
-
-func main() {
-	_ = C.f(1) // ERROR HERE
-}
diff --git a/misc/cgo/errors/testdata/issue16591.go b/misc/cgo/errors/testdata/issue16591.go
deleted file mode 100644
index 10eb840..0000000
--- a/misc/cgo/errors/testdata/issue16591.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 16591: Test that we detect an invalid call that was being
-// hidden by a type conversion inserted by cgo checking.
-
-package p
-
-// void f(int** p) { }
-import "C"
-
-type x *C.int
-
-func F(p *x) {
-	C.f(p) // ERROR HERE
-}
diff --git a/misc/cgo/errors/testdata/issue26745.go b/misc/cgo/errors/testdata/issue26745.go
deleted file mode 100644
index 0e22453..0000000
--- a/misc/cgo/errors/testdata/issue26745.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// int a;
-// void CF(int i) {}
-import "C"
-
-func F1(i int) int {
-	return C.a + 1 // ERROR HERE: :13
-}
-
-func F2(i int) {
-	C.CF(i) // ERROR HERE: :6
-}
diff --git a/misc/cgo/errors/testdata/issue7757.go b/misc/cgo/errors/testdata/issue7757.go
deleted file mode 100644
index 0426e9f..0000000
--- a/misc/cgo/errors/testdata/issue7757.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-/*
-void foo() {}
-*/
-import "C"
-
-func main() {
-	C.foo = C.foo // ERROR HERE
-}
diff --git a/misc/cgo/errors/testdata/issue8442.go b/misc/cgo/errors/testdata/issue8442.go
deleted file mode 100644
index 60477ad..0000000
--- a/misc/cgo/errors/testdata/issue8442.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-// Issue 8442.  Cgo output unhelpful error messages for
-// invalid C preambles.
-
-/*
-void issue8442foo(UNDEF*); // ERROR HERE
-*/
-import "C"
-
-func main() {
-	C.issue8442foo(nil)
-}
diff --git a/misc/cgo/test/align.go b/misc/cgo/test/align.go
deleted file mode 100644
index a23b44f..0000000
--- a/misc/cgo/test/align.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdio.h>
-
-typedef unsigned char Uint8;
-typedef unsigned short Uint16;
-
-typedef enum {
- MOD1 = 0x0000,
- MODX = 0x8000
-} SDLMod;
-
-typedef enum {
- A = 1,
- B = 322,
- SDLK_LAST
-} SDLKey;
-
-typedef struct SDL_keysym {
-	Uint8 scancode;
-	SDLKey sym;
-	SDLMod mod;
-	Uint16 unicode;
-} SDL_keysym;
-
-typedef struct SDL_KeyboardEvent {
-	Uint8 typ;
-	Uint8 which;
-	Uint8 state;
-	SDL_keysym keysym;
-} SDL_KeyboardEvent;
-
-void makeEvent(SDL_KeyboardEvent *event) {
- unsigned char *p;
- int i;
-
- p = (unsigned char*)event;
- for (i=0; i<sizeof *event; i++) {
-   p[i] = i;
- }
-}
-
-int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
-  return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
-}
-
-void cTest(SDL_KeyboardEvent *event) {
- printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
-   event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
- fflush(stdout);
-}
-
-*/
-import "C"
-
-import (
-	"testing"
-)
-
-func testAlign(t *testing.T) {
-	var evt C.SDL_KeyboardEvent
-	C.makeEvent(&evt)
-	if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
-		t.Error("*** bad alignment")
-		C.cTest(&evt)
-		t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
-			evt.typ, evt.which, evt.state, evt.keysym.scancode,
-			evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
-		t.Error(evt)
-	}
-}
diff --git a/misc/cgo/test/api.go b/misc/cgo/test/api.go
deleted file mode 100644
index d2b09cb..0000000
--- a/misc/cgo/test/api.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// API Compatibility Checks for cgo
-
-package cgotest
-
-// #include <stdlib.h>
-//
-// // Test for issue 17723.
-// typedef char *cstring_pointer;
-// static void cstring_pointer_fun(cstring_pointer dummy) { }
-//
-// const char *api_hello = "hello!";
-import "C"
-import "unsafe"
-
-func testAPI() {
-	var cs *C.char
-	cs = C.CString("hello")
-	defer C.free(unsafe.Pointer(cs))
-	var s string
-	s = C.GoString((*C.char)(C.api_hello))
-	s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
-	var b []byte
-	b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
-	_, _ = s, b
-	C.cstring_pointer_fun(nil)
-}
diff --git a/misc/cgo/test/basic.go b/misc/cgo/test/basic.go
deleted file mode 100644
index 2655a66..0000000
--- a/misc/cgo/test/basic.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Basic test cases for cgo.
-
-package cgotest
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#define SHIFT(x, y)  ((x)<<(y))
-#define KILO SHIFT(1, 10)
-#define UINT32VAL 0xc008427bU
-
-enum E {
-	Enum1 = 1,
-	Enum2 = 2,
-};
-
-typedef unsigned char cgo_uuid_t[20];
-
-void uuid_generate(cgo_uuid_t x) {
-	x[0] = 0;
-}
-
-struct S {
-	int x;
-};
-
-const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-
-extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
-
-enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
-
-// issue 1222
-typedef union {
-	long align;
-} xxpthread_mutex_t;
-
-struct ibv_async_event {
-	union {
-		int x;
-	} element;
-};
-
-struct ibv_context {
-	xxpthread_mutex_t mutex;
-};
-
-int add(int x, int y) {
-	return x+y;
-};
-*/
-import "C"
-import (
-	"runtime"
-	"syscall"
-	"testing"
-	"unsafe"
-)
-
-const EINVAL = C.EINVAL /* test #define */
-
-var KILO = C.KILO
-
-func uuidgen() {
-	var uuid C.cgo_uuid_t
-	C.uuid_generate(&uuid[0])
-}
-
-func Strtol(s string, base int) (int, error) {
-	p := C.CString(s)
-	n, err := C.strtol(p, nil, C.int(base))
-	C.free(unsafe.Pointer(p))
-	return int(n), err
-}
-
-func Atol(s string) int {
-	p := C.CString(s)
-	n := C.atol(p)
-	C.free(unsafe.Pointer(p))
-	return int(n)
-}
-
-func testConst(t *testing.T) {
-	C.myConstFunc(nil, 0, nil)
-}
-
-func testEnum(t *testing.T) {
-	if C.Enum1 != 1 || C.Enum2 != 2 {
-		t.Error("bad enum", C.Enum1, C.Enum2)
-	}
-}
-
-func testAtol(t *testing.T) {
-	l := Atol("123")
-	if l != 123 {
-		t.Error("Atol 123: ", l)
-	}
-}
-
-func testErrno(t *testing.T) {
-	p := C.CString("no-such-file")
-	m := C.CString("r")
-	f, err := C.fopen(p, m)
-	C.free(unsafe.Pointer(p))
-	C.free(unsafe.Pointer(m))
-	if err == nil {
-		C.fclose(f)
-		t.Fatalf("C.fopen: should fail")
-	}
-	if err != syscall.ENOENT {
-		t.Fatalf("C.fopen: unexpected error: %v", err)
-	}
-}
-
-func testMultipleAssign(t *testing.T) {
-	p := C.CString("234")
-	n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
-	if runtime.GOOS == "openbsd" {
-		// Bug in OpenBSD strtol(3) - base > 36 succeeds.
-		if (n != 0 && n != 239089) || m != 234 {
-			t.Fatal("Strtol x2: ", n, m)
-		}
-	} else if n != 0 || m != 234 {
-		t.Fatal("Strtol x2: ", n, m)
-	}
-	C.free(unsafe.Pointer(p))
-}
-
-var (
-	cuint  = (C.uint)(0)
-	culong C.ulong
-	cchar  C.char
-)
-
-type Context struct {
-	ctx *C.struct_ibv_context
-}
-
-func benchCgoCall(b *testing.B) {
-	const x = C.int(2)
-	const y = C.int(3)
-	for i := 0; i < b.N; i++ {
-		C.add(x, y)
-	}
-}
-
-var sinkString string
-
-func benchGoString(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		sinkString = C.GoString(C.cstr)
-	}
-	const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
-	if sinkString != want {
-		b.Fatalf("%q != %q", sinkString, want)
-	}
-}
-
-// Issue 2470.
-func testUnsignedInt(t *testing.T) {
-	a := (int64)(C.UINT32VAL)
-	b := (int64)(0xc008427b)
-	if a != b {
-		t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
-	}
-}
-
-// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
-func sliceOperands(array [2000]int) {
-	_ = array[C.KILO:C.KILO:C.KILO] // no type error
-}
-
-// set in cgo_thread_lock.go init
-var testThreadLockFunc = func(*testing.T) {}
diff --git a/misc/cgo/test/cflags.go b/misc/cgo/test/cflags.go
deleted file mode 100644
index bc290bf..0000000
--- a/misc/cgo/test/cflags.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that the #cgo CFLAGS directive works,
-// with and without platform filters.
-// See https://golang.org/issue/5224 for details.
-package cgotest
-
-/*
-#cgo CFLAGS: -DCOMMON_VALUE=123
-#cgo windows CFLAGS: -DIS_WINDOWS=1
-#cgo !windows CFLAGS: -DIS_WINDOWS=0
-int common = COMMON_VALUE;
-int is_windows = IS_WINDOWS;
-*/
-import "C"
-
-import (
-	"runtime"
-	"testing"
-)
-
-func testCflags(t *testing.T) {
-	is_windows := C.is_windows == 1
-	if is_windows != (runtime.GOOS == "windows") {
-		t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
-	}
-	if C.common != 123 {
-		t.Errorf("common: %v (expected 123)", C.common)
-	}
-}
diff --git a/misc/cgo/test/cgo_stubs_android_test.go b/misc/cgo/test/cgo_stubs_android_test.go
index 710e094..a1c2482 100644
--- a/misc/cgo/test/cgo_stubs_android_test.go
+++ b/misc/cgo/test/cgo_stubs_android_test.go
@@ -8,6 +8,5 @@
 
 // Stubs for tests that fails to build on Android
 func test6997(t *testing.T)        {}
-func test3775(t *testing.T)        {}
 func test8694(t *testing.T)        {}
 func testSigaltstack(t *testing.T) {}
diff --git a/misc/cgo/test/checkconst.go b/misc/cgo/test/checkconst.go
deleted file mode 100644
index 0160c1e..0000000
--- a/misc/cgo/test/checkconst.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test a constant in conjunction with pointer checking.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-#define CheckConstVal 0
-
-typedef struct {
-	int *p;
-} CheckConstStruct;
-
-static void CheckConstFunc(CheckConstStruct *p, int e) {
-}
-*/
-import "C"
-
-import (
-	"testing"
-	"unsafe"
-)
-
-func testCheckConst(t *testing.T) {
-	// The test is that this compiles successfully.
-	p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
-	defer C.free(p)
-	C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
-}
diff --git a/misc/cgo/test/complex.go b/misc/cgo/test/complex.go
deleted file mode 100644
index ca0a97d..0000000
--- a/misc/cgo/test/complex.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-struct {
-	float x;
-	_Complex float y;
-} cplxAlign = { 3.14, 2.17 };
-*/
-import "C"
-
-import "testing"
-
-func TestComplexAlign(t *testing.T) {
-	if C.cplxAlign.x != 3.14 {
-		t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
-	}
-	if C.cplxAlign.y != 2.17 {
-		t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
-	}
-}
diff --git a/misc/cgo/test/cthread.go b/misc/cgo/test/cthread.go
deleted file mode 100644
index af44911..0000000
--- a/misc/cgo/test/cthread.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// extern void doAdd(int, int);
-import "C"
-
-import (
-	"runtime"
-	"sync"
-	"testing"
-)
-
-var sum struct {
-	sync.Mutex
-	i int
-}
-
-//export Add
-func Add(x int) {
-	defer func() {
-		recover()
-	}()
-	sum.Lock()
-	sum.i += x
-	sum.Unlock()
-	var p *int
-	*p = 2
-}
-
-func testCthread(t *testing.T) {
-	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
-		t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
-	}
-	sum.i = 0
-	C.doAdd(10, 6)
-
-	want := 10 * (10 - 1) / 2 * 6
-	if sum.i != want {
-		t.Fatalf("sum=%d, want %d", sum.i, want)
-	}
-}
diff --git a/misc/cgo/test/duplicate_symbol.go b/misc/cgo/test/duplicate_symbol.go
deleted file mode 100644
index 6144271..0000000
--- a/misc/cgo/test/duplicate_symbol.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains test cases for cgo.
-
-package cgotest
-
-/*
-int base_symbol = 0;
-
-#define alias_one base_symbol
-#define alias_two base_symbol
-*/
-import "C"
-
-import "fmt"
-
-func duplicateSymbols() {
-	fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
-}
diff --git a/misc/cgo/test/env.go b/misc/cgo/test/env.go
deleted file mode 100644
index e0703e1..0000000
--- a/misc/cgo/test/env.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-*/
-import "C"
-import (
-	"os"
-	"runtime"
-	"testing"
-	"unsafe"
-)
-
-// This is really an os package test but here for convenience.
-func testSetEnv(t *testing.T) {
-	if runtime.GOOS == "windows" {
-		// Go uses SetEnvironmentVariable on windows. However,
-		// C runtime takes a *copy* at process startup of the
-		// OS environment, and stores it in environ/envp.
-		// It is this copy that	getenv/putenv manipulate.
-		t.Logf("skipping test")
-		return
-	}
-	const key = "CGO_OS_TEST_KEY"
-	const val = "CGO_OS_TEST_VALUE"
-	os.Setenv(key, val)
-	keyc := C.CString(key)
-	defer C.free(unsafe.Pointer(keyc))
-	v := C.getenv(keyc)
-	if uintptr(unsafe.Pointer(v)) == 0 {
-		t.Fatal("getenv returned NULL")
-	}
-	vs := C.GoString(v)
-	if vs != val {
-		t.Fatalf("getenv() = %q; want %q", vs, val)
-	}
-}
diff --git a/misc/cgo/test/exports.go b/misc/cgo/test/exports.go
deleted file mode 100644
index 71e5dcd..0000000
--- a/misc/cgo/test/exports.go
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-import "runtime"
-
-//export ReturnIntLong
-func ReturnIntLong() (int, C.long) {
-	return 1, 2
-}
-
-//export gc
-func gc() {
-	runtime.GC()
-}
diff --git a/misc/cgo/test/fpvar.go b/misc/cgo/test/fpvar.go
deleted file mode 100644
index 7aab8ca..0000000
--- a/misc/cgo/test/fpvar.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains test cases for cgo with function pointer variables.
-
-package cgotest
-
-/*
-typedef int (*intFunc) ();
-
-int
-bridge_int_func(intFunc f)
-{
-	return f();
-}
-
-int fortytwo()
-{
-	return 42;
-}
-
-*/
-import "C"
-import "testing"
-
-func callBridge(f C.intFunc) int {
-	return int(C.bridge_int_func(f))
-}
-
-func callCBridge(f C.intFunc) C.int {
-	return C.bridge_int_func(f)
-}
-
-func testFpVar(t *testing.T) {
-	const expected = 42
-	f := C.intFunc(C.fortytwo)
-	res1 := C.bridge_int_func(f)
-	if r1 := int(res1); r1 != expected {
-		t.Errorf("got %d, want %d", r1, expected)
-	}
-	res2 := callCBridge(f)
-	if r2 := int(res2); r2 != expected {
-		t.Errorf("got %d, want %d", r2, expected)
-	}
-	r3 := callBridge(f)
-	if r3 != expected {
-		t.Errorf("got %d, want %d", r3, expected)
-	}
-}
diff --git a/misc/cgo/test/helpers.go b/misc/cgo/test/helpers.go
deleted file mode 100644
index f6a822a..0000000
--- a/misc/cgo/test/helpers.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// const char *greeting = "hello, world";
-import "C"
-
-import (
-	"reflect"
-	"testing"
-	"unsafe"
-)
-
-const greeting = "hello, world"
-
-type testPair struct {
-	Name      string
-	Got, Want interface{}
-}
-
-var testPairs = []testPair{
-	{"GoString", C.GoString(C.greeting), greeting},
-	{"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
-	{"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
-}
-
-func testHelpers(t *testing.T) {
-	for _, pair := range testPairs {
-		if !reflect.DeepEqual(pair.Got, pair.Want) {
-			t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
-		}
-	}
-}
diff --git a/misc/cgo/test/issue10303.go b/misc/cgo/test/issue10303.go
deleted file mode 100644
index 66e2644..0000000
--- a/misc/cgo/test/issue10303.go
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 10303. Pointers passed to C were not marked as escaping (bug in cgo).
-
-package cgotest
-
-import "runtime"
-
-/*
-typedef int *intptr;
-
-void setintstar(int *x) {
-	*x = 1;
-}
-
-void setintptr(intptr x) {
-	*x = 1;
-}
-
-void setvoidptr(void *x) {
-	*(int*)x = 1;
-}
-
-typedef struct Struct Struct;
-struct Struct {
-	int *P;
-};
-
-void setstruct(Struct s) {
-	*s.P = 1;
-}
-
-*/
-import "C"
-
-import (
-	"testing"
-	"unsafe"
-)
-
-func test10303(t *testing.T, n int) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("gccgo permits C pointers on the stack")
-	}
-
-	// Run at a few different stack depths just to avoid an unlucky pass
-	// due to variables ending up on different pages.
-	if n > 0 {
-		test10303(t, n-1)
-	}
-	if t.Failed() {
-		return
-	}
-	var x, y, z, v, si C.int
-	var s C.Struct
-	C.setintstar(&x)
-	C.setintptr(&y)
-	C.setvoidptr(unsafe.Pointer(&v))
-	s.P = &si
-	C.setstruct(s)
-
-	if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C int* argument on stack")
-	}
-	if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C intptr argument on stack")
-	}
-	if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C void* argument on stack")
-	}
-	if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
-		t.Error("C struct field pointer on stack")
-	}
-}
diff --git a/misc/cgo/test/issue11925.go b/misc/cgo/test/issue11925.go
deleted file mode 100644
index c5c8a26..0000000
--- a/misc/cgo/test/issue11925.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 11925.  Structs with zero-length trailing fields are now
-// padded by the Go compiler.
-
-package cgotest
-
-/*
-struct a11925 {
-	int i;
-	char a[0];
-	char b[0];
-};
-
-struct b11925 {
-	int i;
-	char a[0];
-	char b[];
-};
-*/
-import "C"
-
-import (
-	"testing"
-	"unsafe"
-)
-
-func test11925(t *testing.T) {
-	if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
-		t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
-	}
-	if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
-		t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
-	}
-}
diff --git a/misc/cgo/test/issue12030.go b/misc/cgo/test/issue12030.go
deleted file mode 100644
index f863c58..0000000
--- a/misc/cgo/test/issue12030.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 12030. sprintf is defined in both ntdll and msvcrt,
-// Normally we want the one in the msvcrt.
-
-package cgotest
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-void issue12030conv(char *buf, double x) {
-	sprintf(buf, "d=%g", x);
-}
-*/
-import "C"
-
-import (
-	"fmt"
-	"testing"
-	"unsafe"
-)
-
-func test12030(t *testing.T) {
-	buf := (*C.char)(C.malloc(256))
-	defer C.free(unsafe.Pointer(buf))
-	for _, f := range []float64{1.0, 2.0, 3.14} {
-		C.issue12030conv(buf, C.double(f))
-		got := C.GoString(buf)
-		if want := fmt.Sprintf("d=%g", f); got != want {
-			t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
-		}
-	}
-}
diff --git a/misc/cgo/test/issue1222.go b/misc/cgo/test/issue1222.go
deleted file mode 100644
index 4868da8..0000000
--- a/misc/cgo/test/issue1222.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains test cases for cgo.
-
-package cgotest
-
-/*
-// issue 1222
-typedef union {
-	long align;
-} xxpthread_mutex_t;
-
-struct ibv_async_event {
-	union {
-		int x;
-	} element;
-};
-
-struct ibv_context {
-	xxpthread_mutex_t mutex;
-};
-*/
-import "C"
-
-type AsyncEvent struct {
-	event C.struct_ibv_async_event
-}
diff --git a/misc/cgo/test/issue1328.go b/misc/cgo/test/issue1328.go
deleted file mode 100644
index 2401c10..0000000
--- a/misc/cgo/test/issue1328.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "testing"
-
-// extern void BackIntoGo(void);
-// void IntoC(void);
-import "C"
-
-//export BackIntoGo
-func BackIntoGo() {
-	x := 1
-
-	for i := 0; i < 10000; i++ {
-		xvariadic(x)
-		if x != 1 {
-			panic("x is not 1?")
-		}
-	}
-}
-
-func xvariadic(x ...interface{}) {
-}
-
-func test1328(t *testing.T) {
-	C.IntoC()
-}
diff --git a/misc/cgo/test/issue13402.go b/misc/cgo/test/issue13402.go
deleted file mode 100644
index 3af24c2..0000000
--- a/misc/cgo/test/issue13402.go
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-
-var _ C.complexfloat
-var _ C.complexdouble
diff --git a/misc/cgo/test/issue13930.go b/misc/cgo/test/issue13930.go
deleted file mode 100644
index c4a08ee..0000000
--- a/misc/cgo/test/issue13930.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 13930.  Test that cgo's multiple-value special form for
-// C function calls works in variable declaration statements.
-
-package cgotest
-
-// #include <stdlib.h>
-import "C"
-
-var _, _ = C.abs(0)
diff --git a/misc/cgo/test/issue14838.go b/misc/cgo/test/issue14838.go
deleted file mode 100644
index c8e1681..0000000
--- a/misc/cgo/test/issue14838.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 14838. add CBytes function
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-int check_cbytes(char *b, size_t l) {
-	int i;
-	for (i = 0; i < l; i++) {
-		if (b[i] != i) {
-			return 0;
-		}
-	}
-	return 1;
-}
-*/
-import "C"
-
-import (
-	"testing"
-	"unsafe"
-)
-
-func test14838(t *testing.T) {
-	data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
-	cData := C.CBytes(data)
-	defer C.free(cData)
-
-	if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
-		t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
-	}
-}
diff --git a/misc/cgo/test/issue1560.go b/misc/cgo/test/issue1560.go
deleted file mode 100644
index 30f6152..0000000
--- a/misc/cgo/test/issue1560.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// mysleep returns the absolute start time in ms.
-long long mysleep(int seconds);
-
-// twoSleep returns the absolute start time of the first sleep
-// in ms.
-long long twoSleep(int);
-*/
-import "C"
-
-import (
-	"testing"
-	"time"
-)
-
-var sleepDone = make(chan int64)
-
-// parallelSleep returns the absolute difference between the start time
-// of the two sleeps.
-func parallelSleep(n int) int64 {
-	t := int64(C.twoSleep(C.int(n))) - <-sleepDone
-	if t < 0 {
-		return -t
-	}
-	return t
-}
-
-//export BackgroundSleep
-func BackgroundSleep(n int32) {
-	go func() {
-		sleepDone <- int64(C.mysleep(C.int(n)))
-	}()
-}
-
-func testParallelSleep(t *testing.T) {
-	sleepSec := 1
-	dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
-	t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
-	// bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
-	// we detect if the start times of those sleeps are > 0.5*sleepSec-second.
-	if dt >= time.Duration(sleepSec)*time.Second/2 {
-		t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
-	}
-}
diff --git a/misc/cgo/test/issue1635.go b/misc/cgo/test/issue1635.go
deleted file mode 100644
index 2589927..0000000
--- a/misc/cgo/test/issue1635.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// Mac OS X's gcc will generate scattered relocation 2/1 for
-// this function on Darwin/386, and 8l couldn't handle it.
-// this example is in issue 1635
-#include <stdio.h>
-void scatter() {
-	void *p = scatter;
-	printf("scatter = %p\n", p);
-}
-
-// Adding this explicit extern declaration makes this a test for
-// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
-// It used to cause a cgo error when building with GCC 6.
-extern int hola;
-
-// this example is in issue 3253
-int hola = 0;
-int testHola() { return hola; }
-*/
-import "C"
-
-import "testing"
-
-func test1635(t *testing.T) {
-	C.scatter()
-	if v := C.hola; v != 0 {
-		t.Fatalf("C.hola is %d, should be 0", v)
-	}
-	if v := C.testHola(); v != 0 {
-		t.Fatalf("C.testHola() is %d, should be 0", v)
-	}
-}
diff --git a/misc/cgo/test/issue17065.go b/misc/cgo/test/issue17065.go
deleted file mode 100644
index ede30bc..0000000
--- a/misc/cgo/test/issue17065.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// Test that C symbols larger than a page play nicely with the race detector.
-// See issue 17065.
-
-int ii[65537];
-*/
-import "C"
-
-import (
-	"runtime"
-	"testing"
-)
-
-var sink C.int
-
-func test17065(t *testing.T) {
-	if runtime.GOOS == "darwin" {
-		t.Skip("broken on darwin; issue 17065")
-	}
-	for i := range C.ii {
-		sink = C.ii[i]
-	}
-}
diff --git a/misc/cgo/test/issue17537.go b/misc/cgo/test/issue17537.go
deleted file mode 100644
index 777104e..0000000
--- a/misc/cgo/test/issue17537.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 17537.  The void* cast introduced by cgo to avoid problems
-// with const/volatile qualifiers breaks C preprocessor macros that
-// emulate functions.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-typedef struct {
-	int i;
-} S17537;
-
-int I17537(S17537 *p);
-
-#define I17537(p) ((p)->i)
-
-// Calling this function used to fail without the cast.
-const int F17537(const char **p) {
-	return **p;
-}
-
-// Calling this function used to trigger an error from the C compiler
-// (issue 18298).
-void F18298(const void *const *p) {
-}
-
-// Test that conversions between typedefs work as they used to.
-typedef const void *T18298_1;
-struct S18298 { int i; };
-typedef const struct S18298 *T18298_2;
-void G18298(T18298_1 t) {
-}
-*/
-import "C"
-
-import "testing"
-
-func test17537(t *testing.T) {
-	v := C.S17537{i: 17537}
-	if got, want := C.I17537(&v), C.int(17537); got != want {
-		t.Errorf("got %d, want %d", got, want)
-	}
-
-	p := (*C.char)(C.malloc(1))
-	*p = 17
-	if got, want := C.F17537(&p), C.int(17); got != want {
-		t.Errorf("got %d, want %d", got, want)
-	}
-
-	C.F18298(nil)
-	var v18298 C.T18298_2
-	C.G18298(C.T18298_1(v18298))
-}
diff --git a/misc/cgo/test/issue18126.go b/misc/cgo/test/issue18126.go
deleted file mode 100644
index ac94a66..0000000
--- a/misc/cgo/test/issue18126.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 18126: cgo check of void function returning errno.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-
-void Issue18126C(void **p) {
-}
-*/
-import "C"
-
-import (
-	"testing"
-)
-
-func test18126(t *testing.T) {
-	p := C.malloc(1)
-	_, err := C.Issue18126C(&p)
-	C.free(p)
-	_ = err
-}
diff --git a/misc/cgo/test/issue18146.go b/misc/cgo/test/issue18146.go
index 0605a24..196d98f 100644
--- a/misc/cgo/test/issue18146.go
+++ b/misc/cgo/test/issue18146.go
@@ -8,8 +8,6 @@
 
 package cgotest
 
-import "C"
-
 import (
 	"bytes"
 	"crypto/md5"
diff --git a/misc/cgo/test/issue18720.go b/misc/cgo/test/issue18720.go
deleted file mode 100644
index 3d64003..0000000
--- a/misc/cgo/test/issue18720.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#define HELLO "hello"
-#define WORLD "world"
-#define HELLO_WORLD HELLO "\000" WORLD
-
-struct foo { char c; };
-#define SIZE_OF(x) sizeof(x)
-#define SIZE_OF_FOO SIZE_OF(struct foo)
-#define VAR1 VAR
-#define VAR var
-int var = 5;
-
-#define ADDR &var
-
-#define CALL fn()
-int fn(void) {
-	return ++var;
-}
-*/
-import "C"
-import "testing"
-
-func test18720(t *testing.T) {
-	if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
-		t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
-	}
-
-	if got, want := C.VAR1, C.int(5); got != want {
-		t.Errorf("C.VAR1 == %v, expected %v", got, want)
-	}
-
-	if got, want := *C.ADDR, C.int(5); got != want {
-		t.Errorf("*C.ADDR == %v, expected %v", got, want)
-	}
-
-	if got, want := C.CALL, C.int(6); got != want {
-		t.Errorf("C.CALL == %v, expected %v", got, want)
-	}
-
-	if got, want := C.CALL, C.int(7); got != want {
-		t.Errorf("C.CALL == %v, expected %v", got, want)
-	}
-
-	// Issue 20125.
-	if got, want := C.SIZE_OF_FOO, 1; got != want {
-		t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
-	}
-}
diff --git a/misc/cgo/test/issue20129.go b/misc/cgo/test/issue20129.go
deleted file mode 100644
index e69e0e1..0000000
--- a/misc/cgo/test/issue20129.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-int issue20129 = 0;
-typedef void issue20129Void;
-issue20129Void issue20129Foo() {
-	issue20129 = 1;
-}
-typedef issue20129Void issue20129Void2;
-issue20129Void2 issue20129Bar() {
-	issue20129 = 2;
-}
-*/
-import "C"
-import "testing"
-
-func test20129(t *testing.T) {
-	if C.issue20129 != 0 {
-		t.Fatal("test is broken")
-	}
-	C.issue20129Foo()
-	if C.issue20129 != 1 {
-		t.Errorf("got %v but expected %v", C.issue20129, 1)
-	}
-	C.issue20129Bar()
-	if C.issue20129 != 2 {
-		t.Errorf("got %v but expected %v", C.issue20129, 2)
-	}
-}
diff --git a/misc/cgo/test/issue20369.go b/misc/cgo/test/issue20369.go
deleted file mode 100644
index 37b4b78..0000000
--- a/misc/cgo/test/issue20369.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#define UINT64_MAX        18446744073709551615ULL
-*/
-import "C"
-import (
-	"math"
-	"testing"
-)
-
-func test20369(t *testing.T) {
-	if C.UINT64_MAX != math.MaxUint64 {
-		t.Fatalf("got %v, want %v", uint64(C.UINT64_MAX), uint64(math.MaxUint64))
-	}
-}
diff --git a/misc/cgo/test/issue20910.go b/misc/cgo/test/issue20910.go
deleted file mode 100644
index 69d7d92..0000000
--- a/misc/cgo/test/issue20910.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-//void callMulti(void);
-import "C"
-
-import "testing"
-
-//export multi
-func multi() (*C.char, C.int) {
-	return C.CString("multi"), 0
-}
-
-func test20910(t *testing.T) {
-	C.callMulti()
-}
diff --git a/misc/cgo/test/issue21668.go b/misc/cgo/test/issue21668.go
deleted file mode 100644
index f15b920..0000000
--- a/misc/cgo/test/issue21668.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Fail to guess the kind of the constant "x".
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-// const int x = 42;
-import "C"
-
-var issue21668_X = C.x
diff --git a/misc/cgo/test/issue21708.go b/misc/cgo/test/issue21708.go
deleted file mode 100644
index d413e3c..0000000
--- a/misc/cgo/test/issue21708.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// #include <stdint.h>
-// #define CAST_TO_INT64 (int64_t)(-1)
-import "C"
-import "testing"
-
-func test21708(t *testing.T) {
-	if got, want := C.CAST_TO_INT64, -1; got != want {
-		t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
-	}
-}
diff --git a/misc/cgo/test/issue21809.go b/misc/cgo/test/issue21809.go
deleted file mode 100644
index a3a6b88..0000000
--- a/misc/cgo/test/issue21809.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Issue 21809.  Compile C `typedef` to go type aliases.
-
-// typedef long MySigned_t;
-// /* tests alias-to-alias */
-// typedef MySigned_t MySigned2_t;
-//
-// long takes_long(long x) { return x * x; }
-// MySigned_t takes_typedef(MySigned_t x) { return x * x; }
-import "C"
-
-import "testing"
-
-func test21809(t *testing.T) {
-	longVar := C.long(3)
-	typedefVar := C.MySigned_t(4)
-	typedefTypedefVar := C.MySigned2_t(5)
-
-	// all three should be considered identical to `long`
-	if ret := C.takes_long(longVar); ret != 9 {
-		t.Errorf("got %v but expected %v", ret, 9)
-	}
-	if ret := C.takes_long(typedefVar); ret != 16 {
-		t.Errorf("got %v but expected %v", ret, 16)
-	}
-	if ret := C.takes_long(typedefTypedefVar); ret != 25 {
-		t.Errorf("got %v but expected %v", ret, 25)
-	}
-
-	// They should also be identical to the typedef'd type
-	if ret := C.takes_typedef(longVar); ret != 9 {
-		t.Errorf("got %v but expected %v", ret, 9)
-	}
-	if ret := C.takes_typedef(typedefVar); ret != 16 {
-		t.Errorf("got %v but expected %v", ret, 16)
-	}
-	if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
-		t.Errorf("got %v but expected %v", ret, 25)
-	}
-}
diff --git a/misc/cgo/test/issue22958.go b/misc/cgo/test/issue22958.go
deleted file mode 100644
index a5f058f..0000000
--- a/misc/cgo/test/issue22958.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test handling of bitfields.
-
-/*
-typedef struct {
-	unsigned long long f8  : 8;
-	unsigned long long f16 : 16;
-	unsigned long long f24 : 24;
-	unsigned long long f32 : 32;
-	unsigned long long f40 : 40;
-	unsigned long long f48 : 48;
-	unsigned long long f56 : 56;
-	unsigned long long f64 : 64;
-} issue22958Type;
-*/
-import "C"
-
-// Nothing to run, just make sure this compiles.
-var Vissue22958 C.issue22958Type
diff --git a/misc/cgo/test/issue23356.go b/misc/cgo/test/issue23356.go
deleted file mode 100644
index 1c39012..0000000
--- a/misc/cgo/test/issue23356.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// int a(void) { return 5; };
-// int r(void) { return 3; };
-import "C"
-import "testing"
-
-func test23356(t *testing.T) {
-	if got, want := C.a(), C.int(5); got != want {
-		t.Errorf("C.a() == %v, expected %v", got, want)
-	}
-	if got, want := C.r(), C.int(3); got != want {
-		t.Errorf("C.r() == %v, expected %v", got, want)
-	}
-}
diff --git a/misc/cgo/test/issue23720.go b/misc/cgo/test/issue23720.go
deleted file mode 100644
index 934fff3..0000000
--- a/misc/cgo/test/issue23720.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Test that we can pass compatible typedefs.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-typedef int *issue23720A;
-
-typedef const int *issue23720B;
-
-void issue23720F(issue23720B a) {}
-*/
-import "C"
-
-func Issue23720F() {
-	var x C.issue23720A
-	C.issue23720F(x)
-}
diff --git a/misc/cgo/test/issue24206.go b/misc/cgo/test/issue24206.go
deleted file mode 100644
index 5fec68e..0000000
--- a/misc/cgo/test/issue24206.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// +build amd64,linux
-
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test that C.GoString uses IndexByte in safe manner.
-
-/*
-#include <sys/mman.h>
-
-// Returns string with null byte at the last valid address
-char* dangerousString1() {
-	int pageSize = 4096;
-	char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
-	mprotect(data + pageSize,pageSize,PROT_NONE);
-	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
-	int i = start;
-	for (; i < pageSize; i++) {
-	data[i] = 'x';
-	}
-	data[pageSize -1 ] = 0;
-	return data+start;
-}
-
-char* dangerousString2() {
-	int pageSize = 4096;
-	char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
-	mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
-	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
-	int i = start;
-	for (; i < 2 * pageSize; i++) {
-	data[i] = 'x';
-	}
-	data[2*pageSize -1 ] = 0;
-	return data+start;
-}
-*/
-import "C"
-
-import (
-	"testing"
-)
-
-func test24206(t *testing.T) {
-	if l := len(C.GoString(C.dangerousString1())); l != 123 {
-		t.Errorf("Incorrect string length - got %d, want 123", l)
-	}
-	if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
-		t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
-	}
-}
diff --git a/misc/cgo/test/issue24206_generic.go b/misc/cgo/test/issue24206_generic.go
deleted file mode 100644
index 27c4d65..0000000
--- a/misc/cgo/test/issue24206_generic.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build !amd64 !linux
-
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "testing"
-
-func test24206(t *testing.T) {
-	t.Skip("Skipping on non-amd64 or non-linux system")
-}
diff --git a/misc/cgo/test/issue2462.go b/misc/cgo/test/issue2462.go
deleted file mode 100644
index febca1e..0000000
--- a/misc/cgo/test/issue2462.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-
-//export exportbyte
-func exportbyte() byte {
-	return 0
-}
-
-//export exportbool
-func exportbool() bool {
-	return false
-}
-
-//export exportrune
-func exportrune() rune {
-	return 0
-}
-
-//export exporterror
-func exporterror() error {
-	return nil
-}
-
-//export exportint
-func exportint() int {
-	return 0
-}
-
-//export exportuint
-func exportuint() uint {
-	return 0
-}
-
-//export exportuintptr
-func exportuintptr() uintptr {
-	return (uintptr)(0)
-}
-
-//export exportint8
-func exportint8() int8 {
-	return 0
-}
-
-//export exportuint8
-func exportuint8() uint8 {
-	return 0
-}
-
-//export exportint16
-func exportint16() int16 {
-	return 0
-}
-
-//export exportuint16
-func exportuint16() uint16 {
-	return 0
-}
-
-//export exportint32
-func exportint32() int32 {
-	return 0
-}
-
-//export exportuint32
-func exportuint32() uint32 {
-	return 0
-}
-
-//export exportint64
-func exportint64() int64 {
-	return 0
-}
-
-//export exportuint64
-func exportuint64() uint64 {
-	return 0
-}
-
-//export exportfloat32
-func exportfloat32() float32 {
-	return 0
-}
-
-//export exportfloat64
-func exportfloat64() float64 {
-	return 0
-}
-
-//export exportcomplex64
-func exportcomplex64() complex64 {
-	return 0
-}
-
-//export exportcomplex128
-func exportcomplex128() complex128 {
-	return 0
-}
diff --git a/misc/cgo/test/issue25143.go b/misc/cgo/test/issue25143.go
deleted file mode 100644
index 607bfe4..0000000
--- a/misc/cgo/test/issue25143.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-import "testing"
-
-func issue25143sum(ns ...C.int) C.int {
-	total := C.int(0)
-	for _, n := range ns {
-		total += n
-	}
-	return total
-}
-
-func test25143(t *testing.T) {
-	if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
-		t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
-	}
-}
diff --git a/misc/cgo/test/issue26066.go b/misc/cgo/test/issue26066.go
deleted file mode 100644
index 21028e7..0000000
--- a/misc/cgo/test/issue26066.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Wrong type of constant with GCC 8 and newer.
-
-package cgotest
-
-// const unsigned long long int issue26066 = (const unsigned long long) -1;
-import "C"
-
-import "testing"
-
-func test26066(t *testing.T) {
-	var i = int64(C.issue26066)
-	if i != -1 {
-		t.Errorf("got %d, want -1", i)
-	}
-}
diff --git a/misc/cgo/test/issue26517.go b/misc/cgo/test/issue26517.go
deleted file mode 100644
index c1bf1c9..0000000
--- a/misc/cgo/test/issue26517.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Introduce two pointer types which are distinct, but have the same
-// base type. Make sure that both of those pointer types get resolved
-// correctly. Before the fix for 26517 if one of these pointer types
-// was resolved before the other one was processed, the second one
-// would never be resolved.
-// Before this issue was fixed this test failed on Windows,
-// where va_list expands to a named char* type.
-
-/*
-#include <stdarg.h>
-typedef va_list TypeOne;
-typedef char *TypeTwo;
-*/
-import "C"
-
-var a C.TypeOne
-var b C.TypeTwo
diff --git a/misc/cgo/test/issue28545.go b/misc/cgo/test/issue28545.go
deleted file mode 100644
index 8419b89..0000000
--- a/misc/cgo/test/issue28545.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Failed to add type conversion for negative constant.
-// Issue 28772: Failed to add type conversion for Go constant set to C constant.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-#include <complex.h>
-
-#define issue28772Constant 1
-
-static void issue28545F(char **p, int n, complex double a) {}
-*/
-import "C"
-
-const issue28772Constant = C.issue28772Constant
-
-func issue28545G(p **C.char) {
-	C.issue28545F(p, -1, (0))
-	C.issue28545F(p, 2+3, complex(1, 1))
-	C.issue28545F(p, issue28772Constant, issue28772Constant2)
-}
diff --git a/misc/cgo/test/issue28772.go b/misc/cgo/test/issue28772.go
deleted file mode 100644
index bed786b..0000000
--- a/misc/cgo/test/issue28772.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Constants didn't work if defined in different source file.
-
-// #define issue28772Constant2 2
-import "C"
-
-const issue28772Constant2 = C.issue28772Constant2
diff --git a/misc/cgo/test/issue28896.go b/misc/cgo/test/issue28896.go
deleted file mode 100644
index 8796040..0000000
--- a/misc/cgo/test/issue28896.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo was incorrectly adding padding after a packed struct.
-
-package cgotest
-
-/*
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-typedef struct {
-	void *f1;
-	uint32_t f2;
-} __attribute__((__packed__)) innerPacked;
-
-typedef struct {
-	innerPacked g1;
-	uint64_t g2;
-} outerPacked;
-
-typedef struct {
-	void *f1;
-	uint32_t f2;
-} innerUnpacked;
-
-typedef struct {
-	innerUnpacked g1;
-	uint64_t g2;
-} outerUnpacked;
-
-size_t offset(int x) {
-	switch (x) {
-	case 0:
-		return offsetof(innerPacked, f2);
-	case 1:
-		return offsetof(outerPacked, g2);
-	case 2:
-		return offsetof(innerUnpacked, f2);
-	case 3:
-		return offsetof(outerUnpacked, g2);
-	default:
-		abort();
-	}
-}
-*/
-import "C"
-
-import (
-	"testing"
-	"unsafe"
-)
-
-func offset(i int) uintptr {
-	var pi C.innerPacked
-	var po C.outerPacked
-	var ui C.innerUnpacked
-	var uo C.outerUnpacked
-	switch i {
-	case 0:
-		return unsafe.Offsetof(pi.f2)
-	case 1:
-		return unsafe.Offsetof(po.g2)
-	case 2:
-		return unsafe.Offsetof(ui.f2)
-	case 3:
-		return unsafe.Offsetof(uo.g2)
-	default:
-		panic("can't happen")
-	}
-}
-
-func test28896(t *testing.T) {
-	for i := 0; i < 4; i++ {
-		c := uintptr(C.offset(C.int(i)))
-		g := offset(i)
-		if c != g {
-			t.Errorf("%d: C: %d != Go %d", i, c, g)
-		}
-	}
-}
diff --git a/misc/cgo/test/issue29383.go b/misc/cgo/test/issue29383.go
deleted file mode 100644
index 462c9a3..0000000
--- a/misc/cgo/test/issue29383.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo's /*line*/ comments failed when inserted after '/',
-// because the result looked like a "//" comment.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include <stddef.h>
-import "C"
-
-func Issue29383(n, size uint) int {
-	if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
-		return 0
-	}
-	return 0
-}
diff --git a/misc/cgo/test/issue29748.go b/misc/cgo/test/issue29748.go
deleted file mode 100644
index 8229b3b..0000000
--- a/misc/cgo/test/issue29748.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Error handling a struct initializer that requires pointer checking.
-// Compilation test only, nothing to run.
-
-package cgotest
-
-// typedef struct { char **p; } S29748;
-// static int f29748(S29748 *p) { return 0; }
-import "C"
-
-var Vissue29748 = C.f29748(&C.S29748{
-	nil,
-})
-
-func Fissue299748() {
-	C.f29748(&C.S29748{
-		nil,
-	})
-}
diff --git a/misc/cgo/test/issue29781.go b/misc/cgo/test/issue29781.go
deleted file mode 100644
index c80919d..0000000
--- a/misc/cgo/test/issue29781.go
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Error with newline inserted into constant expression.
-// Compilation test only, nothing to run.
-
-package cgotest
-
-// static void issue29781F(char **p, int n) {}
-// #define ISSUE29781C 0
-import "C"
-
-var issue29781X struct{ X int }
-
-func issue29781F(...int) int { return 0 }
-
-func issue29781G() {
-	var p *C.char
-	C.issue29781F(&p, C.ISSUE29781C+1)
-	C.issue29781F(nil, (C.int)(
-		0))
-	C.issue29781F(&p, (C.int)(0))
-	C.issue29781F(&p, (C.int)(
-		0))
-	C.issue29781F(&p, (C.int)(issue29781X.
-		X))
-}
diff --git a/misc/cgo/test/issue29878.go b/misc/cgo/test/issue29878.go
deleted file mode 100644
index c1aeaf9..0000000
--- a/misc/cgo/test/issue29878.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// #include <stdint.h>
-// uint64_t issue29878exported(int8_t);  // prototype must match
-// int16_t issue29878function(uint32_t arg) { return issue29878exported(arg); }
-import "C"
-
-import "testing"
-
-func test29878(t *testing.T) {
-	const arg uint32 = 123                    // fits into all integer types
-	var ret int16 = C.issue29878function(arg) // no conversions needed
-	if int64(ret) != int64(arg) {
-		t.Errorf("return value unexpected: got %d, want %d", ret, arg)
-	}
-}
diff --git a/misc/cgo/test/issue30065.go b/misc/cgo/test/issue30065.go
deleted file mode 100644
index 396d437..0000000
--- a/misc/cgo/test/issue30065.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Don't make a private copy of an array when taking the address of an
-// element.
-
-package cgotest
-
-// #include <string.h>
-import "C"
-
-import (
-	"testing"
-	"unsafe"
-)
-
-func test30065(t *testing.T) {
-	var a [256]byte
-	b := []byte("a")
-	C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
-	if a[0] != 'a' {
-		t.Errorf("&a failed: got %c, want %c", a[0], 'a')
-	}
-
-	b = []byte("b")
-	C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
-	if a[0] != 'b' {
-		t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
-	}
-
-	d := make([]byte, 256)
-	b = []byte("c")
-	C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
-	if d[0] != 'c' {
-		t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
-	}
-}
diff --git a/misc/cgo/test/issue3250.go b/misc/cgo/test/issue3250.go
deleted file mode 100644
index f85c16b..0000000
--- a/misc/cgo/test/issue3250.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <signal.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-static void *thread(void *p) {
-	const int M = 100;
-	int i;
-	(void)p;
-	for (i = 0; i < M; i++) {
-		pthread_kill(pthread_self(), SIGCHLD);
-		usleep(rand() % 20 + 5);
-	}
-	return NULL;
-}
-void testSendSIG() {
-	const int N = 20;
-	int i;
-	pthread_t tid[N];
-	for (i = 0; i < N; i++) {
-		usleep(rand() % 200 + 100);
-		pthread_create(&tid[i], 0, thread, NULL);
-	}
-	for (i = 0; i < N; i++)
-		pthread_join(tid[i], 0);
-}
-*/
-import "C"
-
-import (
-	"os"
-	"os/signal"
-	"syscall"
-	"testing"
-	"time"
-)
-
-func test3250(t *testing.T) {
-	t.Skip("skipped, see golang.org/issue/5885")
-	const (
-		thres = 1
-		sig   = syscall.SIGCHLD
-	)
-	type result struct {
-		n   int
-		sig os.Signal
-	}
-	var (
-		sigCh     = make(chan os.Signal, 10)
-		waitStart = make(chan struct{})
-		waitDone  = make(chan result)
-	)
-
-	signal.Notify(sigCh, sig)
-
-	go func() {
-		n := 0
-		alarm := time.After(time.Second * 3)
-		for {
-			select {
-			case <-waitStart:
-				waitStart = nil
-			case v := <-sigCh:
-				n++
-				if v != sig || n > thres {
-					waitDone <- result{n, v}
-					return
-				}
-			case <-alarm:
-				waitDone <- result{n, sig}
-				return
-			}
-		}
-	}()
-
-	waitStart <- struct{}{}
-	C.testSendSIG()
-	r := <-waitDone
-	if r.sig != sig {
-		t.Fatalf("received signal %v, but want %v", r.sig, sig)
-	}
-	t.Logf("got %d signals\n", r.n)
-	if r.n <= thres {
-		t.Fatalf("expected more than %d", thres)
-	}
-}
diff --git a/misc/cgo/test/issue3250w.go b/misc/cgo/test/issue3250w.go
deleted file mode 100644
index c2193aa..0000000
--- a/misc/cgo/test/issue3250w.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test3250(t *testing.T) {}
diff --git a/misc/cgo/test/issue3261.go b/misc/cgo/test/issue3261.go
deleted file mode 100644
index 7137569..0000000
--- a/misc/cgo/test/issue3261.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// libgcc on ARM might be compiled as thumb code, but our 5l
-// can't handle that, so we have to disable this test on arm.
-#ifdef __ARMEL__
-#include <stdio.h>
-int vabs(int x) {
-	puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
-	return (x < 0) ? -x : x;
-}
-#elif defined(__arm64__) && defined(__clang__)
-#include <stdio.h>
-int vabs(int x) {
-	puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
-	return (x < 0) ? -x : x;
-}
-#else
-int __absvsi2(int); // dummy prototype for libgcc function
-// we shouldn't name the function abs, as gcc might use
-// the builtin one.
-int vabs(int x) { return __absvsi2(x); }
-#endif
-*/
-import "C"
-
-import "testing"
-
-func testLibgcc(t *testing.T) {
-	var table = []struct {
-		in, out C.int
-	}{
-		{0, 0},
-		{1, 1},
-		{-42, 42},
-		{1000300, 1000300},
-		{1 - 1<<31, 1<<31 - 1},
-	}
-	for _, v := range table {
-		if o := C.vabs(v.in); o != v.out {
-			t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
-			return
-		}
-	}
-}
diff --git a/misc/cgo/test/issue3729.go b/misc/cgo/test/issue3729.go
deleted file mode 100644
index 947b90a..0000000
--- a/misc/cgo/test/issue3729.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 3729:	cmd/cgo: access errno from void C function
-// void f(void) returns [0]byte, error in Go world.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <errno.h>
-
-void g(void) {
-	errno = E2BIG;
-}
-
-// try to pass some non-trivial arguments to function g2
-const char _expA = 0x42;
-const float _expB = 3.14159;
-const short _expC = 0x55aa;
-const int _expD = 0xdeadbeef;
-void g2(int x, char a, float b, short c, int d) {
-	if (a == _expA && b == _expB && c == _expC && d == _expD)
-		errno = x;
-	else
-		errno = -1;
-}
-*/
-import "C"
-
-import (
-	"syscall"
-	"testing"
-)
-
-func test3729(t *testing.T) {
-	_, e := C.g()
-	if e != syscall.E2BIG {
-		t.Errorf("got %q, expect %q", e, syscall.E2BIG)
-	}
-	_, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
-	if e != syscall.EINVAL {
-		t.Errorf("got %q, expect %q", e, syscall.EINVAL)
-	}
-}
diff --git a/misc/cgo/test/issue3729w.go b/misc/cgo/test/issue3729w.go
deleted file mode 100644
index 69296b5..0000000
--- a/misc/cgo/test/issue3729w.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 3729:	cmd/cgo: access errno from void C function
-// void f(void) returns [0]byte, error in Go world.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test3729(t *testing.T) {
-	t.Log("skip errno test on Windows")
-}
diff --git a/misc/cgo/test/issue3741.go b/misc/cgo/test/issue3741.go
deleted file mode 100644
index 314038c..0000000
--- a/misc/cgo/test/issue3741.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "C"
-
-//export exportSliceIn
-func exportSliceIn(s []byte) bool {
-	return len(s) == cap(s)
-}
-
-//export exportSliceOut
-func exportSliceOut() []byte {
-	return []byte{1}
-}
-
-//export exportSliceInOut
-func exportSliceInOut(s []byte) []byte {
-	return s
-}
diff --git a/misc/cgo/test/issue3775.go b/misc/cgo/test/issue3775.go
deleted file mode 100644
index 5aca760..0000000
--- a/misc/cgo/test/issue3775.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// +build !android
-
-package cgotest
-
-/*
-void lockOSThreadCallback(void);
-inline static void lockOSThreadC(void)
-{
-        lockOSThreadCallback();
-}
-int usleep(unsigned usec);
-*/
-import "C"
-
-import (
-	"runtime"
-	"testing"
-)
-
-func init() {
-	// Same as test3775 but run during init so that
-	// there are two levels of internal runtime lock
-	// (1 for init, 1 for cgo).
-	// This would have been broken by CL 11663043.
-	C.lockOSThreadC()
-}
-
-func test3775(t *testing.T) {
-	// Used to panic because of the UnlockOSThread below.
-	C.lockOSThreadC()
-}
-
-//export lockOSThreadCallback
-func lockOSThreadCallback() {
-	runtime.LockOSThread()
-	runtime.UnlockOSThread()
-	go C.usleep(10000)
-	runtime.Gosched()
-}
diff --git a/misc/cgo/test/issue3945.go b/misc/cgo/test/issue3945.go
deleted file mode 100644
index 2f9fe23..0000000
--- a/misc/cgo/test/issue3945.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test that cgo reserves enough stack space during cgo call.
-// See https://golang.org/issue/3945 for details.
-
-// #include <stdio.h>
-//
-// void say() {
-//    printf("%s from C\n", "hello");
-// }
-//
-import "C"
-
-import "testing"
-
-func testPrintf(t *testing.T) {
-	C.say()
-}
diff --git a/misc/cgo/test/issue4054a.go b/misc/cgo/test/issue4054a.go
deleted file mode 100644
index 2abdac5..0000000
--- a/misc/cgo/test/issue4054a.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-typedef enum {
-	A = 0,
-	B,
-	C,
-	D,
-	E,
-	F,
-	G,
-	H,
-	I,
-	J,
-} issue4054a;
-*/
-import "C"
-
-var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
diff --git a/misc/cgo/test/issue4054b.go b/misc/cgo/test/issue4054b.go
deleted file mode 100644
index 048964c..0000000
--- a/misc/cgo/test/issue4054b.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-typedef enum {
-	A = 0,
-	B,
-	C,
-	D,
-	E,
-	F,
-	G,
-	H,
-	I,
-	J,
-} issue4054b;
-*/
-import "C"
-
-var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
diff --git a/misc/cgo/test/issue4339.go b/misc/cgo/test/issue4339.go
deleted file mode 100644
index 3715fde5..0000000
--- a/misc/cgo/test/issue4339.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-// We've historically permitted #include <>, so test it here.  Issue 29333.
-#include <issue4339.h>
-*/
-import "C"
-
-import "testing"
-
-func test4339(t *testing.T) {
-	C.handle4339(&C.exported4339)
-}
diff --git a/misc/cgo/test/issue4417.go b/misc/cgo/test/issue4417.go
deleted file mode 100644
index 9b18287..0000000
--- a/misc/cgo/test/issue4417.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 4417:	cmd/cgo: bool alignment/padding issue.
-// bool alignment is wrong and causing wrong arguments when calling functions.
-//
-
-package cgotest
-
-/*
-#include <stdbool.h>
-
-static int c_bool(bool a, bool b, int c, bool d, bool e)  {
-   return c;
-}
-*/
-import "C"
-import "testing"
-
-func testBoolAlign(t *testing.T) {
-	b := C.c_bool(true, true, 10, true, false)
-	if b != 10 {
-		t.Fatalf("found %d expected 10\n", b)
-	}
-	b = C.c_bool(true, true, 5, true, true)
-	if b != 5 {
-		t.Fatalf("found %d expected 5\n", b)
-	}
-	b = C.c_bool(true, true, 3, true, false)
-	if b != 3 {
-		t.Fatalf("found %d expected 3\n", b)
-	}
-	b = C.c_bool(false, false, 1, true, false)
-	if b != 1 {
-		t.Fatalf("found %d expected 1\n", b)
-	}
-	b = C.c_bool(false, true, 200, true, false)
-	if b != 200 {
-		t.Fatalf("found %d expected 200\n", b)
-	}
-}
diff --git a/misc/cgo/test/issue4857.go b/misc/cgo/test/issue4857.go
deleted file mode 100644
index b18979b..0000000
--- a/misc/cgo/test/issue4857.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#cgo CFLAGS: -Werror
-const struct { int a; } *issue4857() { return (void *)0; }
-*/
-import "C"
-
-func test4857() {
-	_ = C.issue4857()
-}
diff --git a/misc/cgo/test/issue5227.go b/misc/cgo/test/issue5227.go
deleted file mode 100644
index 53c3bf1..0000000
--- a/misc/cgo/test/issue5227.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 5227: linker incorrectly treats common symbols and
-// leaves them undefined.
-
-package cgotest
-
-/*
-typedef struct {
-        int Count;
-} Fontinfo;
-
-Fontinfo SansTypeface;
-
-extern void init();
-
-Fontinfo loadfont() {
-        Fontinfo f = {0};
-        return f;
-}
-
-void init() {
-        SansTypeface = loadfont();
-}
-*/
-import "C"
-
-import "testing"
-
-func test5227(t *testing.T) {
-	C.init()
-}
-
-func selectfont() C.Fontinfo {
-	return C.SansTypeface
-}
diff --git a/misc/cgo/test/issue5242.go b/misc/cgo/test/issue5242.go
deleted file mode 100644
index c81cd40..0000000
--- a/misc/cgo/test/issue5242.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 5242.  Cgo incorrectly computed the alignment of structs
-// with no Go accessible fields as 0, and then panicked on
-// modulo-by-zero computations.
-
-package cgotest
-
-/*
-typedef struct {
-} foo;
-
-typedef struct {
-	int x : 1;
-} bar;
-
-int issue5242(foo f, bar b) {
-	return 5242;
-}
-*/
-import "C"
-
-import "testing"
-
-func test5242(t *testing.T) {
-	if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
-		t.Errorf("got %v", got)
-	}
-}
diff --git a/misc/cgo/test/issue5337.go b/misc/cgo/test/issue5337.go
deleted file mode 100644
index 9041d95..0000000
--- a/misc/cgo/test/issue5337.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !windows
-
-package cgotest
-
-/*
-#include <signal.h>
-#include <pthread.h>
-
-static void *thread1(void *p) {
-	(void)p;
-	pthread_kill(pthread_self(), SIGPROF);
-	return NULL;
-}
-void test5337() {
-	pthread_t tid;
-	pthread_create(&tid, 0, thread1, NULL);
-	pthread_join(tid, 0);
-}
-*/
-import "C"
-
-import "testing"
-
-// Verify that we can withstand SIGPROF received on foreign threads
-func test5337(t *testing.T) {
-	C.test5337()
-}
diff --git a/misc/cgo/test/issue5337w.go b/misc/cgo/test/issue5337w.go
deleted file mode 100644
index 7b46757..0000000
--- a/misc/cgo/test/issue5337w.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build windows
-
-package cgotest
-
-import "testing"
-
-func test5337(t *testing.T) {}
diff --git a/misc/cgo/test/issue5548.go b/misc/cgo/test/issue5548.go
deleted file mode 100644
index 0710da7..0000000
--- a/misc/cgo/test/issue5548.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import "testing"
-
-/*
-extern int issue5548_in_c(void);
-*/
-import "C"
-
-//export issue5548FromC
-func issue5548FromC(s string, i int) int {
-	if len(s) == 4 && s == "test" && i == 42 {
-		return 12345
-	}
-	println("got", len(s), i)
-	return 9876
-}
-
-func test5548(t *testing.T) {
-	if x := C.issue5548_in_c(); x != 12345 {
-		t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
-	}
-}
diff --git a/misc/cgo/test/issue5603.go b/misc/cgo/test/issue5603.go
deleted file mode 100644
index ab84339..0000000
--- a/misc/cgo/test/issue5603.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-const long long issue5603exp = 0x12345678;
-long long issue5603foo0() { return issue5603exp; }
-long long issue5603foo1(void *p) { return issue5603exp; }
-long long issue5603foo2(void *p, void *q) { return issue5603exp; }
-long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
-long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
-*/
-import "C"
-
-import "testing"
-
-func test5603(t *testing.T) {
-	var x [5]int64
-	exp := int64(C.issue5603exp)
-	x[0] = int64(C.issue5603foo0())
-	x[1] = int64(C.issue5603foo1(nil))
-	x[2] = int64(C.issue5603foo2(nil, nil))
-	x[3] = int64(C.issue5603foo3(nil, nil, nil))
-	x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
-	for i, v := range x {
-		if v != exp {
-			t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
-		}
-	}
-}
diff --git a/misc/cgo/test/issue5740.go b/misc/cgo/test/issue5740.go
deleted file mode 100644
index 059e316..0000000
--- a/misc/cgo/test/issue5740.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// int test5740a(void), test5740b(void);
-import "C"
-import "testing"
-
-func test5740(t *testing.T) {
-	if v := C.test5740a() + C.test5740b(); v != 5 {
-		t.Errorf("expected 5, got %v", v)
-	}
-}
diff --git a/misc/cgo/test/issue5986.go b/misc/cgo/test/issue5986.go
deleted file mode 100644
index 9be1614..0000000
--- a/misc/cgo/test/issue5986.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#cgo LDFLAGS: -lm
-#include <stdio.h>
-#include <math.h>
-
-static void output5986()
-{
-    int current_row = 0, row_count = 0;
-    double sum_squares = 0;
-    double d;
-    do {
-        if (current_row == 10) {
-            current_row = 0;
-        }
-        ++row_count;
-    }
-    while (current_row++ != 1);
-    d =  sqrt(sum_squares / row_count);
-    printf("sqrt is: %g\n", d);
-}
-*/
-import "C"
-import "testing"
-
-func test5986(t *testing.T) {
-	C.output5986()
-}
diff --git a/misc/cgo/test/issue6128.go b/misc/cgo/test/issue6128.go
deleted file mode 100644
index 9832d79..0000000
--- a/misc/cgo/test/issue6128.go
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test handling of #defined names in clang.
-// golang.org/issue/6128.
-
-/*
-// NOTE: Must use hex, or else a shortcut for decimals
-// in cgo avoids trying to pass this to clang.
-#define X 0x1
-*/
-import "C"
-
-func test6128() {
-	// nothing to run, just make sure this compiles.
-	_ = C.X
-}
diff --git a/misc/cgo/test/issue6390.go b/misc/cgo/test/issue6390.go
deleted file mode 100644
index 5642899..0000000
--- a/misc/cgo/test/issue6390.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// #include <stdlib.h>
-import "C"
-
-import "testing"
-
-func test6390(t *testing.T) {
-	p1 := C.malloc(1024)
-	if p1 == nil {
-		t.Fatalf("C.malloc(1024) returned nil")
-	}
-	p2 := C.malloc(0)
-	if p2 == nil {
-		t.Fatalf("C.malloc(0) returned nil")
-	}
-	C.free(p1)
-	C.free(p2)
-}
diff --git a/misc/cgo/test/issue6472.go b/misc/cgo/test/issue6472.go
deleted file mode 100644
index d416a05..0000000
--- a/misc/cgo/test/issue6472.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-typedef struct
-{
-        struct
-        {
-            int x;
-        } y[16];
-} z;
-*/
-import "C"
-
-func test6472() {
-	// nothing to run, just make sure this compiles
-	s := new(C.z)
-	println(s.y[0].x)
-}
diff --git a/misc/cgo/test/issue6506.go b/misc/cgo/test/issue6506.go
deleted file mode 100644
index c54b54b..0000000
--- a/misc/cgo/test/issue6506.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-// Test handling of size_t in the face of incorrect clang debug information.
-// golang.org/issue/6506.
-
-/*
-#include <stdlib.h>
-#include <string.h>
-*/
-import "C"
-
-func test6506() {
-	// nothing to run, just make sure this compiles
-	var x C.size_t
-
-	C.calloc(x, x)
-	C.malloc(x)
-	C.realloc(nil, x)
-	C.memcpy(nil, nil, x)
-	C.memcmp(nil, nil, x)
-	C.memmove(nil, nil, x)
-	C.strncpy(nil, nil, x)
-	C.strncmp(nil, nil, x)
-	C.strncat(nil, nil, x)
-	x = C.strxfrm(nil, nil, x)
-	C.memchr(nil, 0, x)
-	x = C.strcspn(nil, nil)
-	x = C.strspn(nil, nil)
-	C.memset(nil, 0, x)
-	x = C.strlen(nil)
-	_ = x
-}
diff --git a/misc/cgo/test/issue6612.go b/misc/cgo/test/issue6612.go
deleted file mode 100644
index 15a12fa..0000000
--- a/misc/cgo/test/issue6612.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// golang.org/issue/6612
-// Test new scheme for deciding whether C.name is an expression, type, constant.
-// Clang silences some warnings when the name is a #defined macro, so test those too
-// (even though we now use errors exclusively, not warnings).
-
-package cgotest
-
-/*
-void myfunc(void) {}
-int myvar = 5;
-const char *mytext = "abcdef";
-typedef int mytype;
-enum {
-	myenum = 1234,
-};
-
-#define myfunc_def myfunc
-#define myvar_def myvar
-#define mytext_def mytext
-#define mytype_def mytype
-#define myenum_def myenum
-#define myint_def 12345
-#define myfloat_def 1.5
-#define mystring_def "hello"
-*/
-import "C"
-
-import "testing"
-
-func testNaming(t *testing.T) {
-	C.myfunc()
-	C.myfunc_def()
-	if v := C.myvar; v != 5 {
-		t.Errorf("C.myvar = %d, want 5", v)
-	}
-	if v := C.myvar_def; v != 5 {
-		t.Errorf("C.myvar_def = %d, want 5", v)
-	}
-	if s := C.GoString(C.mytext); s != "abcdef" {
-		t.Errorf("C.mytext = %q, want %q", s, "abcdef")
-	}
-	if s := C.GoString(C.mytext_def); s != "abcdef" {
-		t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
-	}
-	if c := C.myenum; c != 1234 {
-		t.Errorf("C.myenum = %v, want 1234", c)
-	}
-	if c := C.myenum_def; c != 1234 {
-		t.Errorf("C.myenum_def = %v, want 1234", c)
-	}
-	{
-		const c = C.myenum
-		if c != 1234 {
-			t.Errorf("C.myenum as const = %v, want 1234", c)
-		}
-	}
-	{
-		const c = C.myenum_def
-		if c != 1234 {
-			t.Errorf("C.myenum as const = %v, want 1234", c)
-		}
-	}
-	if c := C.myint_def; c != 12345 {
-		t.Errorf("C.myint_def = %v, want 12345", c)
-	}
-	{
-		const c = C.myint_def
-		if c != 12345 {
-			t.Errorf("C.myint as const = %v, want 12345", c)
-		}
-	}
-
-	if c := C.myfloat_def; c != 1.5 {
-		t.Errorf("C.myint_def = %v, want 1.5", c)
-	}
-	{
-		const c = C.myfloat_def
-		if c != 1.5 {
-			t.Errorf("C.myint as const = %v, want 1.5", c)
-		}
-	}
-
-	if s := C.mystring_def; s != "hello" {
-		t.Errorf("C.mystring_def = %q, want %q", s, "hello")
-	}
-}
diff --git a/misc/cgo/test/issue6833.go b/misc/cgo/test/issue6833.go
deleted file mode 100644
index de60dbf..0000000
--- a/misc/cgo/test/issue6833.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-extern unsigned long long issue6833Func(unsigned int, unsigned long long);
-*/
-import "C"
-
-import "testing"
-
-//export GoIssue6833Func
-func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
-	return aui64 + uint64(aui)
-}
-
-func test6833(t *testing.T) {
-	ui := 7
-	ull := uint64(0x4000300020001000)
-	v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
-	exp := uint64(ui) + ull
-	if v != exp {
-		t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
-	}
-}
diff --git a/misc/cgo/test/issue6907.go b/misc/cgo/test/issue6907.go
deleted file mode 100644
index 00495ab..0000000
--- a/misc/cgo/test/issue6907.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdlib.h>
-#include <string.h>
-
-char* Issue6907CopyString(_GoString_ s) {
-	size_t n;
-	const char *p;
-	char *r;
-
-	n = _GoStringLen(s);
-	p = _GoStringPtr(s);
-	r = malloc(n + 1);
-	memmove(r, p, n);
-	r[n] = '\0';
-	return r;
-}
-*/
-import "C"
-
-import "testing"
-
-func test6907(t *testing.T) {
-	want := "yarn"
-	if got := C.GoString(C.Issue6907CopyString(want)); got != want {
-		t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
-	}
-}
diff --git a/misc/cgo/test/issue6907export.go b/misc/cgo/test/issue6907export.go
deleted file mode 100644
index d41899e..0000000
--- a/misc/cgo/test/issue6907export.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-extern int CheckIssue6907C(_GoString_);
-*/
-import "C"
-
-import (
-	"testing"
-)
-
-const CString = "C string"
-
-//export CheckIssue6907Go
-func CheckIssue6907Go(s string) C.int {
-	if s == CString {
-		return 1
-	}
-	return 0
-}
-
-func test6907Go(t *testing.T) {
-	if got := C.CheckIssue6907C(CString); got != 1 {
-		t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
-	}
-}
diff --git a/misc/cgo/test/issue7560.go b/misc/cgo/test/issue7560.go
deleted file mode 100644
index f36d8a1..0000000
--- a/misc/cgo/test/issue7560.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-#include <stdint.h>
-
-typedef struct {
-	char x;
-	long y;
-} __attribute__((__packed__)) misaligned;
-
-int
-offset7560(void)
-{
-	return (uintptr_t)&((misaligned*)0)->y;
-}
-*/
-import "C"
-
-import (
-	"reflect"
-	"testing"
-)
-
-func test7560(t *testing.T) {
-	// some mingw don't implement __packed__ correctly.
-	if C.offset7560() != 1 {
-		t.Skip("C compiler did not pack struct")
-	}
-
-	// C.misaligned should have x but then a padding field to get to the end of the struct.
-	// There should not be a field named 'y'.
-	var v C.misaligned
-	rt := reflect.TypeOf(&v).Elem()
-	if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
-		t.Errorf("unexpected fields in C.misaligned:\n")
-		for i := 0; i < rt.NumField(); i++ {
-			t.Logf("%+v\n", rt.Field(i))
-		}
-	}
-}
diff --git a/misc/cgo/test/issue7665.go b/misc/cgo/test/issue7665.go
deleted file mode 100644
index ce03458..0000000
--- a/misc/cgo/test/issue7665.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-import (
-	"testing"
-	"unsafe"
-)
-
-// extern void f7665(void);
-import "C"
-
-//export f7665
-func f7665() {}
-
-var bad7665 unsafe.Pointer = C.f7665
-var good7665 uintptr = uintptr(C.f7665)
-
-func test7665(t *testing.T) {
-	if bad7665 == nil || uintptr(bad7665) != good7665 {
-		t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
-	}
-}
diff --git a/misc/cgo/test/issue7786.go b/misc/cgo/test/issue7786.go
deleted file mode 100644
index 1344e9e..0000000
--- a/misc/cgo/test/issue7786.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 7786. No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
-
-package cgotest
-
-// struct test7786;
-// typedef struct test7786 typedef_test7786;
-// void f7786(struct test7786 *ctx) {}
-// void g7786(typedef_test7786 *ctx) {}
-//
-// typedef struct body7786 typedef_body7786;
-// struct body7786 { int x; };
-// void b7786(struct body7786 *ctx) {}
-// void c7786(typedef_body7786 *ctx) {}
-//
-// typedef union union7786 typedef_union7786;
-// void u7786(union union7786 *ctx) {}
-// void v7786(typedef_union7786 *ctx) {}
-import "C"
-
-func f() {
-	var x1 *C.typedef_test7786
-	var x2 *C.struct_test7786
-	x1 = x2
-	x2 = x1
-	C.f7786(x1)
-	C.f7786(x2)
-	C.g7786(x1)
-	C.g7786(x2)
-
-	var b1 *C.typedef_body7786
-	var b2 *C.struct_body7786
-	b1 = b2
-	b2 = b1
-	C.b7786(b1)
-	C.b7786(b2)
-	C.c7786(b1)
-	C.c7786(b2)
-
-	var u1 *C.typedef_union7786
-	var u2 *C.union_union7786
-	u1 = u2
-	u2 = u1
-	C.u7786(u1)
-	C.u7786(u2)
-	C.v7786(u1)
-	C.v7786(u2)
-}
diff --git a/misc/cgo/test/issue7978.go b/misc/cgo/test/issue7978.go
deleted file mode 100644
index b057e3e..0000000
--- a/misc/cgo/test/issue7978.go
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 7978.  Stack tracing didn't work during cgo code after calling a Go
-// callback.  Make sure GC works and the stack trace is correct.
-
-package cgotest
-
-/*
-#include <stdint.h>
-
-void issue7978cb(void);
-
-#if defined(__APPLE__) && defined(__arm__)
-// on Darwin/ARM, libSystem doesn't provide implementation of the __sync_fetch_and_add
-// primitive, and although gcc supports it, it doesn't inline its definition.
-// Clang could inline its definition, so we require clang on Darwin/ARM.
-#if defined(__clang__)
-#define HAS_SYNC_FETCH_AND_ADD 1
-#else
-#define HAS_SYNC_FETCH_AND_ADD 0
-#endif
-#else
-#define HAS_SYNC_FETCH_AND_ADD 1
-#endif
-
-// use ugly atomic variable sync since that doesn't require calling back into
-// Go code or OS dependencies
-static void issue7978c(uint32_t *sync) {
-#if HAS_SYNC_FETCH_AND_ADD
-	while(__sync_fetch_and_add(sync, 0) != 0)
-		;
-	__sync_fetch_and_add(sync, 1);
-	while(__sync_fetch_and_add(sync, 0) != 2)
-		;
-	issue7978cb();
-	__sync_fetch_and_add(sync, 1);
-	while(__sync_fetch_and_add(sync, 0) != 6)
-		;
-#endif
-}
-*/
-import "C"
-
-import (
-	"runtime"
-	"runtime/debug"
-	"strings"
-	"sync/atomic"
-	"testing"
-)
-
-var issue7978sync uint32
-
-func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
-	runtime.GC()
-	buf := make([]byte, 65536)
-	trace := string(buf[:runtime.Stack(buf, true)])
-	for _, goroutine := range strings.Split(trace, "\n\n") {
-		if strings.Contains(goroutine, "test.issue7978go") {
-			trace := strings.Split(goroutine, "\n")
-			// look for the expected function in the stack
-			for i := 0; i < depth; i++ {
-				if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
-					t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
-					return
-				}
-				if strings.Contains(trace[1+2*i], wantFunc) {
-					return
-				}
-			}
-			t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
-			return
-		}
-	}
-	t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
-}
-
-func issue7978wait(store uint32, wait uint32) {
-	if store != 0 {
-		atomic.StoreUint32(&issue7978sync, store)
-	}
-	for atomic.LoadUint32(&issue7978sync) != wait {
-		runtime.Gosched()
-	}
-}
-
-//export issue7978cb
-func issue7978cb() {
-	// Force a stack growth from the callback to put extra
-	// pressure on the runtime. See issue #17785.
-	growStack(64)
-	issue7978wait(3, 4)
-}
-
-func growStack(n int) int {
-	var buf [128]int
-	if n == 0 {
-		return 0
-	}
-	return buf[growStack(n-1)]
-}
-
-func issue7978go() {
-	C.issue7978c((*C.uint32_t)(&issue7978sync))
-	issue7978wait(7, 8)
-}
-
-func test7978(t *testing.T) {
-	if runtime.Compiler == "gccgo" {
-		t.Skip("gccgo can not do stack traces of C code")
-	}
-	if C.HAS_SYNC_FETCH_AND_ADD == 0 {
-		t.Skip("clang required for __sync_fetch_and_add support on darwin/arm")
-	}
-	debug.SetTraceback("2")
-	issue7978sync = 0
-	go issue7978go()
-	// test in c code, before callback
-	issue7978wait(0, 1)
-	issue7978check(t, "_Cfunc_issue7978c(", "", 1)
-	// test in go code, during callback
-	issue7978wait(2, 3)
-	issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
-	// test in c code, after callback
-	issue7978wait(4, 5)
-	issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
-	// test in go code, after return from cgo
-	issue7978wait(6, 7)
-	issue7978check(t, "test.issue7978go(", "", 3)
-	atomic.StoreUint32(&issue7978sync, 8)
-}
diff --git a/misc/cgo/test/issue8092.go b/misc/cgo/test/issue8092.go
deleted file mode 100644
index 19123e7..0000000
--- a/misc/cgo/test/issue8092.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8092. Test that linker defined symbols (e.g., text, data) don't
-// conflict with C symbols.
-
-package cgotest
-
-/*
-char text[] = "text";
-char data[] = "data";
-char *ctext(void) { return text; }
-char *cdata(void) { return data; }
-*/
-import "C"
-
-import "testing"
-
-func test8092(t *testing.T) {
-	tests := []struct {
-		s    string
-		a, b *C.char
-	}{
-		{"text", &C.text[0], C.ctext()},
-		{"data", &C.data[0], C.cdata()},
-	}
-	for _, test := range tests {
-		if test.a != test.b {
-			t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
-		}
-		if got := C.GoString(test.a); got != test.s {
-			t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
-		}
-	}
-}
diff --git a/misc/cgo/test/issue8331a.go b/misc/cgo/test/issue8331a.go
deleted file mode 100644
index 92e2579..0000000
--- a/misc/cgo/test/issue8331a.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8331.  A typedef of an unnamed struct is the same struct when
-// #include'd twice.  No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include "issue8331.h"
-import "C"
-
-func issue8331a() C.issue8331 {
-	return issue8331Var
-}
diff --git a/misc/cgo/test/issue8331b.go b/misc/cgo/test/issue8331b.go
deleted file mode 100644
index 5324aa2..0000000
--- a/misc/cgo/test/issue8331b.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8331.  A typedef of an unnamed struct is the same struct when
-// #include'd twice.  No runtime test; just make sure it compiles.
-
-package cgotest
-
-// #include "issue8331.h"
-import "C"
-
-var issue8331Var C.issue8331
diff --git a/misc/cgo/test/issue8428.go b/misc/cgo/test/issue8428.go
deleted file mode 100644
index 2e5a555..0000000
--- a/misc/cgo/test/issue8428.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This test fails on older versions of OS X because they use older buggy
-// versions of Clang that emit ambiguous DWARF info.  See issue 8611.
-// +build !darwin
-
-package cgotest
-
-// Issue 8428.  Cgo inconsistently translated zero size arrays.
-
-/*
-struct issue8428one {
-	char b;
-	char rest[];
-};
-
-struct issue8428two {
-	void *p;
-	char b;
-	char rest[0];
-	char pad;
-};
-
-struct issue8428three {
-	char w[1][2][3][0];
-	char x[2][3][0][1];
-	char y[3][0][1][2];
-	char z[0][1][2][3];
-};
-*/
-import "C"
-
-import "unsafe"
-
-var _ = C.struct_issue8428one{
-	b: C.char(0),
-	// The trailing rest field is not available in cgo.
-	// See issue 11925.
-	// rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428two{
-	p:    unsafe.Pointer(nil),
-	b:    C.char(0),
-	rest: [0]C.char{},
-}
-
-var _ = C.struct_issue8428three{
-	w: [1][2][3][0]C.char{},
-	x: [2][3][0][1]C.char{},
-	y: [3][0][1][2]C.char{},
-	z: [0][1][2][3]C.char{},
-}
diff --git a/misc/cgo/test/issue8441.go b/misc/cgo/test/issue8441.go
deleted file mode 100644
index 4489ca9..0000000
--- a/misc/cgo/test/issue8441.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Issue 8368 and 8441.  Recursive struct definitions didn't work.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-typedef struct one one;
-typedef struct two two;
-struct one {
-	two *x;
-};
-struct two {
-	one *x;
-};
-*/
-import "C"
-
-func issue8368(one *C.struct_one, two *C.struct_two) {
-}
-
-func issue8441(one *C.one, two *C.two) {
-	issue8441(two.x, one.x)
-}
diff --git a/misc/cgo/test/issue8811.go b/misc/cgo/test/issue8811.go
deleted file mode 100644
index f812732..0000000
--- a/misc/cgo/test/issue8811.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package cgotest
-
-/*
-extern int issue8811Initialized;
-extern void issue8811Init();
-
-void issue8811Execute() {
-	if(!issue8811Initialized)
-		issue8811Init();
-}
-*/
-import "C"
-
-import "testing"
-
-func test8811(t *testing.T) {
-	C.issue8811Execute()
-}
diff --git a/misc/cgo/test/issue9557.go b/misc/cgo/test/issue9557.go
deleted file mode 100644
index 4e8922a..0000000
--- a/misc/cgo/test/issue9557.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// cgo rewrote C.var to *_Cvar_var, but left
-// C.var.field as _Cvar.var.field.  It now rewrites
-// the latter as (*_Cvar_var).field.
-// See https://golang.org/issue/9557.
-
-package cgotest
-
-// struct issue9557_t {
-//   int a;
-// } test9557bar = { 42 };
-//
-// struct issue9557_t *issue9557foo = &test9557bar;
-import "C"
-import "testing"
-
-func test9557(t *testing.T) {
-	// implicitly dereference a Go variable
-	foo := C.issue9557foo
-	if v := foo.a; v != 42 {
-		t.Fatalf("foo.a expected 42, but got %d", v)
-	}
-
-	// explicitly dereference a C variable
-	if v := (*C.issue9557foo).a; v != 42 {
-		t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
-	}
-
-	// implicitly dereference a C variable
-	if v := C.issue9557foo.a; v != 42 {
-		t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
-	}
-}
diff --git a/misc/cgo/test/test.go b/misc/cgo/test/test.go
new file mode 100644
index 0000000..b23fca0
--- /dev/null
+++ b/misc/cgo/test/test.go
@@ -0,0 +1,2087 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test cases for cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains C definitions (not just declarations)
+// and so it must NOT contain any //export directives on Go functions.
+// See testx.go for exports.
+
+package cgotest
+
+/*
+#include <complex.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <errno.h>
+#cgo LDFLAGS: -lm
+
+#ifndef WIN32
+#include <pthread.h>
+#include <signal.h>
+#endif
+
+// alignment tests
+
+typedef unsigned char Uint8;
+typedef unsigned short Uint16;
+
+typedef enum {
+ MOD1 = 0x0000,
+ MODX = 0x8000
+} SDLMod;
+
+typedef enum {
+ A1 = 1,
+ B1 = 322,
+ SDLK_LAST
+} SDLKey;
+
+typedef struct SDL_keysym {
+	Uint8 scancode;
+	SDLKey sym;
+	SDLMod mod;
+	Uint16 unicode;
+} SDL_keysym;
+
+typedef struct SDL_KeyboardEvent {
+	Uint8 typ;
+	Uint8 which;
+	Uint8 state;
+	SDL_keysym keysym;
+} SDL_KeyboardEvent;
+
+void makeEvent(SDL_KeyboardEvent *event) {
+ unsigned char *p;
+ int i;
+
+ p = (unsigned char*)event;
+ for (i=0; i<sizeof *event; i++) {
+   p[i] = i;
+ }
+}
+
+int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
+  return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
+}
+
+void cTest(SDL_KeyboardEvent *event) {
+ printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
+   event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
+ fflush(stdout);
+}
+
+// api
+
+const char *greeting = "hello, world";
+
+// basic test cases
+
+#define SHIFT(x, y)  ((x)<<(y))
+#define KILO SHIFT(1, 10)
+#define UINT32VAL 0xc008427bU
+
+enum E {
+	Enum1 = 1,
+	Enum2 = 2,
+};
+
+typedef unsigned char cgo_uuid_t[20];
+
+void uuid_generate(cgo_uuid_t x) {
+	x[0] = 0;
+}
+
+struct S {
+	int x;
+};
+
+const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+
+extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
+
+enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
+
+int add(int x, int y) {
+	return x+y;
+};
+
+// complex alignment
+
+struct {
+	float x;
+	_Complex float y;
+} cplxAlign = { 3.14, 2.17 };
+
+// constants and pointer checking
+
+#define CheckConstVal 0
+
+typedef struct {
+	int *p;
+} CheckConstStruct;
+
+static void CheckConstFunc(CheckConstStruct *p, int e) {}
+
+// duplicate symbol
+
+int base_symbol = 0;
+#define alias_one base_symbol
+#define alias_two base_symbol
+
+// function pointer variables
+
+typedef int (*intFunc) ();
+
+int
+bridge_int_func(intFunc f)
+{
+	return f();
+}
+
+int fortytwo()
+{
+	return 42;
+}
+
+// issue 1222
+typedef union {
+	long align;
+} xxpthread_mutex_t;
+struct ibv_async_event {
+	union {
+		int x;
+	} element;
+};
+struct ibv_context {
+	xxpthread_mutex_t mutex;
+};
+
+// issue 1635
+// Mac OS X's gcc will generate scattered relocation 2/1 for
+// this function on Darwin/386, and 8l couldn't handle it.
+// this example is in issue 1635
+void scatter() {
+	void *p = scatter;
+	printf("scatter = %p\n", p);
+}
+
+// Adding this explicit extern declaration makes this a test for
+// https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
+// It used to cause a cgo error when building with GCC 6.
+extern int hola;
+
+// this example is in issue 3253
+int hola = 0;
+int testHola() { return hola; }
+
+// issue 3250
+#ifdef WIN32
+void testSendSIG() {}
+#else
+static void *thread(void *p) {
+	const int M = 100;
+	int i;
+	(void)p;
+	for (i = 0; i < M; i++) {
+		pthread_kill(pthread_self(), SIGCHLD);
+		usleep(rand() % 20 + 5);
+	}
+	return NULL;
+}
+void testSendSIG() {
+	const int N = 20;
+	int i;
+	pthread_t tid[N];
+	for (i = 0; i < N; i++) {
+		usleep(rand() % 200 + 100);
+		pthread_create(&tid[i], 0, thread, NULL);
+	}
+	for (i = 0; i < N; i++)
+		pthread_join(tid[i], 0);
+}
+#endif
+
+// issue 3261
+// libgcc on ARM might be compiled as thumb code, but our 5l
+// can't handle that, so we have to disable this test on arm.
+#ifdef __ARMEL__
+int vabs(int x) {
+	puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
+	return (x < 0) ? -x : x;
+}
+#elif defined(__arm64__) && defined(__clang__)
+int vabs(int x) {
+	puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
+	return (x < 0) ? -x : x;
+}
+#else
+int __absvsi2(int); // dummy prototype for libgcc function
+// we shouldn't name the function abs, as gcc might use
+// the builtin one.
+int vabs(int x) { return __absvsi2(x); }
+#endif
+
+
+// issue 3729
+// access errno from void C function
+const char _expA = 0x42;
+const float _expB = 3.14159;
+const short _expC = 0x55aa;
+const int _expD = 0xdeadbeef;
+
+#ifdef WIN32
+void g(void) {}
+void g2(int x, char a, float b, short c, int d) {}
+#else
+
+void g(void) {
+	errno = E2BIG;
+}
+
+// try to pass some non-trivial arguments to function g2
+void g2(int x, char a, float b, short c, int d) {
+	if (a == _expA && b == _expB && c == _expC && d == _expD)
+		errno = x;
+	else
+		errno = -1;
+}
+#endif
+
+// issue 3945
+// Test that cgo reserves enough stack space during cgo call.
+// See https://golang.org/issue/3945 for details.
+void say() {
+	printf("%s from C\n", "hello");
+}
+
+// issue 4054 part 1 - other half in testx.go
+
+typedef enum {
+	A = 0,
+	B,
+	C,
+	D,
+	E,
+	F,
+	G,
+	H,
+	II,
+	J,
+} issue4054a;
+
+// issue 4339
+// We've historically permitted #include <>, so test it here.  Issue 29333.
+#include <issue4339.h>
+
+// issue 4417
+// cmd/cgo: bool alignment/padding issue.
+// bool alignment is wrong and causing wrong arguments when calling functions.
+static int c_bool(bool a, bool b, int c, bool d, bool e)  {
+   return c;
+}
+
+// issue 4857
+#cgo CFLAGS: -Werror
+const struct { int a; } *issue4857() { return (void *)0; }
+
+// issue 5224
+// Test that the #cgo CFLAGS directive works,
+// with and without platform filters.
+#cgo CFLAGS: -DCOMMON_VALUE=123
+#cgo windows CFLAGS: -DIS_WINDOWS=1
+#cgo !windows CFLAGS: -DIS_WINDOWS=0
+int common = COMMON_VALUE;
+int is_windows = IS_WINDOWS;
+
+// issue 5227
+// linker incorrectly treats common symbols and
+// leaves them undefined.
+
+typedef struct {
+        int Count;
+} Fontinfo;
+
+Fontinfo SansTypeface;
+
+extern void init();
+
+Fontinfo loadfont() {
+        Fontinfo f = {0};
+        return f;
+}
+
+void init() {
+        SansTypeface = loadfont();
+}
+
+// issue 5242
+// Cgo incorrectly computed the alignment of structs
+// with no Go accessible fields as 0, and then panicked on
+// modulo-by-zero computations.
+typedef struct {
+} foo;
+
+typedef struct {
+	int x : 1;
+} bar;
+
+int issue5242(foo f, bar b) {
+	return 5242;
+}
+
+// issue 5337
+// Verify that we can withstand SIGPROF received on foreign threads
+
+#ifdef WIN32
+void test5337() {}
+#else
+static void *thread1(void *p) {
+	(void)p;
+	pthread_kill(pthread_self(), SIGPROF);
+	return NULL;
+}
+void test5337() {
+	pthread_t tid;
+	pthread_create(&tid, 0, thread1, NULL);
+	pthread_join(tid, 0);
+}
+#endif
+
+// issue 5603
+
+const long long issue5603exp = 0x12345678;
+long long issue5603foo0() { return issue5603exp; }
+long long issue5603foo1(void *p) { return issue5603exp; }
+long long issue5603foo2(void *p, void *q) { return issue5603exp; }
+long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
+long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
+
+// issue 5740
+
+int test5740a(void), test5740b(void);
+
+// issue 5986
+static void output5986()
+{
+    int current_row = 0, row_count = 0;
+    double sum_squares = 0;
+    double d;
+    do {
+        if (current_row == 10) {
+            current_row = 0;
+        }
+        ++row_count;
+    }
+    while (current_row++ != 1);
+    d =  sqrt(sum_squares / row_count);
+    printf("sqrt is: %g\n", d);
+}
+
+// issue 6128
+// Test handling of #defined names in clang.
+// NOTE: Must use hex, or else a shortcut for decimals
+// in cgo avoids trying to pass this to clang.
+#define X 0x1
+
+// issue 6472
+typedef struct
+{
+        struct
+        {
+            int x;
+        } y[16];
+} z;
+
+// issue 6612
+// Test new scheme for deciding whether C.name is an expression, type, constant.
+// Clang silences some warnings when the name is a #defined macro, so test those too
+// (even though we now use errors exclusively, not warnings).
+
+void myfunc(void) {}
+int myvar = 5;
+const char *mytext = "abcdef";
+typedef int mytype;
+enum {
+	myenum = 1234,
+};
+
+#define myfunc_def myfunc
+#define myvar_def myvar
+#define mytext_def mytext
+#define mytype_def mytype
+#define myenum_def myenum
+#define myint_def 12345
+#define myfloat_def 1.5
+#define mystring_def "hello"
+
+// issue 6907
+char* Issue6907CopyString(_GoString_ s) {
+	size_t n;
+	const char *p;
+	char *r;
+
+	n = _GoStringLen(s);
+	p = _GoStringPtr(s);
+	r = malloc(n + 1);
+	memmove(r, p, n);
+	r[n] = '\0';
+	return r;
+}
+
+// issue 7560
+typedef struct {
+	char x;
+	long y;
+} __attribute__((__packed__)) misaligned;
+
+int
+offset7560(void)
+{
+	return (uintptr_t)&((misaligned*)0)->y;
+}
+
+// issue 7786
+// No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
+
+struct test7786;
+typedef struct test7786 typedef_test7786;
+void f7786(struct test7786 *ctx) {}
+void g7786(typedef_test7786 *ctx) {}
+
+typedef struct body7786 typedef_body7786;
+struct body7786 { int x; };
+void b7786(struct body7786 *ctx) {}
+void c7786(typedef_body7786 *ctx) {}
+
+typedef union union7786 typedef_union7786;
+void u7786(union union7786 *ctx) {}
+void v7786(typedef_union7786 *ctx) {}
+
+// issue 8092
+// Test that linker defined symbols (e.g., text, data) don't
+// conflict with C symbols.
+char text[] = "text";
+char data[] = "data";
+char *ctext(void) { return text; }
+char *cdata(void) { return data; }
+
+// issue 8428
+// Cgo inconsistently translated zero size arrays.
+
+struct issue8428one {
+	char b;
+	char rest[];
+};
+
+struct issue8428two {
+	void *p;
+	char b;
+	char rest[0];
+	char pad;
+};
+
+struct issue8428three {
+	char w[1][2][3][0];
+	char x[2][3][0][1];
+	char y[3][0][1][2];
+	char z[0][1][2][3];
+};
+
+// issue 8331 part 1 - part 2 in testx.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice.  No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 8368 and 8441
+// Recursive struct definitions didn't work.
+// No runtime test; just make sure it compiles.
+typedef struct one one;
+typedef struct two two;
+struct one {
+	two *x;
+};
+struct two {
+	one *x;
+};
+
+// issue 8811
+
+extern int issue8811Initialized;
+extern void issue8811Init();
+
+void issue8811Execute() {
+	if(!issue8811Initialized)
+		issue8811Init();
+}
+
+// issue 9557
+
+struct issue9557_t {
+  int a;
+} test9557bar = { 42 };
+struct issue9557_t *issue9557foo = &test9557bar;
+
+// issue 10303
+// Pointers passed to C were not marked as escaping (bug in cgo).
+
+typedef int *intptr;
+
+void setintstar(int *x) {
+	*x = 1;
+}
+
+void setintptr(intptr x) {
+	*x = 1;
+}
+
+void setvoidptr(void *x) {
+	*(int*)x = 1;
+}
+
+typedef struct Struct Struct;
+struct Struct {
+	int *P;
+};
+
+void setstruct(Struct s) {
+	*s.P = 1;
+}
+
+// issue 11925
+// Structs with zero-length trailing fields are now padded by the Go compiler.
+
+struct a11925 {
+	int i;
+	char a[0];
+	char b[0];
+};
+
+struct b11925 {
+	int i;
+	char a[0];
+	char b[];
+};
+
+// issue 12030
+void issue12030conv(char *buf, double x) {
+	sprintf(buf, "d=%g", x);
+}
+
+// issue 14838
+
+int check_cbytes(char *b, size_t l) {
+	int i;
+	for (i = 0; i < l; i++) {
+		if (b[i] != i) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
+// issue 17065
+// Test that C symbols larger than a page play nicely with the race detector.
+int ii[65537];
+
+// issue 17537
+// The void* cast introduced by cgo to avoid problems
+// with const/volatile qualifiers breaks C preprocessor macros that
+// emulate functions.
+
+typedef struct {
+	int i;
+} S17537;
+
+int I17537(S17537 *p);
+
+#define I17537(p) ((p)->i)
+
+// Calling this function used to fail without the cast.
+const int F17537(const char **p) {
+	return **p;
+}
+
+// issue 17723
+// API compatibility checks
+
+typedef char *cstring_pointer;
+static void cstring_pointer_fun(cstring_pointer dummy) { }
+const char *api_hello = "hello!";
+
+// Calling this function used to trigger an error from the C compiler
+// (issue 18298).
+void F18298(const void *const *p) {
+}
+
+// Test that conversions between typedefs work as they used to.
+typedef const void *T18298_1;
+struct S18298 { int i; };
+typedef const struct S18298 *T18298_2;
+void G18298(T18298_1 t) {
+}
+
+// issue 18126
+// cgo check of void function returning errno.
+void Issue18126C(void **p) {}
+
+// issue 18720
+
+#define HELLO "hello"
+#define WORLD "world"
+#define HELLO_WORLD HELLO "\000" WORLD
+
+struct foo { char c; };
+#define SIZE_OF(x) sizeof(x)
+#define SIZE_OF_FOO SIZE_OF(struct foo)
+#define VAR1 VAR
+#define VAR var
+int var = 5;
+
+#define ADDR &var
+
+#define CALL fn()
+int fn(void) {
+	return ++var;
+}
+
+// issue 20129
+
+int issue20129 = 0;
+typedef void issue20129Void;
+issue20129Void issue20129Foo() {
+	issue20129 = 1;
+}
+typedef issue20129Void issue20129Void2;
+issue20129Void2 issue20129Bar() {
+	issue20129 = 2;
+}
+
+// issue 20369
+#define XUINT64_MAX        18446744073709551615ULL
+
+// issue 21668
+// Fail to guess the kind of the constant "x".
+// No runtime test; just make sure it compiles.
+const int x21668 = 42;
+
+// issue 21708
+#define CAST_TO_INT64 (int64_t)(-1)
+
+// issue 21809
+// Compile C `typedef` to go type aliases.
+
+typedef long MySigned_t;
+// tests alias-to-alias
+typedef MySigned_t MySigned2_t;
+long takes_long(long x) { return x * x; }
+MySigned_t takes_typedef(MySigned_t x) { return x * x; }
+
+// issue 22906
+
+// It's going to be hard to include a whole real JVM to test this.
+// So we'll simulate a really easy JVM using just the parts we need.
+// This is the relevant part of jni.h.
+
+struct _jobject;
+
+typedef struct _jobject *jobject;
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+typedef jobject jweak;
+
+// Note: jvalue is already a non-pointer type due to it being a C union.
+
+// issue 22958
+
+typedef struct {
+	unsigned long long f8  : 8;
+	unsigned long long f16 : 16;
+	unsigned long long f24 : 24;
+	unsigned long long f32 : 32;
+	unsigned long long f40 : 40;
+	unsigned long long f48 : 48;
+	unsigned long long f56 : 56;
+	unsigned long long f64 : 64;
+} issue22958Type;
+
+// issue 23356
+int a(void) { return 5; };
+int r(void) { return 3; };
+
+// issue 23720
+typedef int *issue23720A;
+typedef const int *issue23720B;
+void issue23720F(issue23720B a) {}
+
+// issue 24206
+#if defined(__linux__) && defined(__x86_64__)
+#include <sys/mman.h>
+// Returns string with null byte at the last valid address
+char* dangerousString1() {
+	int pageSize = 4096;
+	char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+	mprotect(data + pageSize,pageSize,PROT_NONE);
+	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+	int i = start;
+	for (; i < pageSize; i++) {
+	data[i] = 'x';
+	}
+	data[pageSize -1 ] = 0;
+	return data+start;
+}
+
+char* dangerousString2() {
+	int pageSize = 4096;
+	char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
+	mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
+	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
+	int i = start;
+	for (; i < 2 * pageSize; i++) {
+	data[i] = 'x';
+	}
+	data[2*pageSize -1 ] = 0;
+	return data+start;
+}
+#else
+char *dangerousString1() { return NULL; }
+char *dangerousString2() { return NULL; }
+#endif
+
+// issue 26066
+const unsigned long long int issue26066 = (const unsigned long long) -1;
+
+// issue 26517
+// Introduce two pointer types which are distinct, but have the same
+// base type. Make sure that both of those pointer types get resolved
+// correctly. Before the fix for 26517 if one of these pointer types
+// was resolved before the other one was processed, the second one
+// would never be resolved.
+// Before this issue was fixed this test failed on Windows,
+// where va_list expands to a named char* type.
+typedef va_list TypeOne;
+typedef char *TypeTwo;
+
+// issue 28540
+
+static void twoargs1(void *p, int n) {}
+static void *twoargs2() { return 0; }
+static int twoargs3(void * p) { return 0; }
+
+// issue 28545
+// Failed to add type conversion for negative constant.
+
+static void issue28545F(char **p, int n, complex double a) {}
+
+// issue 28772 part 1 - part 2 in testx.go
+// Failed to add type conversion for Go constant set to C constant.
+// No runtime test; just make sure it compiles.
+
+#define issue28772Constant 1
+
+// issue 28896
+// cgo was incorrectly adding padding after a packed struct.
+typedef struct {
+	void *f1;
+	uint32_t f2;
+} __attribute__((__packed__)) innerPacked;
+
+typedef struct {
+	innerPacked g1;
+	uint64_t g2;
+} outerPacked;
+
+typedef struct {
+	void *f1;
+	uint32_t f2;
+} innerUnpacked;
+
+typedef struct {
+	innerUnpacked g1;
+	uint64_t g2;
+} outerUnpacked;
+
+size_t offset(int x) {
+	switch (x) {
+	case 0:
+		return offsetof(innerPacked, f2);
+	case 1:
+		return offsetof(outerPacked, g2);
+	case 2:
+		return offsetof(innerUnpacked, f2);
+	case 3:
+		return offsetof(outerUnpacked, g2);
+	default:
+		abort();
+	}
+}
+
+// issue 29748
+
+typedef struct { char **p; } S29748;
+static int f29748(S29748 *p) { return 0; }
+
+// issue 29781
+// Error with newline inserted into constant expression.
+// Compilation test only, nothing to run.
+
+static void issue29781F(char **p, int n) {}
+#define ISSUE29781C 0
+
+// issue 29878
+uint64_t issue29878exported(int8_t);  // prototype must match
+int16_t issue29878function(uint32_t arg) { return issue29878exported(arg); }
+
+*/
+import "C"
+
+import (
+	"context"
+	"fmt"
+	"math"
+	"math/rand"
+	"os"
+	"os/signal"
+	"reflect"
+	"runtime"
+	"sync"
+	"syscall"
+	"testing"
+	"time"
+	"unsafe"
+)
+
+// alignment
+
+func testAlign(t *testing.T) {
+	var evt C.SDL_KeyboardEvent
+	C.makeEvent(&evt)
+	if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
+		t.Error("*** bad alignment")
+		C.cTest(&evt)
+		t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
+			evt.typ, evt.which, evt.state, evt.keysym.scancode,
+			evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
+		t.Error(evt)
+	}
+}
+
+// api
+
+const greeting = "hello, world"
+
+type testPair struct {
+	Name      string
+	Got, Want interface{}
+}
+
+var testPairs = []testPair{
+	{"GoString", C.GoString(C.greeting), greeting},
+	{"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
+	{"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
+}
+
+func testHelpers(t *testing.T) {
+	for _, pair := range testPairs {
+		if !reflect.DeepEqual(pair.Got, pair.Want) {
+			t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
+		}
+	}
+}
+
+// basic test cases
+
+const EINVAL = C.EINVAL /* test #define */
+
+var KILO = C.KILO
+
+func uuidgen() {
+	var uuid C.cgo_uuid_t
+	C.uuid_generate(&uuid[0])
+}
+
+func Strtol(s string, base int) (int, error) {
+	p := C.CString(s)
+	n, err := C.strtol(p, nil, C.int(base))
+	C.free(unsafe.Pointer(p))
+	return int(n), err
+}
+
+func Atol(s string) int {
+	p := C.CString(s)
+	n := C.atol(p)
+	C.free(unsafe.Pointer(p))
+	return int(n)
+}
+
+func testConst(t *testing.T) {
+	C.myConstFunc(nil, 0, nil)
+}
+
+func testEnum(t *testing.T) {
+	if C.Enum1 != 1 || C.Enum2 != 2 {
+		t.Error("bad enum", C.Enum1, C.Enum2)
+	}
+}
+
+func testAtol(t *testing.T) {
+	l := Atol("123")
+	if l != 123 {
+		t.Error("Atol 123: ", l)
+	}
+}
+
+func testErrno(t *testing.T) {
+	p := C.CString("no-such-file")
+	m := C.CString("r")
+	f, err := C.fopen(p, m)
+	C.free(unsafe.Pointer(p))
+	C.free(unsafe.Pointer(m))
+	if err == nil {
+		C.fclose(f)
+		t.Fatalf("C.fopen: should fail")
+	}
+	if err != syscall.ENOENT {
+		t.Fatalf("C.fopen: unexpected error: %v", err)
+	}
+}
+
+func testMultipleAssign(t *testing.T) {
+	p := C.CString("234")
+	n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
+	if runtime.GOOS == "openbsd" {
+		// Bug in OpenBSD strtol(3) - base > 36 succeeds.
+		if (n != 0 && n != 239089) || m != 234 {
+			t.Fatal("Strtol x2: ", n, m)
+		}
+	} else if n != 0 || m != 234 {
+		t.Fatal("Strtol x2: ", n, m)
+	}
+	C.free(unsafe.Pointer(p))
+}
+
+var (
+	cuint  = (C.uint)(0)
+	culong C.ulong
+	cchar  C.char
+)
+
+type Context struct {
+	ctx *C.struct_ibv_context
+}
+
+func benchCgoCall(b *testing.B) {
+	const x = C.int(2)
+	const y = C.int(3)
+	for i := 0; i < b.N; i++ {
+		C.add(x, y)
+	}
+}
+
+var sinkString string
+
+func benchGoString(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		sinkString = C.GoString(C.cstr)
+	}
+	const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
+	if sinkString != want {
+		b.Fatalf("%q != %q", sinkString, want)
+	}
+}
+
+// Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
+func sliceOperands(array [2000]int) {
+	_ = array[C.KILO:C.KILO:C.KILO] // no type error
+}
+
+// set in cgo_thread_lock.go init
+var testThreadLockFunc = func(*testing.T) {}
+
+// complex alignment
+
+func TestComplexAlign(t *testing.T) {
+	if C.cplxAlign.x != 3.14 {
+		t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
+	}
+	if C.cplxAlign.y != 2.17 {
+		t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
+	}
+}
+
+// constants and pointer checking
+
+func testCheckConst(t *testing.T) {
+	// The test is that this compiles successfully.
+	p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
+	defer C.free(p)
+	C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
+}
+
+// duplicate symbol
+
+func duplicateSymbols() {
+	fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
+}
+
+// environment
+
+// This is really an os package test but here for convenience.
+func testSetEnv(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		// Go uses SetEnvironmentVariable on windows. However,
+		// C runtime takes a *copy* at process startup of the
+		// OS environment, and stores it in environ/envp.
+		// It is this copy that	getenv/putenv manipulate.
+		t.Logf("skipping test")
+		return
+	}
+	const key = "CGO_OS_TEST_KEY"
+	const val = "CGO_OS_TEST_VALUE"
+	os.Setenv(key, val)
+	keyc := C.CString(key)
+	defer C.free(unsafe.Pointer(keyc))
+	v := C.getenv(keyc)
+	if uintptr(unsafe.Pointer(v)) == 0 {
+		t.Fatal("getenv returned NULL")
+	}
+	vs := C.GoString(v)
+	if vs != val {
+		t.Fatalf("getenv() = %q; want %q", vs, val)
+	}
+}
+
+// function pointer variables
+
+func callBridge(f C.intFunc) int {
+	return int(C.bridge_int_func(f))
+}
+
+func callCBridge(f C.intFunc) C.int {
+	return C.bridge_int_func(f)
+}
+
+func testFpVar(t *testing.T) {
+	const expected = 42
+	f := C.intFunc(C.fortytwo)
+	res1 := C.bridge_int_func(f)
+	if r1 := int(res1); r1 != expected {
+		t.Errorf("got %d, want %d", r1, expected)
+	}
+	res2 := callCBridge(f)
+	if r2 := int(res2); r2 != expected {
+		t.Errorf("got %d, want %d", r2, expected)
+	}
+	r3 := callBridge(f)
+	if r3 != expected {
+		t.Errorf("got %d, want %d", r3, expected)
+	}
+}
+
+// issue 1222
+type AsyncEvent struct {
+	event C.struct_ibv_async_event
+}
+
+// issue 1635
+
+func test1635(t *testing.T) {
+	C.scatter()
+	if v := C.hola; v != 0 {
+		t.Fatalf("C.hola is %d, should be 0", v)
+	}
+	if v := C.testHola(); v != 0 {
+		t.Fatalf("C.testHola() is %d, should be 0", v)
+	}
+}
+
+// issue 2470
+
+func testUnsignedInt(t *testing.T) {
+	a := (int64)(C.UINT32VAL)
+	b := (int64)(0xc008427b)
+	if a != b {
+		t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
+	}
+}
+
+// issue 3250
+
+func test3250(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		t.Skip("not applicable on windows")
+	}
+
+	t.Skip("skipped, see golang.org/issue/5885")
+	var (
+		thres = 1
+		sig   = syscall_dot_SIGCHLD
+	)
+	type result struct {
+		n   int
+		sig os.Signal
+	}
+	var (
+		sigCh     = make(chan os.Signal, 10)
+		waitStart = make(chan struct{})
+		waitDone  = make(chan result)
+	)
+
+	signal.Notify(sigCh, sig)
+
+	go func() {
+		n := 0
+		alarm := time.After(time.Second * 3)
+		for {
+			select {
+			case <-waitStart:
+				waitStart = nil
+			case v := <-sigCh:
+				n++
+				if v != sig || n > thres {
+					waitDone <- result{n, v}
+					return
+				}
+			case <-alarm:
+				waitDone <- result{n, sig}
+				return
+			}
+		}
+	}()
+
+	waitStart <- struct{}{}
+	C.testSendSIG()
+	r := <-waitDone
+	if r.sig != sig {
+		t.Fatalf("received signal %v, but want %v", r.sig, sig)
+	}
+	t.Logf("got %d signals\n", r.n)
+	if r.n <= thres {
+		t.Fatalf("expected more than %d", thres)
+	}
+}
+
+// issue 3261
+
+func testLibgcc(t *testing.T) {
+	var table = []struct {
+		in, out C.int
+	}{
+		{0, 0},
+		{1, 1},
+		{-42, 42},
+		{1000300, 1000300},
+		{1 - 1<<31, 1<<31 - 1},
+	}
+	for _, v := range table {
+		if o := C.vabs(v.in); o != v.out {
+			t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
+			return
+		}
+	}
+}
+
+// issue 3729
+
+func test3729(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		t.Skip("skipping on windows")
+	}
+
+	_, e := C.g()
+	if e != syscall.E2BIG {
+		t.Errorf("got %q, expect %q", e, syscall.E2BIG)
+	}
+	_, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
+	if e != syscall.EINVAL {
+		t.Errorf("got %q, expect %q", e, syscall.EINVAL)
+	}
+}
+
+// issue 3945
+
+func testPrintf(t *testing.T) {
+	C.say()
+}
+
+// issue 4054
+
+var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
+
+// issue 4339
+
+func test4339(t *testing.T) {
+	C.handle4339(&C.exported4339)
+}
+
+// issue 4417
+
+func testBoolAlign(t *testing.T) {
+	b := C.c_bool(true, true, 10, true, false)
+	if b != 10 {
+		t.Fatalf("found %d expected 10\n", b)
+	}
+	b = C.c_bool(true, true, 5, true, true)
+	if b != 5 {
+		t.Fatalf("found %d expected 5\n", b)
+	}
+	b = C.c_bool(true, true, 3, true, false)
+	if b != 3 {
+		t.Fatalf("found %d expected 3\n", b)
+	}
+	b = C.c_bool(false, false, 1, true, false)
+	if b != 1 {
+		t.Fatalf("found %d expected 1\n", b)
+	}
+	b = C.c_bool(false, true, 200, true, false)
+	if b != 200 {
+		t.Fatalf("found %d expected 200\n", b)
+	}
+}
+
+// issue 4857
+
+func test4857() {
+	_ = C.issue4857()
+}
+
+// issue 5224
+
+func testCflags(t *testing.T) {
+	is_windows := C.is_windows == 1
+	if is_windows != (runtime.GOOS == "windows") {
+		t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
+	}
+	if C.common != 123 {
+		t.Errorf("common: %v (expected 123)", C.common)
+	}
+}
+
+// issue 5227
+
+func test5227(t *testing.T) {
+	C.init()
+}
+
+func selectfont() C.Fontinfo {
+	return C.SansTypeface
+}
+
+// issue 5242
+
+func test5242(t *testing.T) {
+	if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
+		t.Errorf("got %v", got)
+	}
+}
+
+func test5603(t *testing.T) {
+	var x [5]int64
+	exp := int64(C.issue5603exp)
+	x[0] = int64(C.issue5603foo0())
+	x[1] = int64(C.issue5603foo1(nil))
+	x[2] = int64(C.issue5603foo2(nil, nil))
+	x[3] = int64(C.issue5603foo3(nil, nil, nil))
+	x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
+	for i, v := range x {
+		if v != exp {
+			t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
+		}
+	}
+}
+
+// issue 5337
+
+func test5337(t *testing.T) {
+	C.test5337()
+}
+
+// issue 5740
+
+func test5740(t *testing.T) {
+	if v := C.test5740a() + C.test5740b(); v != 5 {
+		t.Errorf("expected 5, got %v", v)
+	}
+}
+
+// issue 5986
+
+func test5986(t *testing.T) {
+	C.output5986()
+}
+
+// issue 6128
+
+func test6128() {
+	// nothing to run, just make sure this compiles.
+	_ = C.X
+}
+
+// issue 6390
+
+func test6390(t *testing.T) {
+	p1 := C.malloc(1024)
+	if p1 == nil {
+		t.Fatalf("C.malloc(1024) returned nil")
+	}
+	p2 := C.malloc(0)
+	if p2 == nil {
+		t.Fatalf("C.malloc(0) returned nil")
+	}
+	C.free(p1)
+	C.free(p2)
+}
+
+func test6472() {
+	// nothing to run, just make sure this compiles
+	s := new(C.z)
+	println(s.y[0].x)
+}
+
+// issue 6506
+
+func test6506() {
+	// nothing to run, just make sure this compiles
+	var x C.size_t
+
+	C.calloc(x, x)
+	C.malloc(x)
+	C.realloc(nil, x)
+	C.memcpy(nil, nil, x)
+	C.memcmp(nil, nil, x)
+	C.memmove(nil, nil, x)
+	C.strncpy(nil, nil, x)
+	C.strncmp(nil, nil, x)
+	C.strncat(nil, nil, x)
+	x = C.strxfrm(nil, nil, x)
+	C.memchr(nil, 0, x)
+	x = C.strcspn(nil, nil)
+	x = C.strspn(nil, nil)
+	C.memset(nil, 0, x)
+	x = C.strlen(nil)
+	_ = x
+}
+
+// issue 6612
+
+func testNaming(t *testing.T) {
+	C.myfunc()
+	C.myfunc_def()
+	if v := C.myvar; v != 5 {
+		t.Errorf("C.myvar = %d, want 5", v)
+	}
+	if v := C.myvar_def; v != 5 {
+		t.Errorf("C.myvar_def = %d, want 5", v)
+	}
+	if s := C.GoString(C.mytext); s != "abcdef" {
+		t.Errorf("C.mytext = %q, want %q", s, "abcdef")
+	}
+	if s := C.GoString(C.mytext_def); s != "abcdef" {
+		t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
+	}
+	if c := C.myenum; c != 1234 {
+		t.Errorf("C.myenum = %v, want 1234", c)
+	}
+	if c := C.myenum_def; c != 1234 {
+		t.Errorf("C.myenum_def = %v, want 1234", c)
+	}
+	{
+		const c = C.myenum
+		if c != 1234 {
+			t.Errorf("C.myenum as const = %v, want 1234", c)
+		}
+	}
+	{
+		const c = C.myenum_def
+		if c != 1234 {
+			t.Errorf("C.myenum as const = %v, want 1234", c)
+		}
+	}
+	if c := C.myint_def; c != 12345 {
+		t.Errorf("C.myint_def = %v, want 12345", c)
+	}
+	{
+		const c = C.myint_def
+		if c != 12345 {
+			t.Errorf("C.myint as const = %v, want 12345", c)
+		}
+	}
+
+	if c := C.myfloat_def; c != 1.5 {
+		t.Errorf("C.myint_def = %v, want 1.5", c)
+	}
+	{
+		const c = C.myfloat_def
+		if c != 1.5 {
+			t.Errorf("C.myint as const = %v, want 1.5", c)
+		}
+	}
+
+	if s := C.mystring_def; s != "hello" {
+		t.Errorf("C.mystring_def = %q, want %q", s, "hello")
+	}
+}
+
+// issue 6907
+
+func test6907(t *testing.T) {
+	want := "yarn"
+	if got := C.GoString(C.Issue6907CopyString(want)); got != want {
+		t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
+	}
+}
+
+// issue 7560
+
+func test7560(t *testing.T) {
+	// some mingw don't implement __packed__ correctly.
+	if C.offset7560() != 1 {
+		t.Skip("C compiler did not pack struct")
+	}
+
+	// C.misaligned should have x but then a padding field to get to the end of the struct.
+	// There should not be a field named 'y'.
+	var v C.misaligned
+	rt := reflect.TypeOf(&v).Elem()
+	if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
+		t.Errorf("unexpected fields in C.misaligned:\n")
+		for i := 0; i < rt.NumField(); i++ {
+			t.Logf("%+v\n", rt.Field(i))
+		}
+	}
+}
+
+// issue 7786
+
+func f() {
+	var x1 *C.typedef_test7786
+	var x2 *C.struct_test7786
+	x1 = x2
+	x2 = x1
+	C.f7786(x1)
+	C.f7786(x2)
+	C.g7786(x1)
+	C.g7786(x2)
+
+	var b1 *C.typedef_body7786
+	var b2 *C.struct_body7786
+	b1 = b2
+	b2 = b1
+	C.b7786(b1)
+	C.b7786(b2)
+	C.c7786(b1)
+	C.c7786(b2)
+
+	var u1 *C.typedef_union7786
+	var u2 *C.union_union7786
+	u1 = u2
+	u2 = u1
+	C.u7786(u1)
+	C.u7786(u2)
+	C.v7786(u1)
+	C.v7786(u2)
+}
+
+// issue 8092
+
+func test8092(t *testing.T) {
+	tests := []struct {
+		s    string
+		a, b *C.char
+	}{
+		{"text", &C.text[0], C.ctext()},
+		{"data", &C.data[0], C.cdata()},
+	}
+	for _, test := range tests {
+		if test.a != test.b {
+			t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
+		}
+		if got := C.GoString(test.a); got != test.s {
+			t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
+		}
+	}
+}
+
+// issues 8368 and 8441
+
+func issue8368(one *C.struct_one, two *C.struct_two) {
+}
+
+func issue8441(one *C.one, two *C.two) {
+	issue8441(two.x, one.x)
+}
+
+// issue 8428
+
+var _ = C.struct_issue8428one{
+	b: C.char(0),
+	// The trailing rest field is not available in cgo.
+	// See issue 11925.
+	// rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428two{
+	p:    unsafe.Pointer(nil),
+	b:    C.char(0),
+	rest: [0]C.char{},
+}
+
+var _ = C.struct_issue8428three{
+	w: [1][2][3][0]C.char{},
+	x: [2][3][0][1]C.char{},
+	y: [3][0][1][2]C.char{},
+	z: [0][1][2][3]C.char{},
+}
+
+// issue 8811
+
+func test8811(t *testing.T) {
+	C.issue8811Execute()
+}
+
+// issue 9557
+
+func test9557(t *testing.T) {
+	// implicitly dereference a Go variable
+	foo := C.issue9557foo
+	if v := foo.a; v != 42 {
+		t.Fatalf("foo.a expected 42, but got %d", v)
+	}
+
+	// explicitly dereference a C variable
+	if v := (*C.issue9557foo).a; v != 42 {
+		t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
+	}
+
+	// implicitly dereference a C variable
+	if v := C.issue9557foo.a; v != 42 {
+		t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
+	}
+}
+
+// issue 8331 part 1
+
+func issue8331a() C.issue8331 {
+	return issue8331Var
+}
+
+// issue 10303
+
+func test10303(t *testing.T, n int) {
+	if runtime.Compiler == "gccgo" {
+		t.Skip("gccgo permits C pointers on the stack")
+	}
+
+	// Run at a few different stack depths just to avoid an unlucky pass
+	// due to variables ending up on different pages.
+	if n > 0 {
+		test10303(t, n-1)
+	}
+	if t.Failed() {
+		return
+	}
+	var x, y, z, v, si C.int
+	var s C.Struct
+	C.setintstar(&x)
+	C.setintptr(&y)
+	C.setvoidptr(unsafe.Pointer(&v))
+	s.P = &si
+	C.setstruct(s)
+
+	if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C int* argument on stack")
+	}
+	if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C intptr argument on stack")
+	}
+	if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C void* argument on stack")
+	}
+	if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
+		t.Error("C struct field pointer on stack")
+	}
+}
+
+// issue 11925
+
+func test11925(t *testing.T) {
+	if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
+		t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
+	}
+	if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
+		t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
+	}
+}
+
+// issue 12030
+
+func test12030(t *testing.T) {
+	buf := (*C.char)(C.malloc(256))
+	defer C.free(unsafe.Pointer(buf))
+	for _, f := range []float64{1.0, 2.0, 3.14} {
+		C.issue12030conv(buf, C.double(f))
+		got := C.GoString(buf)
+		if want := fmt.Sprintf("d=%g", f); got != want {
+			t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
+		}
+	}
+}
+
+// issue 13402
+
+var _ C.complexfloat
+var _ C.complexdouble
+
+// issue 13930
+// Test that cgo's multiple-value special form for
+// C function calls works in variable declaration statements.
+
+var _, _ = C.abs(0)
+
+// issue 14838
+
+func test14838(t *testing.T) {
+	data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
+	cData := C.CBytes(data)
+	defer C.free(cData)
+
+	if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
+		t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
+	}
+}
+
+// issue 17065
+
+var sink C.int
+
+func test17065(t *testing.T) {
+	if runtime.GOOS == "darwin" {
+		t.Skip("broken on darwin; issue 17065")
+	}
+	for i := range C.ii {
+		sink = C.ii[i]
+	}
+}
+
+// issue 17537
+
+func test17537(t *testing.T) {
+	v := C.S17537{i: 17537}
+	if got, want := C.I17537(&v), C.int(17537); got != want {
+		t.Errorf("got %d, want %d", got, want)
+	}
+
+	p := (*C.char)(C.malloc(1))
+	*p = 17
+	if got, want := C.F17537(&p), C.int(17); got != want {
+		t.Errorf("got %d, want %d", got, want)
+	}
+
+	C.F18298(nil)
+	var v18298 C.T18298_2
+	C.G18298(C.T18298_1(v18298))
+}
+
+// issue 17723
+
+func testAPI() {
+	var cs *C.char
+	cs = C.CString("hello")
+	defer C.free(unsafe.Pointer(cs))
+	var s string
+	s = C.GoString((*C.char)(C.api_hello))
+	s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
+	var b []byte
+	b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
+	_, _ = s, b
+	C.cstring_pointer_fun(nil)
+}
+
+// issue 18126
+
+func test18126(t *testing.T) {
+	p := C.malloc(1)
+	_, err := C.Issue18126C(&p)
+	C.free(p)
+	_ = err
+}
+
+// issue 18720
+
+func test18720(t *testing.T) {
+	if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
+		t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
+	}
+
+	if got, want := C.VAR1, C.int(5); got != want {
+		t.Errorf("C.VAR1 == %v, expected %v", got, want)
+	}
+
+	if got, want := *C.ADDR, C.int(5); got != want {
+		t.Errorf("*C.ADDR == %v, expected %v", got, want)
+	}
+
+	if got, want := C.CALL, C.int(6); got != want {
+		t.Errorf("C.CALL == %v, expected %v", got, want)
+	}
+
+	if got, want := C.CALL, C.int(7); got != want {
+		t.Errorf("C.CALL == %v, expected %v", got, want)
+	}
+
+	// Issue 20125.
+	if got, want := C.SIZE_OF_FOO, 1; got != want {
+		t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
+	}
+}
+
+// issue 20129
+
+func test20129(t *testing.T) {
+	if C.issue20129 != 0 {
+		t.Fatal("test is broken")
+	}
+	C.issue20129Foo()
+	if C.issue20129 != 1 {
+		t.Errorf("got %v but expected %v", C.issue20129, 1)
+	}
+	C.issue20129Bar()
+	if C.issue20129 != 2 {
+		t.Errorf("got %v but expected %v", C.issue20129, 2)
+	}
+}
+
+// issue 20369
+
+func test20369(t *testing.T) {
+	if C.XUINT64_MAX != math.MaxUint64 {
+		t.Fatalf("got %v, want %v", uint64(C.XUINT64_MAX), uint64(math.MaxUint64))
+	}
+}
+
+// issue 21668
+
+var issue21668_X = C.x21668
+
+// issue 21708
+
+func test21708(t *testing.T) {
+	if got, want := C.CAST_TO_INT64, -1; got != want {
+		t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
+	}
+}
+
+// issue 21809
+
+func test21809(t *testing.T) {
+	longVar := C.long(3)
+	typedefVar := C.MySigned_t(4)
+	typedefTypedefVar := C.MySigned2_t(5)
+
+	// all three should be considered identical to `long`
+	if ret := C.takes_long(longVar); ret != 9 {
+		t.Errorf("got %v but expected %v", ret, 9)
+	}
+	if ret := C.takes_long(typedefVar); ret != 16 {
+		t.Errorf("got %v but expected %v", ret, 16)
+	}
+	if ret := C.takes_long(typedefTypedefVar); ret != 25 {
+		t.Errorf("got %v but expected %v", ret, 25)
+	}
+
+	// They should also be identical to the typedef'd type
+	if ret := C.takes_typedef(longVar); ret != 9 {
+		t.Errorf("got %v but expected %v", ret, 9)
+	}
+	if ret := C.takes_typedef(typedefVar); ret != 16 {
+		t.Errorf("got %v but expected %v", ret, 16)
+	}
+	if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
+		t.Errorf("got %v but expected %v", ret, 25)
+	}
+}
+
+// issue 22906
+
+func test22906(t *testing.T) {
+	var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
+	_ = x1
+	var x2 C.jclass = 0
+	_ = x2
+	var x3 C.jthrowable = 0
+	_ = x3
+	var x4 C.jstring = 0
+	_ = x4
+	var x5 C.jarray = 0
+	_ = x5
+	var x6 C.jbooleanArray = 0
+	_ = x6
+	var x7 C.jbyteArray = 0
+	_ = x7
+	var x8 C.jcharArray = 0
+	_ = x8
+	var x9 C.jshortArray = 0
+	_ = x9
+	var x10 C.jintArray = 0
+	_ = x10
+	var x11 C.jlongArray = 0
+	_ = x11
+	var x12 C.jfloatArray = 0
+	_ = x12
+	var x13 C.jdoubleArray = 0
+	_ = x13
+	var x14 C.jobjectArray = 0
+	_ = x14
+	var x15 C.jweak = 0
+	_ = x15
+}
+
+// issue 22958
+// Nothing to run, just make sure this compiles.
+var Vissue22958 C.issue22958Type
+
+func test23356(t *testing.T) {
+	if got, want := C.a(), C.int(5); got != want {
+		t.Errorf("C.a() == %v, expected %v", got, want)
+	}
+	if got, want := C.r(), C.int(3); got != want {
+		t.Errorf("C.r() == %v, expected %v", got, want)
+	}
+}
+
+// issue 23720
+
+func Issue23720F() {
+	var x C.issue23720A
+	C.issue23720F(x)
+}
+
+// issue 24206
+
+func test24206(t *testing.T) {
+	if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
+		t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
+	}
+
+	if l := len(C.GoString(C.dangerousString1())); l != 123 {
+		t.Errorf("Incorrect string length - got %d, want 123", l)
+	}
+	if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
+		t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
+	}
+}
+
+// issue 25143
+
+func issue25143sum(ns ...C.int) C.int {
+	total := C.int(0)
+	for _, n := range ns {
+		total += n
+	}
+	return total
+}
+
+func test25143(t *testing.T) {
+	if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
+		t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
+	}
+}
+
+// issue 26066
+// Wrong type of constant with GCC 8 and newer.
+
+func test26066(t *testing.T) {
+	var i = int64(C.issue26066)
+	if i != -1 {
+		t.Errorf("got %d, want -1", i)
+	}
+}
+
+// issue 26517
+var a C.TypeOne
+var b C.TypeTwo
+
+// issue 27660
+// Stress the interaction between the race detector and cgo in an
+// attempt to reproduce the memory corruption described in #27660.
+// The bug was very timing sensitive; at the time of writing this
+// test would only trigger the bug about once out of every five runs.
+
+func test27660(t *testing.T) {
+	ctx, cancel := context.WithCancel(context.Background())
+	defer cancel()
+	ints := make([]int, 100)
+	locks := make([]sync.Mutex, 100)
+	// Slowly create threads so that ThreadSanitizer is forced to
+	// frequently resize its SyncClocks.
+	for i := 0; i < 100; i++ {
+		go func() {
+			for ctx.Err() == nil {
+				// Sleep in C for long enough that it is likely that the runtime
+				// will retake this goroutine's currently wired P.
+				C.usleep(1000 /* 1ms */)
+				runtime.Gosched() // avoid starvation (see #28701)
+			}
+		}()
+		go func() {
+			// Trigger lots of synchronization and memory reads/writes to
+			// increase the likelihood that the race described in #27660
+			// results in corruption of ThreadSanitizer's internal state
+			// and thus an assertion failure or segfault.
+			for ctx.Err() == nil {
+				j := rand.Intn(100)
+				locks[j].Lock()
+				ints[j]++
+				locks[j].Unlock()
+			}
+		}()
+		time.Sleep(time.Millisecond)
+	}
+}
+
+// issue 28540
+
+func twoargsF() {
+	v := []string{}
+	C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
+}
+
+// issue 28545
+
+func issue28545G(p **C.char) {
+	C.issue28545F(p, -1, (0))
+	C.issue28545F(p, 2+3, complex(1, 1))
+	C.issue28545F(p, issue28772Constant, issue28772Constant2)
+}
+
+// issue 28772 part 1 - part 2 in testx.go
+
+const issue28772Constant = C.issue28772Constant
+
+// issue 28896
+
+func offset(i int) uintptr {
+	var pi C.innerPacked
+	var po C.outerPacked
+	var ui C.innerUnpacked
+	var uo C.outerUnpacked
+	switch i {
+	case 0:
+		return unsafe.Offsetof(pi.f2)
+	case 1:
+		return unsafe.Offsetof(po.g2)
+	case 2:
+		return unsafe.Offsetof(ui.f2)
+	case 3:
+		return unsafe.Offsetof(uo.g2)
+	default:
+		panic("can't happen")
+	}
+}
+
+func test28896(t *testing.T) {
+	for i := 0; i < 4; i++ {
+		c := uintptr(C.offset(C.int(i)))
+		g := offset(i)
+		if c != g {
+			t.Errorf("%d: C: %d != Go %d", i, c, g)
+		}
+	}
+}
+
+// issue 29383
+// cgo's /*line*/ comments failed when inserted after '/',
+// because the result looked like a "//" comment.
+// No runtime test; just make sure it compiles.
+
+func Issue29383(n, size uint) int {
+	if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
+		return 0
+	}
+	return 0
+}
+
+// issue 29748
+// Error handling a struct initializer that requires pointer checking.
+// Compilation test only, nothing to run.
+
+var Vissue29748 = C.f29748(&C.S29748{
+	nil,
+})
+
+func Fissue299748() {
+	C.f29748(&C.S29748{
+		nil,
+	})
+}
+
+// issue 29781
+
+var issue29781X struct{ X int }
+
+func issue29781F(...int) int { return 0 }
+
+func issue29781G() {
+	var p *C.char
+	C.issue29781F(&p, C.ISSUE29781C+1)
+	C.issue29781F(nil, (C.int)(
+		0))
+	C.issue29781F(&p, (C.int)(0))
+	C.issue29781F(&p, (C.int)(
+		0))
+	C.issue29781F(&p, (C.int)(issue29781X.
+		X))
+}
+
+func test29878(t *testing.T) {
+	const arg uint32 = 123                    // fits into all integer types
+	var ret int16 = C.issue29878function(arg) // no conversions needed
+	if int64(ret) != int64(arg) {
+		t.Errorf("return value unexpected: got %d, want %d", ret, arg)
+	}
+}
+
+// issue 30065
+
+func test30065(t *testing.T) {
+	var a [256]byte
+	b := []byte("a")
+	C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
+	if a[0] != 'a' {
+		t.Errorf("&a failed: got %c, want %c", a[0], 'a')
+	}
+
+	b = []byte("b")
+	C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
+	if a[0] != 'b' {
+		t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
+	}
+
+	d := make([]byte, 256)
+	b = []byte("c")
+	C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
+	if d[0] != 'c' {
+		t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
+	}
+}
diff --git a/misc/cgo/test/test22906.go b/misc/cgo/test/test22906.go
deleted file mode 100644
index 02bae9c..0000000
--- a/misc/cgo/test/test22906.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build cgo
-
-package cgotest
-
-/*
-
-// It's going to be hard to include a whole real JVM to test this.
-// So we'll simulate a really easy JVM using just the parts we need.
-
-// This is the relevant part of jni.h.
-
-struct _jobject;
-
-typedef struct _jobject *jobject;
-typedef jobject jclass;
-typedef jobject jthrowable;
-typedef jobject jstring;
-typedef jobject jarray;
-typedef jarray jbooleanArray;
-typedef jarray jbyteArray;
-typedef jarray jcharArray;
-typedef jarray jshortArray;
-typedef jarray jintArray;
-typedef jarray jlongArray;
-typedef jarray jfloatArray;
-typedef jarray jdoubleArray;
-typedef jarray jobjectArray;
-
-typedef jobject jweak;
-
-// Note: jvalue is already a non-pointer type due to it being a C union.
-
-*/
-import "C"
-import (
-	"testing"
-)
-
-func test22906(t *testing.T) {
-	var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
-	_ = x1
-	var x2 C.jclass = 0
-	_ = x2
-	var x3 C.jthrowable = 0
-	_ = x3
-	var x4 C.jstring = 0
-	_ = x4
-	var x5 C.jarray = 0
-	_ = x5
-	var x6 C.jbooleanArray = 0
-	_ = x6
-	var x7 C.jbyteArray = 0
-	_ = x7
-	var x8 C.jcharArray = 0
-	_ = x8
-	var x9 C.jshortArray = 0
-	_ = x9
-	var x10 C.jintArray = 0
-	_ = x10
-	var x11 C.jlongArray = 0
-	_ = x11
-	var x12 C.jfloatArray = 0
-	_ = x12
-	var x13 C.jdoubleArray = 0
-	_ = x13
-	var x14 C.jobjectArray = 0
-	_ = x14
-	var x15 C.jweak = 0
-	_ = x15
-}
diff --git a/misc/cgo/test/test27660.go b/misc/cgo/test/test27660.go
deleted file mode 100644
index 8c23b7d..0000000
--- a/misc/cgo/test/test27660.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Stress the interaction between the race detector and cgo in an
-// attempt to reproduce the memory corruption described in #27660.
-// The bug was very timing sensitive; at the time of writing this
-// test would only trigger the bug about once out of every five runs.
-
-package cgotest
-
-// #include <unistd.h>
-import "C"
-
-import (
-	"context"
-	"math/rand"
-	"runtime"
-	"sync"
-	"testing"
-	"time"
-)
-
-func test27660(t *testing.T) {
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-	ints := make([]int, 100)
-	locks := make([]sync.Mutex, 100)
-	// Slowly create threads so that ThreadSanitizer is forced to
-	// frequently resize its SyncClocks.
-	for i := 0; i < 100; i++ {
-		go func() {
-			for ctx.Err() == nil {
-				// Sleep in C for long enough that it is likely that the runtime
-				// will retake this goroutine's currently wired P.
-				C.usleep(1000 /* 1ms */)
-				runtime.Gosched() // avoid starvation (see #28701)
-			}
-		}()
-		go func() {
-			// Trigger lots of synchronization and memory reads/writes to
-			// increase the likelihood that the race described in #27660
-			// results in corruption of ThreadSanitizer's internal state
-			// and thus an assertion failure or segfault.
-			for ctx.Err() == nil {
-				j := rand.Intn(100)
-				locks[j].Lock()
-				ints[j]++
-				locks[j].Unlock()
-			}
-		}()
-		time.Sleep(time.Millisecond)
-	}
-}
diff --git a/misc/cgo/test/issue29878export.go b/misc/cgo/test/test_unix.go
similarity index 63%
rename from misc/cgo/test/issue29878export.go
rename to misc/cgo/test/test_unix.go
index 59727c7..4a23446 100644
--- a/misc/cgo/test/issue29878export.go
+++ b/misc/cgo/test/test_unix.go
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build !windows
+
 package cgotest
 
-import "C"
+import "syscall"
 
-//export issue29878exported
-func issue29878exported(arg int8) uint64 {
-	return uint64(arg)
-}
+var syscall_dot_SIGCHLD = syscall.SIGCHLD
diff --git a/misc/cgo/test/issue29878export.go b/misc/cgo/test/test_windows.go
similarity index 63%
copy from misc/cgo/test/issue29878export.go
copy to misc/cgo/test/test_windows.go
index 59727c7..7bfb33a 100644
--- a/misc/cgo/test/issue29878export.go
+++ b/misc/cgo/test/test_windows.go
@@ -4,9 +4,6 @@
 
 package cgotest
 
-import "C"
+import "syscall"
 
-//export issue29878exported
-func issue29878exported(arg int8) uint64 {
-	return uint64(arg)
-}
+var syscall_dot_SIGCHLD syscall.Signal
diff --git a/misc/cgo/test/testx.go b/misc/cgo/test/testx.go
new file mode 100644
index 0000000..b0b23e3
--- /dev/null
+++ b/misc/cgo/test/testx.go
@@ -0,0 +1,542 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test cases for cgo.
+// Both the import "C" prologue and the main file are sorted by issue number.
+// This file contains //export directives on Go functions
+// and so it must NOT contain C definitions (only declarations).
+// See test.go for C definitions.
+
+package cgotest
+
+import (
+	"runtime"
+	"runtime/debug"
+	"strings"
+	"sync"
+	"sync/atomic"
+	"testing"
+	"time"
+	"unsafe"
+)
+
+/*
+// threads
+extern void doAdd(int, int);
+
+// issue 1328
+extern void BackIntoGo(void);
+void IntoC(void);
+
+// issue 1560
+// mysleep returns the absolute start time in ms.
+long long mysleep(int seconds);
+
+// twoSleep returns the absolute start time of the first sleep
+// in ms.
+long long twoSleep(int);
+
+// issue 3775
+void lockOSThreadCallback(void);
+inline static void lockOSThreadC(void)
+{
+        lockOSThreadCallback();
+}
+int usleep(unsigned usec);
+
+// issue 4054 part 2 - part 1 in test.go
+typedef enum {
+	A = 0,
+	B,
+	C,
+	D,
+	E,
+	F,
+	G,
+	H,
+	II,
+	J,
+} issue4054b;
+
+// issue 5548
+
+extern int issue5548_in_c(void);
+
+// issue 6833
+
+extern unsigned long long issue6833Func(unsigned int, unsigned long long);
+
+// issue 6907
+
+extern int CheckIssue6907C(_GoString_);
+
+// issue 7665
+
+extern void f7665(void);
+
+// issue 7978
+// Stack tracing didn't work during cgo code after calling a Go
+// callback.  Make sure GC works and the stack trace is correct.
+
+#include <stdint.h>
+
+void issue7978cb(void);
+
+#if defined(__APPLE__) && defined(__arm__)
+// on Darwin/ARM, libSystem doesn't provide implementation of the __sync_fetch_and_add
+// primitive, and although gcc supports it, it doesn't inline its definition.
+// Clang could inline its definition, so we require clang on Darwin/ARM.
+#if defined(__clang__)
+#define HAS_SYNC_FETCH_AND_ADD 1
+#else
+#define HAS_SYNC_FETCH_AND_ADD 0
+#endif
+#else
+#define HAS_SYNC_FETCH_AND_ADD 1
+#endif
+
+// use ugly atomic variable sync since that doesn't require calling back into
+// Go code or OS dependencies
+static void issue7978c(uint32_t *sync) {
+#if HAS_SYNC_FETCH_AND_ADD
+	while(__sync_fetch_and_add(sync, 0) != 0)
+		;
+	__sync_fetch_and_add(sync, 1);
+	while(__sync_fetch_and_add(sync, 0) != 2)
+		;
+	issue7978cb();
+	__sync_fetch_and_add(sync, 1);
+	while(__sync_fetch_and_add(sync, 0) != 6)
+		;
+#endif
+}
+
+// issue 8331 part 2 - part 1 in test.go
+// A typedef of an unnamed struct is the same struct when
+// #include'd twice.  No runtime test; just make sure it compiles.
+#include "issue8331.h"
+
+// issue 20910
+void callMulti(void);
+
+// issue 28772 part 2 - part 1 in issuex.go
+#define issue28772Constant2 2
+
+*/
+import "C"
+
+// exports
+
+//export ReturnIntLong
+func ReturnIntLong() (int, C.long) {
+	return 1, 2
+}
+
+//export gc
+func gc() {
+	runtime.GC()
+}
+
+// threads
+
+var sum struct {
+	sync.Mutex
+	i int
+}
+
+//export Add
+func Add(x int) {
+	defer func() {
+		recover()
+	}()
+	sum.Lock()
+	sum.i += x
+	sum.Unlock()
+	var p *int
+	*p = 2
+}
+
+func testCthread(t *testing.T) {
+	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
+		t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
+	}
+	sum.i = 0
+	C.doAdd(10, 6)
+
+	want := 10 * (10 - 1) / 2 * 6
+	if sum.i != want {
+		t.Fatalf("sum=%d, want %d", sum.i, want)
+	}
+}
+
+// issue 1328
+
+//export BackIntoGo
+func BackIntoGo() {
+	x := 1
+
+	for i := 0; i < 10000; i++ {
+		xvariadic(x)
+		if x != 1 {
+			panic("x is not 1?")
+		}
+	}
+}
+
+func xvariadic(x ...interface{}) {
+}
+
+func test1328(t *testing.T) {
+	C.IntoC()
+}
+
+// issue 1560
+
+var sleepDone = make(chan int64)
+
+// parallelSleep returns the absolute difference between the start time
+// of the two sleeps.
+func parallelSleep(n int) int64 {
+	t := int64(C.twoSleep(C.int(n))) - <-sleepDone
+	if t < 0 {
+		return -t
+	}
+	return t
+}
+
+//export BackgroundSleep
+func BackgroundSleep(n int32) {
+	go func() {
+		sleepDone <- int64(C.mysleep(C.int(n)))
+	}()
+}
+
+func testParallelSleep(t *testing.T) {
+	sleepSec := 1
+	dt := time.Duration(parallelSleep(sleepSec)) * time.Millisecond
+	t.Logf("difference in start time for two sleep(%d) is %v", sleepSec, dt)
+	// bug used to run sleeps in serial, producing a 2*sleepSec-second delay.
+	// we detect if the start times of those sleeps are > 0.5*sleepSec-second.
+	if dt >= time.Duration(sleepSec)*time.Second/2 {
+		t.Fatalf("parallel %d-second sleeps slept for %f seconds", sleepSec, dt.Seconds())
+	}
+}
+
+// issue 2462
+
+//export exportbyte
+func exportbyte() byte {
+	return 0
+}
+
+//export exportbool
+func exportbool() bool {
+	return false
+}
+
+//export exportrune
+func exportrune() rune {
+	return 0
+}
+
+//export exporterror
+func exporterror() error {
+	return nil
+}
+
+//export exportint
+func exportint() int {
+	return 0
+}
+
+//export exportuint
+func exportuint() uint {
+	return 0
+}
+
+//export exportuintptr
+func exportuintptr() uintptr {
+	return (uintptr)(0)
+}
+
+//export exportint8
+func exportint8() int8 {
+	return 0
+}
+
+//export exportuint8
+func exportuint8() uint8 {
+	return 0
+}
+
+//export exportint16
+func exportint16() int16 {
+	return 0
+}
+
+//export exportuint16
+func exportuint16() uint16 {
+	return 0
+}
+
+//export exportint32
+func exportint32() int32 {
+	return 0
+}
+
+//export exportuint32
+func exportuint32() uint32 {
+	return 0
+}
+
+//export exportint64
+func exportint64() int64 {
+	return 0
+}
+
+//export exportuint64
+func exportuint64() uint64 {
+	return 0
+}
+
+//export exportfloat32
+func exportfloat32() float32 {
+	return 0
+}
+
+//export exportfloat64
+func exportfloat64() float64 {
+	return 0
+}
+
+//export exportcomplex64
+func exportcomplex64() complex64 {
+	return 0
+}
+
+//export exportcomplex128
+func exportcomplex128() complex128 {
+	return 0
+}
+
+// issue 3741
+
+//export exportSliceIn
+func exportSliceIn(s []byte) bool {
+	return len(s) == cap(s)
+}
+
+//export exportSliceOut
+func exportSliceOut() []byte {
+	return []byte{1}
+}
+
+//export exportSliceInOut
+func exportSliceInOut(s []byte) []byte {
+	return s
+}
+
+// issue 3775
+
+func init() {
+	if runtime.GOOS == "android" {
+		return
+	}
+	// Same as test3775 but run during init so that
+	// there are two levels of internal runtime lock
+	// (1 for init, 1 for cgo).
+	// This would have been broken by CL 11663043.
+	C.lockOSThreadC()
+}
+
+func test3775(t *testing.T) {
+	if runtime.GOOS == "android" {
+		return
+	}
+	// Used to panic because of the UnlockOSThread below.
+	C.lockOSThreadC()
+}
+
+//export lockOSThreadCallback
+func lockOSThreadCallback() {
+	runtime.LockOSThread()
+	runtime.UnlockOSThread()
+	go C.usleep(10000)
+	runtime.Gosched()
+}
+
+// issue 4054 part 2 - part 1 in test.go
+
+var issue4054b = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.II, C.J}
+
+//export issue5548FromC
+func issue5548FromC(s string, i int) int {
+	if len(s) == 4 && s == "test" && i == 42 {
+		return 12345
+	}
+	println("got", len(s), i)
+	return 9876
+}
+
+func test5548(t *testing.T) {
+	if x := C.issue5548_in_c(); x != 12345 {
+		t.Errorf("issue5548_in_c = %d, want %d", x, 12345)
+	}
+}
+
+// issue 6833
+
+//export GoIssue6833Func
+func GoIssue6833Func(aui uint, aui64 uint64) uint64 {
+	return aui64 + uint64(aui)
+}
+
+func test6833(t *testing.T) {
+	ui := 7
+	ull := uint64(0x4000300020001000)
+	v := uint64(C.issue6833Func(C.uint(ui), C.ulonglong(ull)))
+	exp := uint64(ui) + ull
+	if v != exp {
+		t.Errorf("issue6833Func() returns %x, expected %x", v, exp)
+	}
+}
+
+// issue 6907
+
+const CString = "C string"
+
+//export CheckIssue6907Go
+func CheckIssue6907Go(s string) C.int {
+	if s == CString {
+		return 1
+	}
+	return 0
+}
+
+func test6907Go(t *testing.T) {
+	if got := C.CheckIssue6907C(CString); got != 1 {
+		t.Errorf("C.CheckIssue6907C() == %d, want %d", got, 1)
+	}
+}
+
+// issue 7665
+
+//export f7665
+func f7665() {}
+
+var bad7665 unsafe.Pointer = C.f7665
+var good7665 uintptr = uintptr(C.f7665)
+
+func test7665(t *testing.T) {
+	if bad7665 == nil || uintptr(bad7665) != good7665 {
+		t.Errorf("ptrs = %p, %#x, want same non-nil pointer", bad7665, good7665)
+	}
+}
+
+// issue 7978
+
+var issue7978sync uint32
+
+func issue7978check(t *testing.T, wantFunc string, badFunc string, depth int) {
+	runtime.GC()
+	buf := make([]byte, 65536)
+	trace := string(buf[:runtime.Stack(buf, true)])
+	for _, goroutine := range strings.Split(trace, "\n\n") {
+		if strings.Contains(goroutine, "test.issue7978go") {
+			trace := strings.Split(goroutine, "\n")
+			// look for the expected function in the stack
+			for i := 0; i < depth; i++ {
+				if badFunc != "" && strings.Contains(trace[1+2*i], badFunc) {
+					t.Errorf("bad stack: found %s in the stack:\n%s", badFunc, goroutine)
+					return
+				}
+				if strings.Contains(trace[1+2*i], wantFunc) {
+					return
+				}
+			}
+			t.Errorf("bad stack: didn't find %s in the stack:\n%s", wantFunc, goroutine)
+			return
+		}
+	}
+	t.Errorf("bad stack: goroutine not found. Full stack dump:\n%s", trace)
+}
+
+func issue7978wait(store uint32, wait uint32) {
+	if store != 0 {
+		atomic.StoreUint32(&issue7978sync, store)
+	}
+	for atomic.LoadUint32(&issue7978sync) != wait {
+		runtime.Gosched()
+	}
+}
+
+//export issue7978cb
+func issue7978cb() {
+	// Force a stack growth from the callback to put extra
+	// pressure on the runtime. See issue #17785.
+	growStack(64)
+	issue7978wait(3, 4)
+}
+
+func growStack(n int) int {
+	var buf [128]int
+	if n == 0 {
+		return 0
+	}
+	return buf[growStack(n-1)]
+}
+
+func issue7978go() {
+	C.issue7978c((*C.uint32_t)(&issue7978sync))
+	issue7978wait(7, 8)
+}
+
+func test7978(t *testing.T) {
+	if runtime.Compiler == "gccgo" {
+		t.Skip("gccgo can not do stack traces of C code")
+	}
+	if C.HAS_SYNC_FETCH_AND_ADD == 0 {
+		t.Skip("clang required for __sync_fetch_and_add support on darwin/arm")
+	}
+	debug.SetTraceback("2")
+	issue7978sync = 0
+	go issue7978go()
+	// test in c code, before callback
+	issue7978wait(0, 1)
+	issue7978check(t, "_Cfunc_issue7978c(", "", 1)
+	// test in go code, during callback
+	issue7978wait(2, 3)
+	issue7978check(t, "test.issue7978cb(", "test.issue7978go", 3)
+	// test in c code, after callback
+	issue7978wait(4, 5)
+	issue7978check(t, "_Cfunc_issue7978c(", "_cgoexpwrap", 1)
+	// test in go code, after return from cgo
+	issue7978wait(6, 7)
+	issue7978check(t, "test.issue7978go(", "", 3)
+	atomic.StoreUint32(&issue7978sync, 8)
+}
+
+// issue 8331 part 2
+
+var issue8331Var C.issue8331
+
+// issue 20910
+
+//export multi
+func multi() (*C.char, C.int) {
+	return C.CString("multi"), 0
+}
+
+func test20910(t *testing.T) {
+	C.callMulti()
+}
+
+// issue 28772 part 2
+
+const issue28772Constant2 = C.issue28772Constant2
+
+//export issue29878exported
+func issue29878exported(arg int8) uint64 {
+	return uint64(arg)
+}
diff --git a/misc/cgo/test/twoargs.go b/misc/cgo/test/twoargs.go
deleted file mode 100644
index ca0534c..0000000
--- a/misc/cgo/test/twoargs.go
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Crash from call with two arguments that need pointer checking.
-// No runtime test; just make sure it compiles.
-
-package cgotest
-
-/*
-static void twoargs1(void *p, int n) {}
-static void *twoargs2() { return 0; }
-static int twoargs3(void * p) { return 0; }
-*/
-import "C"
-
-import "unsafe"
-
-func twoargsF() {
-	v := []string{}
-	C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
-}
diff --git a/src/archive/zip/zip_test.go b/src/archive/zip/zip_test.go
index efdb5bd..b3a7caa 100644
--- a/src/archive/zip/zip_test.go
+++ b/src/archive/zip/zip_test.go
@@ -11,7 +11,6 @@
 	"errors"
 	"fmt"
 	"hash"
-	"internal/race"
 	"internal/testenv"
 	"io"
 	"io/ioutil"
@@ -309,7 +308,7 @@
 // Tests that we generate a zip64 file if the directory at offset
 // 0xFFFFFFFF, but not before.
 func TestZip64DirectoryOffset(t *testing.T) {
-	if testing.Short() && race.Enabled {
+	if testing.Short() {
 		t.Skip("skipping in short mode")
 	}
 	t.Parallel()
@@ -354,7 +353,7 @@
 
 // At 16k records, we need to generate a zip64 file.
 func TestZip64ManyRecords(t *testing.T) {
-	if testing.Short() && race.Enabled {
+	if testing.Short() {
 		t.Skip("skipping in short mode")
 	}
 	t.Parallel()
diff --git a/src/bufio/scan.go b/src/bufio/scan.go
index cefd261..4e787c4 100644
--- a/src/bufio/scan.go
+++ b/src/bufio/scan.go
@@ -73,7 +73,7 @@
 
 const (
 	// MaxScanTokenSize is the maximum size used to buffer a token
-	// unless the user provides an explicit buffer with Scan.Buffer.
+	// unless the user provides an explicit buffer with Scanner.Buffer.
 	// The actual maximum token size may be smaller as the buffer
 	// may need to include, for instance, a newline.
 	MaxScanTokenSize = 64 * 1024
diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go
index c74ee9b..b46b310 100644
--- a/src/cmd/api/goapi.go
+++ b/src/cmd/api/goapi.go
@@ -144,7 +144,7 @@
 	} else {
 		stds, err := exec.Command(goCmd(), "list", "std").Output()
 		if err != nil {
-			log.Fatal(err)
+			log.Fatalf("go list std: %v\n%s", err, stds)
 		}
 		for _, pkg := range strings.Fields(string(stds)) {
 			if !internalPkg.MatchString(pkg) {
@@ -153,10 +153,25 @@
 		}
 	}
 
+	importDir, importMap := loadImports()
+
+	// The code below assumes that the import map can vary
+	// by package, so that an import in one package (directory) might mean
+	// something different from the same import in another.
+	// While this can happen in GOPATH mode with vendoring,
+	// it is not possible in the standard library: the one importMap
+	// returned by loadImports applies to all packages.
+	// Construct a per-directory importMap that resolves to
+	// that single map for all packages.
+	importMapForDir := make(map[string]map[string]string)
+	for _, dir := range importDir {
+		importMapForDir[dir] = importMap
+	}
 	var featureCtx = make(map[string]map[string]bool) // feature -> context name -> true
 	for _, context := range contexts {
 		w := NewWalker(context, filepath.Join(build.Default.GOROOT, "src"))
-		w.loadImports(pkgNames, w.context)
+		w.importDir = importDir
+		w.importMap = importMapForDir
 
 		for _, name := range pkgNames {
 			// Vendored packages do not contribute to our
@@ -440,58 +455,58 @@
 	return key
 }
 
-func (w *Walker) loadImports(paths []string, context *build.Context) {
-	if context == nil {
-		context = &build.Default
-	}
-
-	var (
-		tags       = context.BuildTags
-		cgoEnabled = "0"
-	)
-	if context.CgoEnabled {
-		tags = append(tags[:len(tags):len(tags)], "cgo")
-		cgoEnabled = "1"
-	}
-
-	// TODO(golang.org/issue/29666): Request only the fields that we need.
-	cmd := exec.Command(goCmd(), "list", "-e", "-deps", "-json")
-	if len(tags) > 0 {
-		cmd.Args = append(cmd.Args, "-tags", strings.Join(tags, " "))
-	}
-	cmd.Args = append(cmd.Args, paths...)
-
-	cmd.Env = append(os.Environ(),
-		"GOOS="+context.GOOS,
-		"GOARCH="+context.GOARCH,
-		"CGO_ENABLED="+cgoEnabled,
-	)
-
-	stdout := new(bytes.Buffer)
-	cmd.Stdout = stdout
-	cmd.Stderr = new(strings.Builder)
-	err := cmd.Run()
+// loadImports returns information about the packages in the standard library
+// and the packages they themselves import.
+// importDir maps expanded import path to the directory containing that package.
+// importMap maps source import path to expanded import path.
+// The source import path and expanded import path are identical except for vendored packages.
+// For example, on return:
+//
+//	importMap["math"] = "math"
+//	importDir["math"] = "<goroot>/src/math"
+//
+//	importMap["golang.org/x/net/route"] = "vendor/golang.org/x/net/route"
+//	importDir["vendor/golang.org/x/net/route"] = "<goroot>/src/vendor/golang.org/x/net/route"
+//
+// There are a few imports that only appear on certain platforms,
+// including it turns out x/net/route, and we add those explicitly.
+func loadImports() (importDir map[string]string, importMap map[string]string) {
+	out, err := exec.Command(goCmd(), "list", "-e", "-deps", "-json", "std").CombinedOutput()
 	if err != nil {
-		log.Fatalf("%s failed: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
+		log.Fatalf("loading imports: %v\n%s", err, out)
 	}
 
-	w.importDir = make(map[string]string)
-	w.importMap = make(map[string]map[string]string)
-	dec := json.NewDecoder(stdout)
+	importDir = make(map[string]string)
+	importMap = make(map[string]string)
+	dec := json.NewDecoder(bytes.NewReader(out))
 	for {
 		var pkg struct {
 			ImportPath, Dir string
 			ImportMap       map[string]string
 		}
-		if err := dec.Decode(&pkg); err == io.EOF {
+		err := dec.Decode(&pkg)
+		if err == io.EOF {
 			break
-		} else if err != nil {
-			log.Fatalf("%s: invalid output: %v", strings.Join(cmd.Args, " "), err)
+		}
+		if err != nil {
+			log.Fatalf("go list: invalid output: %v", err)
 		}
 
-		w.importDir[pkg.ImportPath] = pkg.Dir
-		w.importMap[pkg.Dir] = pkg.ImportMap
+		importDir[pkg.ImportPath] = pkg.Dir
+		for k, v := range pkg.ImportMap {
+			importMap[k] = v
+		}
 	}
+
+	// Fixup for vendor packages listed in args above.
+	fixup := []string{
+		"vendor/golang.org/x/net/route",
+	}
+	for _, pkg := range fixup {
+		importDir[pkg] = filepath.Join(build.Default.GOROOT, "src", pkg)
+		importMap[strings.TrimPrefix(pkg, "vendor/")] = pkg
+	}
+	return
 }
 
 // Importing is a sentinel taking the place in Walker.imported
@@ -523,7 +538,7 @@
 		dir = filepath.Join(w.root, filepath.FromSlash(name))
 	}
 	if fi, err := os.Stat(dir); err != nil || !fi.IsDir() {
-		log.Fatalf("no source in tree for import %q: %v", name, err)
+		log.Fatalf("no source in tree for import %q (from import %s in %s): %v", name, fromPath, fromDir, err)
 	}
 
 	context := w.context
diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go
index 89e2a4e..397162d 100644
--- a/src/cmd/compile/internal/gc/closure.go
+++ b/src/cmd/compile/internal/gc/closure.go
@@ -186,7 +186,7 @@
 		outermost := v.Name.Defn
 
 		// out parameters will be assigned to implicitly upon return.
-		if outer.Class() != PPARAMOUT && !outermost.Addrtaken() && !outermost.Assigned() && v.Type.Width <= 128 {
+		if outermost.Class() != PPARAMOUT && !outermost.Addrtaken() && !outermost.Assigned() && v.Type.Width <= 128 {
 			v.Name.SetByval(true)
 		} else {
 			outermost.SetAddrtaken(true)
diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go
index 6467aaf..8157292 100644
--- a/src/cmd/compile/internal/gc/init.go
+++ b/src/cmd/compile/internal/gc/init.go
@@ -37,10 +37,8 @@
 	var fns []*obj.LSym  // functions to call for package initialization
 
 	// Find imported packages with init tasks.
-	for _, p := range types.ImportedPkgList() {
-		if s, ok := p.LookupOK(".inittask"); ok {
-			deps = append(deps, s.Linksym())
-		}
+	for _, s := range types.InitSyms {
+		deps = append(deps, s.Linksym())
 	}
 
 	// Make a function that contains all the initialization statements.
diff --git a/src/cmd/compile/internal/gc/norace.go b/src/cmd/compile/internal/gc/norace.go
deleted file mode 100644
index e00f0c4..0000000
--- a/src/cmd/compile/internal/gc/norace.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !race
-
-package gc
-
-const raceEnabled = false
diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go
index 2ae7452..dd2294e 100644
--- a/src/cmd/compile/internal/gc/pgen.go
+++ b/src/cmd/compile/internal/gc/pgen.go
@@ -13,6 +13,7 @@
 	"cmd/internal/src"
 	"cmd/internal/sys"
 	"fmt"
+	"internal/race"
 	"math/rand"
 	"sort"
 	"sync"
@@ -325,7 +326,7 @@
 }
 
 func init() {
-	if raceEnabled {
+	if race.Enabled {
 		rand.Seed(time.Now().UnixNano())
 	}
 }
@@ -336,7 +337,7 @@
 func compileFunctions() {
 	if len(compilequeue) != 0 {
 		sizeCalculationDisabled = true // not safe to calculate sizes concurrently
-		if raceEnabled {
+		if race.Enabled {
 			// Randomize compilation order to try to shake out races.
 			tmp := make([]*Node, len(compilequeue))
 			perm := rand.Perm(len(compilequeue))
diff --git a/src/cmd/compile/internal/gc/race.go b/src/cmd/compile/internal/gc/race.go
deleted file mode 100644
index 78e1997..0000000
--- a/src/cmd/compile/internal/gc/race.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build race
-
-package gc
-
-const raceEnabled = true
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index cafff01..f9ccf84 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -5123,7 +5123,7 @@
 	return p
 }
 
-// DebugFriendlySetPos adjusts Pos.IsStmt subject to heuristics
+// DebugFriendlySetPosFrom adjusts Pos.IsStmt subject to heuristics
 // that reduce "jumpy" line number churn when debugging.
 // Spill/fill/copy instructions from the register allocator,
 // phi functions, and instructions with a no-pos position
diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go
index 12bc9c3..9f6646a 100644
--- a/src/cmd/compile/internal/gc/syntax.go
+++ b/src/cmd/compile/internal/gc/syntax.go
@@ -280,7 +280,7 @@
 	return n.Op == ONAME && n.Left != nil && n.Left.Op == OTYPE && n.Right != nil && n.Right.Op == ONAME
 }
 
-// funcname returns the name of the function n.
+// funcname returns the name (without the package) of the function n.
 func (n *Node) funcname() string {
 	if n == nil || n.Func == nil || n.Func.Nname == nil {
 		return "<nil>"
diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go
index 81f5901..4cb28d6 100644
--- a/src/cmd/compile/internal/gc/typecheck.go
+++ b/src/cmd/compile/internal/gc/typecheck.go
@@ -3671,7 +3671,11 @@
 					n.SetDiag(true)
 					goto ret
 				}
-				n.Sym.Def = asTypesNode(p.Ntype)
+				// For package-level type aliases, set n.Sym.Def so we can identify
+				// it as a type alias during export. See also #31959.
+				if n.Name.Curfn == nil {
+					n.Sym.Def = asTypesNode(p.Ntype)
+				}
 			}
 			break
 		}
diff --git a/src/cmd/compile/internal/ssa/dom.go b/src/cmd/compile/internal/ssa/dom.go
index ee2748e..3d186fc 100644
--- a/src/cmd/compile/internal/ssa/dom.go
+++ b/src/cmd/compile/internal/ssa/dom.go
@@ -20,7 +20,7 @@
 // postorder computes a postorder traversal ordering for the
 // basic blocks in f. Unreachable blocks will not appear.
 func postorder(f *Func) []*Block {
-	return postorderWithNumbering(f, []int32{})
+	return postorderWithNumbering(f, nil)
 }
 
 type blockAndIndex struct {
@@ -34,7 +34,7 @@
 	mark := make([]markKind, f.NumBlocks())
 
 	// result ordering
-	var order []*Block
+	order := make([]*Block, 0, len(f.Blocks))
 
 	// stack of blocks and next child to visit
 	// A constant bound allows this to be stack-allocated. 32 is
diff --git a/src/cmd/compile/internal/types/pkg.go b/src/cmd/compile/internal/types/pkg.go
index e502b98..bcc6789 100644
--- a/src/cmd/compile/internal/types/pkg.go
+++ b/src/cmd/compile/internal/types/pkg.go
@@ -84,6 +84,7 @@
 	return s
 }
 
+// List of .inittask entries in imported packages, in source code order.
 var InitSyms []*Sym
 
 // LookupOK looks up name in pkg and reports whether it previously existed.
@@ -100,7 +101,7 @@
 		Name: name,
 		Pkg:  pkg,
 	}
-	if name == "init" {
+	if name == ".inittask" {
 		InitSyms = append(InitSyms, s)
 	}
 	pkg.Syms[name] = s
diff --git a/src/cmd/compile/internal/types/sym.go b/src/cmd/compile/internal/types/sym.go
index 13761c7..2779c36 100644
--- a/src/cmd/compile/internal/types/sym.go
+++ b/src/cmd/compile/internal/types/sym.go
@@ -11,14 +11,20 @@
 	"unicode/utf8"
 )
 
-// Sym represents an object name. Most commonly, this is a Go identifier naming
-// an object declared within a package, but Syms are also used to name internal
-// synthesized objects.
+// Sym represents an object name in a segmented (pkg, name) namespace.
+// Most commonly, this is a Go identifier naming an object declared within a package,
+// but Syms are also used to name internal synthesized objects.
 //
 // As an exception, field and method names that are exported use the Sym
 // associated with localpkg instead of the package that declared them. This
 // allows using Sym pointer equality to test for Go identifier uniqueness when
 // handling selector expressions.
+//
+// Ideally, Sym should be used for representing Go language constructs,
+// while cmd/internal/obj.LSym is used for representing emitted artifacts.
+//
+// NOTE: In practice, things can be messier than the description above
+// for various reasons (historical, convenience).
 type Sym struct {
 	Importdef *Pkg   // where imported definition was found
 	Linkname  string // link name
diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go
index 190b592..b434d4f6 100644
--- a/src/cmd/dist/buildtool.go
+++ b/src/cmd/dist/buildtool.go
@@ -90,6 +90,7 @@
 	"debug/macho",
 	"debug/pe",
 	"internal/goversion",
+	"internal/race",
 	"internal/xcoff",
 	"math/big",
 	"math/bits",
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go
index 56ab64b..f63c9469 100644
--- a/src/cmd/dist/test.go
+++ b/src/cmd/dist/test.go
@@ -12,6 +12,7 @@
 	"log"
 	"os"
 	"os/exec"
+	"path"
 	"path/filepath"
 	"reflect"
 	"regexp"
@@ -277,8 +278,17 @@
 	return "-tags="
 }
 
+// timeoutDuration converts the provided number of seconds into a
+// time.Duration, scaled by the t.timeoutScale factor.
+func (t *tester) timeoutDuration(sec int) time.Duration {
+	return time.Duration(sec) * time.Second * time.Duration(t.timeoutScale)
+}
+
+// timeout returns the "-timeout=" string argument to "go test" given
+// the number of seconds of timeout. It scales it by the
+// t.timeoutScale factor.
 func (t *tester) timeout(sec int) string {
-	return "-timeout=" + fmt.Sprint(time.Duration(sec)*time.Second*time.Duration(t.timeoutScale))
+	return "-timeout=" + t.timeoutDuration(sec).String()
 }
 
 // ranGoTest and stdMatches are state closed over by the stdlib
@@ -319,6 +329,11 @@
 					break
 				}
 			}
+			// Special case for our slow cross-compiled
+			// qemu builders:
+			if t.shouldUsePrecompiledStdTest() {
+				return t.runPrecompiledStdTest(t.timeoutDuration(timeoutSec))
+			}
 			args := []string{
 				"test",
 				short(),
@@ -551,7 +566,9 @@
 			name:    "nolibgcc:" + pkg,
 			heading: "Testing without libgcc.",
 			fn: func(dt *distTest) error {
-				t.addCmd(dt, "src", t.goTest(), "-ldflags=-linkmode=internal -libgcc=none", pkg, t.runFlag(run))
+				// What matters is that the tests build and start up.
+				// Skip expensive tests, especially x509 TestSystemRoots.
+				t.addCmd(dt, "src", t.goTest(), "-ldflags=-linkmode=internal -libgcc=none", "-run=^Test[^CS]", pkg, t.runFlag(run))
 				return nil
 			},
 		})
@@ -693,7 +710,10 @@
 	}
 
 	if goos != "android" && !t.iOS() {
-		t.registerTest("bench_go1", "../test/bench/go1", t.goTest(), t.timeout(600))
+		// There are no tests in this directory, only benchmarks.
+		// Check that the test binary builds but don't bother running it.
+		// (It has init-time work to set up for the benchmarks that is not worth doing unnecessarily.)
+		t.registerTest("bench_go1", "../test/bench/go1", t.goTest(), "-c", "-o="+os.DevNull)
 	}
 	if goos != "android" && !t.iOS() {
 		// Only start multiple test dir shards on builders,
@@ -1292,8 +1312,12 @@
 	// TODO(iant): Figure out how to catch this.
 	// t.addCmd(dt, "src", t.goTest(),  "-race", "-run=TestParallelTest", "cmd/go")
 	if t.cgoEnabled {
-		cmd := t.addCmd(dt, "misc/cgo/test", t.goTest(), "-race")
-		cmd.Env = append(os.Environ(), "GOTRACEBACK=2")
+		// Building misc/cgo/test takes a long time.
+		// There are already cgo-enabled packages being tested with the race detector.
+		// We shouldn't need to redo all of misc/cgo/test too.
+		// The race buildler will take care of this.
+		// cmd := t.addCmd(dt, "misc/cgo/test", t.goTest(), "-race")
+		// cmd.Env = append(os.Environ(), "GOTRACEBACK=2")
 	}
 	if t.extLink() {
 		// Test with external linking; see issue 9133.
@@ -1407,6 +1431,60 @@
 	}
 }
 
+// shouldUsePrecompiledStdTest reports whether "dist test" should use
+// a pre-compiled go test binary on disk rather than running "go test"
+// and compiling it again. This is used by our slow qemu-based builder
+// that do full processor emulation where we cross-compile the
+// make.bash step as well as pre-compile each std test binary.
+//
+// This only reports true if dist is run with an single go_test:foo
+// argument (as the build coordinator does with our slow qemu-based
+// builders), we're in a builder environment ("GO_BUILDER_NAME" is set),
+// and the pre-built test binary exists.
+func (t *tester) shouldUsePrecompiledStdTest() bool {
+	bin := t.prebuiltGoPackageTestBinary()
+	if bin == "" {
+		return false
+	}
+	_, err := os.Stat(bin)
+	return err == nil
+}
+
+// prebuiltGoPackageTestBinary returns the path where we'd expect
+// the pre-built go test binary to be on disk when dist test is run with
+// a single argument.
+// It returns an empty string if a pre-built binary should not be used.
+func (t *tester) prebuiltGoPackageTestBinary() string {
+	if len(stdMatches) != 1 || t.race || t.compileOnly || os.Getenv("GO_BUILDER_NAME") == "" {
+		return ""
+	}
+	pkg := stdMatches[0]
+	return filepath.Join(os.Getenv("GOROOT"), "src", pkg, path.Base(pkg)+".test")
+}
+
+// runPrecompiledStdTest runs the pre-compiled standard library package test binary.
+// See shouldUsePrecompiledStdTest above; it must return true for this to be called.
+func (t *tester) runPrecompiledStdTest(timeout time.Duration) error {
+	bin := t.prebuiltGoPackageTestBinary()
+	fmt.Fprintf(os.Stderr, "# %s: using pre-built %s...\n", stdMatches[0], bin)
+	cmd := exec.Command(bin, "-test.short", "-test.timeout="+timeout.String())
+	cmd.Dir = filepath.Dir(bin)
+	cmd.Stdout = os.Stdout
+	cmd.Stderr = os.Stderr
+	if err := cmd.Start(); err != nil {
+		return err
+	}
+	// And start a timer to kill the process if it doesn't kill
+	// itself in the prescribed timeout.
+	const backupKillFactor = 1.05 // add 5%
+	timer := time.AfterFunc(time.Duration(float64(timeout)*backupKillFactor), func() {
+		fmt.Fprintf(os.Stderr, "# %s: timeout running %s; killing...\n", stdMatches[0], bin)
+		cmd.Process.Kill()
+	})
+	defer timer.Stop()
+	return cmd.Wait()
+}
+
 // raceDetectorSupported is a copy of the function
 // cmd/internal/sys.RaceDetectorSupported, which can't be used here
 // because cmd/dist has to be buildable by Go 1.4.
diff --git a/src/cmd/doc/doc_test.go b/src/cmd/doc/doc_test.go
index 22468db..bc870ac 100644
--- a/src/cmd/doc/doc_test.go
+++ b/src/cmd/doc/doc_test.go
@@ -602,6 +602,19 @@
 			`Comment about exported interface`,
 		},
 	},
+	// Interface method at package level.
+	{
+		"interface method at package level",
+		[]string{p, `ExportedMethod`},
+		[]string{
+			`func \(ExportedType\) ExportedMethod\(a int\) bool`,
+			`Comment about exported method`,
+		},
+		[]string{
+			`Comment before exported method.*\n.*ExportedMethod\(\)` +
+				`.*Comment on line with exported method`,
+		},
+	},
 
 	// Method.
 	{
diff --git a/src/cmd/doc/pkg.go b/src/cmd/doc/pkg.go
index 12b76c2..32810bd 100644
--- a/src/cmd/doc/pkg.go
+++ b/src/cmd/doc/pkg.go
@@ -914,8 +914,8 @@
 }
 
 // printMethodDoc prints the docs for matches of symbol.method.
-// If symbol is empty, it prints all methods that match the name.
-// It reports whether it found any methods.
+// If symbol is empty, it prints all methods for any concrete type
+// that match the name. It reports whether it found any methods.
 func (pkg *Package) printMethodDoc(symbol, method string) bool {
 	defer pkg.flush()
 	types := pkg.findTypes(symbol)
@@ -937,6 +937,9 @@
 			}
 			continue
 		}
+		if symbol == "" {
+			continue
+		}
 		// Type may be an interface. The go/doc package does not attach
 		// an interface's methods to the doc.Type. We need to dig around.
 		spec := pkg.findTypeSpec(typ.Decl, typ.Name)
diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go
index b774ac2..26fb337 100644
--- a/src/cmd/go/alldocs.go
+++ b/src/cmd/go/alldocs.go
@@ -557,7 +557,7 @@
 //
 // Usage:
 //
-// 	go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages]
+// 	go get [-d] [-m] [-t] [-u] [-v] [-insecure] [build flags] [packages]
 //
 // Get resolves and adds dependencies to the current development module
 // and then builds and installs them.
@@ -600,6 +600,9 @@
 // are competing requirements for a particular module, then 'go get' resolves
 // those requirements by taking the maximum requested version.)
 //
+// The -t flag instructs get to consider modules needed to build tests of
+// packages specified on the command line.
+//
 // The -u flag instructs get to update dependencies to use newer minor or
 // patch releases when available. Continuing the previous example,
 // 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3).
@@ -610,6 +613,9 @@
 // 'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3),
 // while 'go get -u=patch A' will use a patch release of A instead.
 //
+// When the -t and -u flags are used together, get will update
+// test dependencies as well.
+//
 // In general, adding a new dependency may require upgrading
 // existing dependencies to keep a working build, and 'go get' does
 // this automatically. Similarly, downgrading one dependency may
@@ -2014,21 +2020,6 @@
 //
 // Module proxy protocol
 //
-// The go command by default downloads modules from version control systems
-// directly, just as 'go get' always has. The GOPROXY environment variable allows
-// further control over the download source. If GOPROXY is unset, is the empty string,
-// or is the string "direct", downloads use the default direct connection to version
-// control systems. Setting GOPROXY to "off" disallows downloading modules from
-// any source. Otherwise, GOPROXY is expected to be a comma-separated list of
-// the URLs of module proxies, in which case the go command will fetch modules
-// from those proxies. For each request, the go command tries each proxy in sequence,
-// only moving to the next if the current proxy returns a 404 or 410 HTTP response.
-// The string "direct" may appear in the proxy list, to cause a direct connection to
-// be attempted at that point in the search.
-//
-// No matter the source of the modules, downloaded modules must match existing
-// entries in go.sum (see 'go help modules' for discussion of verification).
-//
 // A Go module proxy is any web server that can respond to GET requests for
 // URLs of a specified form. The requests have no query parameters, so even
 // a site serving from a fixed file system (including a file:/// URL)
@@ -2585,16 +2576,43 @@
 //
 // Module downloading and verification
 //
-// The go command checks downloads against known checksums,
-// to detect unexpected changes in the content of any specific module
-// version from one day to the next. See 'go help module-auth' for details.
+// The go command can fetch modules from a proxy or connect to source control
+// servers directly, according to the setting of the GOPROXY environment
+// variable (see 'go help env'). The default setting for GOPROXY is
+// "https://proxy.golang.org", the Go module mirror run by Google.
+// See https://proxy.golang.org/privacy for the service's privacy policy.
+// If GOPROXY is set to the string "direct", downloads use a direct connection
+// to source control servers. Setting GOPROXY to "off" disallows downloading
+// modules from any source. Otherwise, GOPROXY is expected to be a comma-separated
+// list of the URLs of module proxies, in which case the go command will fetch
+// modules from those proxies. For each request, the go command tries each proxy
+// in sequence, only moving to the next if the current proxy returns a 404 or 410
+// HTTP response. The string "direct" may appear in the proxy list,
+// to cause a direct connection to be attempted at that point in the search.
+// Any proxies listed after "direct" are never consulted.
 //
-// The go command can fetch modules from a proxy instead of connecting
-// to source control systems directly, according to the setting of the GOPROXY
-// environment variable.
+// The GONOPROXY environment variable is a comma-separated list of
+// glob patterns (in the syntax of Go's path.Match) of module path prefixes
+// that should always be fetched directly, ignoring the GOPROXY setting.
+// For example,
 //
-// See 'go help goproxy' for details about the proxy and also the format of
-// the cached downloaded packages.
+// 	GONOPROXY=*.corp.example.com,rsc.io/private
+//
+// forces a direct connection to download modules with path prefixes matching
+// either pattern, including "git.corp.example.com/xyzzy", "rsc.io/private",
+// and "rsc.io/private/quux".
+//
+// The 'go env -w' command (see 'go help env') can be used to set these variables
+// for future go command invocations.
+//
+// No matter the source of the modules, the go command checks downloads against
+// known checksums, to detect unexpected changes in the content of any specific
+// module version from one day to the next. This check first consults the current
+// module's go.sum file but falls back to the Go checksum database.
+// See 'go help module-auth' for details.
+//
+// See 'go help goproxy' for details about the proxy protocol and also
+// the format of the cached downloaded packages.
 //
 // Modules and vendoring
 //
@@ -2772,18 +2790,17 @@
 // database requires giving the public key explicitly. The URL defaults to
 // "https://" followed by the database name.
 //
-// GOSUMDB defaults to "sum.golang.org" when GOPROXY="https://proxy.golang.org"
-// and otherwise defaults to "off". NOTE: The GOSUMDB will later default to
-// "sum.golang.org" unconditionally.
+// GOSUMDB defaults to "sum.golang.org", the Go checksum database run by Google.
+// See https://sum.golang.org/privacy for the service's privacy policy.
 //
 // If GOSUMDB is set to "off", or if "go get" is invoked with the -insecure flag,
-// the checksum database is never consulted, but at the cost of giving up the
-// security guarantee of verified repeatable downloads for all modules.
-// A better way to bypass the checksum database for specific modules is
-// to use the GONOSUMDB environment variable.
+// the checksum database is not consulted, and all unrecognized modules are
+// accepted, at the cost of giving up the security guarantee of verified repeatable
+// downloads for all modules. A better way to bypass the checksum database
+// for specific modules is to use the GONOSUMDB environment variable.
 //
 // The GONOSUMDB environment variable is a comma-separated list of
-// patterns (in the syntax of Go's path.Match) of module path prefixes
+// glob patterns (in the syntax of Go's path.Match) of module path prefixes
 // that should not be compared against the checksum database.
 // For example,
 //
@@ -2793,6 +2810,9 @@
 // either pattern, including "git.corp.example.com/xyzzy", "rsc.io/private",
 // and "rsc.io/private/quux".
 //
+// The 'go env -w' command (see 'go help env') can be used to set these variables
+// for future go command invocations.
+//
 //
 // Testing flags
 //
diff --git a/src/cmd/go/internal/cache/cache_test.go b/src/cmd/go/internal/cache/cache_test.go
index 7229bc4..1988c34 100644
--- a/src/cmd/go/internal/cache/cache_test.go
+++ b/src/cmd/go/internal/cache/cache_test.go
@@ -78,7 +78,7 @@
 
 	n := 10000
 	if testing.Short() {
-		n = 1000
+		n = 10
 	}
 
 	for i := 0; i < n; i++ {
diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go
index 2d17d10..77d8bab 100644
--- a/src/cmd/go/internal/cfg/cfg.go
+++ b/src/cmd/go/internal/cfg/cfg.go
@@ -303,13 +303,6 @@
 		return v
 	}
 
-	// Proxy is off by default for now.
-	// TODO(rsc): Remove this condition, turning it on always.
-	// (But do NOT do this without approval from rsc.)
-	if true {
-		return "direct"
-	}
-
 	return "https://proxy.golang.org"
 }
 
@@ -319,13 +312,6 @@
 		return v
 	}
 
-	// Checksum database is off by default except when GOPROXY is proxy.golang.org.
-	// TODO(rsc): Remove this condition, turning it on always.
-	// (But do NOT do this without approval from rsc.)
-	if !strings.HasPrefix(GOPROXY, "https://proxy.golang.org") {
-		return "off"
-	}
-
 	return "sum.golang.org"
 }
 
diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go
index 00f1097..b3d12dd 100644
--- a/src/cmd/go/internal/envcmd/env.go
+++ b/src/cmd/go/internal/envcmd/env.go
@@ -66,6 +66,7 @@
 
 	envFile, _ := cfg.EnvFile()
 	env := []cfg.EnvVar{
+		{Name: "GO111MODULE", Value: cfg.Getenv("GO111MODULE")},
 		{Name: "GOARCH", Value: cfg.Goarch},
 		{Name: "GOBIN", Value: cfg.GOBIN},
 		{Name: "GOCACHE", Value: cache.DefaultDir()},
diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go
index 817f765..d40d2c6 100644
--- a/src/cmd/go/internal/modfetch/fetch.go
+++ b/src/cmd/go/internal/modfetch/fetch.go
@@ -702,18 +702,17 @@
 database requires giving the public key explicitly. The URL defaults to
 "https://" followed by the database name.
 
-GOSUMDB defaults to "sum.golang.org" when GOPROXY="https://proxy.golang.org"
-and otherwise defaults to "off". NOTE: The GOSUMDB will later default to
-"sum.golang.org" unconditionally.
+GOSUMDB defaults to "sum.golang.org", the Go checksum database run by Google.
+See https://sum.golang.org/privacy for the service's privacy policy.
 
 If GOSUMDB is set to "off", or if "go get" is invoked with the -insecure flag,
-the checksum database is never consulted, but at the cost of giving up the
-security guarantee of verified repeatable downloads for all modules.
-A better way to bypass the checksum database for specific modules is
-to use the GONOSUMDB environment variable.
+the checksum database is not consulted, and all unrecognized modules are
+accepted, at the cost of giving up the security guarantee of verified repeatable
+downloads for all modules. A better way to bypass the checksum database
+for specific modules is to use the GONOSUMDB environment variable.
 
 The GONOSUMDB environment variable is a comma-separated list of
-patterns (in the syntax of Go's path.Match) of module path prefixes
+glob patterns (in the syntax of Go's path.Match) of module path prefixes
 that should not be compared against the checksum database.
 For example,
 
@@ -722,5 +721,8 @@
 disables checksum database lookups for modules with path prefixes matching
 either pattern, including "git.corp.example.com/xyzzy", "rsc.io/private",
 and "rsc.io/private/quux".
+
+The 'go env -w' command (see 'go help env') can be used to set these variables
+for future go command invocations.
 `,
 }
diff --git a/src/cmd/go/internal/modfetch/proxy.go b/src/cmd/go/internal/modfetch/proxy.go
index 605c72c..5f0432c 100644
--- a/src/cmd/go/internal/modfetch/proxy.go
+++ b/src/cmd/go/internal/modfetch/proxy.go
@@ -32,21 +32,6 @@
 	UsageLine: "goproxy",
 	Short:     "module proxy protocol",
 	Long: `
-The go command by default downloads modules from version control systems
-directly, just as 'go get' always has. The GOPROXY environment variable allows
-further control over the download source. If GOPROXY is unset, is the empty string,
-or is the string "direct", downloads use the default direct connection to version
-control systems. Setting GOPROXY to "off" disallows downloading modules from
-any source. Otherwise, GOPROXY is expected to be a comma-separated list of
-the URLs of module proxies, in which case the go command will fetch modules
-from those proxies. For each request, the go command tries each proxy in sequence,
-only moving to the next if the current proxy returns a 404 or 410 HTTP response.
-The string "direct" may appear in the proxy list, to cause a direct connection to
-be attempted at that point in the search.
-
-No matter the source of the modules, downloaded modules must match existing
-entries in go.sum (see 'go help modules' for discussion of verification).
-
 A Go module proxy is any web server that can respond to GET requests for
 URLs of a specified form. The requests have no query parameters, so even
 a site serving from a fixed file system (including a file:/// URL)
diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go
index 7a5d550..d5ab594 100644
--- a/src/cmd/go/internal/modget/get.go
+++ b/src/cmd/go/internal/modget/get.go
@@ -31,7 +31,7 @@
 var CmdGet = &base.Command{
 	// Note: -d -m -u are listed explicitly because they are the most common get flags.
 	// Do not send CLs removing them because they're covered by [get flags].
-	UsageLine: "go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages]",
+	UsageLine: "go get [-d] [-m] [-t] [-u] [-v] [-insecure] [build flags] [packages]",
 	Short:     "add dependencies to current module and install them",
 	Long: `
 Get resolves and adds dependencies to the current development module
@@ -75,6 +75,9 @@
 are competing requirements for a particular module, then 'go get' resolves
 those requirements by taking the maximum requested version.)
 
+The -t flag instructs get to consider modules needed to build tests of
+packages specified on the command line.
+
 The -u flag instructs get to update dependencies to use newer minor or
 patch releases when available. Continuing the previous example,
 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3).
@@ -85,6 +88,9 @@
 'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3),
 while 'go get -u=patch A' will use a patch release of A instead.
 
+When the -t and -u flags are used together, get will update
+test dependencies as well.
+
 In general, adding a new dependency may require upgrading
 existing dependencies to keep a working build, and 'go get' does
 this automatically. Similarly, downgrading one dependency may
@@ -261,9 +267,7 @@
 	if *getFix {
 		fmt.Fprintf(os.Stderr, "go get: -fix flag is a no-op when using modules\n")
 	}
-	if *getT {
-		fmt.Fprintf(os.Stderr, "go get: -t flag is a no-op when using modules\n")
-	}
+	modload.LoadTests = *getT
 
 	if cfg.BuildMod == "vendor" {
 		base.Fatalf("go get: disabled by -mod=%s", cfg.BuildMod)
@@ -781,25 +785,26 @@
 		// Initialize work queue with root packages.
 		seen := make(map[string]bool)
 		var work []string
-		for pkg := range pkgs {
-			seen[pkg] = true
-			for _, imp := range modload.PackageImports(pkg) {
-				if !pkgs[imp] && !seen[imp] {
-					seen[imp] = true
-					work = append(work, imp)
-				}
+		add := func(path string) {
+			if !seen[path] {
+				seen[path] = true
+				work = append(work, path)
 			}
 		}
+		for pkg := range pkgs {
+			add(pkg)
+		}
 		for len(work) > 0 {
 			pkg := work[0]
 			work = work[1:]
 			m := modload.PackageModule(pkg)
 			u.upgrade[m.Path] = true
-			for _, imp := range modload.PackageImports(pkg) {
-				if !seen[imp] {
-					seen[imp] = true
-					work = append(work, imp)
-				}
+			imports, testImports := modload.PackageImports(pkg)
+			for _, imp := range imports {
+				add(imp)
+			}
+			for _, imp := range testImports {
+				add(imp)
 			}
 		}
 	}
diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go
index c1685ff..96fec84 100644
--- a/src/cmd/go/internal/modload/help.go
+++ b/src/cmd/go/internal/modload/help.go
@@ -328,16 +328,43 @@
 
 Module downloading and verification
 
-The go command checks downloads against known checksums,
-to detect unexpected changes in the content of any specific module
-version from one day to the next. See 'go help module-auth' for details.
+The go command can fetch modules from a proxy or connect to source control
+servers directly, according to the setting of the GOPROXY environment
+variable (see 'go help env'). The default setting for GOPROXY is
+"https://proxy.golang.org", the Go module mirror run by Google.
+See https://proxy.golang.org/privacy for the service's privacy policy.
+If GOPROXY is set to the string "direct", downloads use a direct connection
+to source control servers. Setting GOPROXY to "off" disallows downloading
+modules from any source. Otherwise, GOPROXY is expected to be a comma-separated
+list of the URLs of module proxies, in which case the go command will fetch
+modules from those proxies. For each request, the go command tries each proxy
+in sequence, only moving to the next if the current proxy returns a 404 or 410
+HTTP response. The string "direct" may appear in the proxy list,
+to cause a direct connection to be attempted at that point in the search.
+Any proxies listed after "direct" are never consulted.
 
-The go command can fetch modules from a proxy instead of connecting
-to source control systems directly, according to the setting of the GOPROXY
-environment variable.
+The GONOPROXY environment variable is a comma-separated list of
+glob patterns (in the syntax of Go's path.Match) of module path prefixes
+that should always be fetched directly, ignoring the GOPROXY setting.
+For example,
 
-See 'go help goproxy' for details about the proxy and also the format of
-the cached downloaded packages.
+	GONOPROXY=*.corp.example.com,rsc.io/private
+
+forces a direct connection to download modules with path prefixes matching
+either pattern, including "git.corp.example.com/xyzzy", "rsc.io/private",
+and "rsc.io/private/quux".
+
+The 'go env -w' command (see 'go help env') can be used to set these variables
+for future go command invocations.
+
+No matter the source of the modules, the go command checks downloads against
+known checksums, to detect unexpected changes in the content of any specific
+module version from one day to the next. This check first consults the current
+module's go.sum file but falls back to the Go checksum database.
+See 'go help module-auth' for details.
+
+See 'go help goproxy' for details about the proxy protocol and also
+the format of the cached downloaded packages.
 
 Modules and vendoring
 
diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go
index 579ef50..b64b5b6 100644
--- a/src/cmd/go/internal/modload/load.go
+++ b/src/cmd/go/internal/modload/load.go
@@ -496,17 +496,26 @@
 }
 
 // PackageImports returns the imports for the package named by the import path.
-// It does not include test imports. It returns nil for unknown packages.
-func PackageImports(path string) []string {
+// Test imports will be returned as well if tests were loaded for the package
+// (i.e., if "all" was loaded or if LoadTests was set and the path was matched
+// by a command line argument). PackageImports will return nil for
+// unknown package paths.
+func PackageImports(path string) (imports, testImports []string) {
 	pkg, ok := loaded.pkgCache.Get(path).(*loadPkg)
 	if !ok {
-		return nil
+		return nil, nil
 	}
-	imports := make([]string, len(pkg.imports))
+	imports = make([]string, len(pkg.imports))
 	for i, p := range pkg.imports {
 		imports[i] = p.path
 	}
-	return imports
+	if pkg.test != nil {
+		testImports = make([]string, len(pkg.test.imports))
+		for i, p := range pkg.test.imports {
+			testImports[i] = p.path
+		}
+	}
+	return imports, testImports
 }
 
 // ModuleUsedDirectly reports whether the main module directly imports
diff --git a/src/cmd/go/internal/mvs/mvs.go b/src/cmd/go/internal/mvs/mvs.go
index 90f8f26..04273e7 100644
--- a/src/cmd/go/internal/mvs/mvs.go
+++ b/src/cmd/go/internal/mvs/mvs.go
@@ -13,7 +13,6 @@
 	"sync"
 	"sync/atomic"
 
-	"cmd/go/internal/base"
 	"cmd/go/internal/module"
 	"cmd/go/internal/par"
 )
@@ -118,7 +117,7 @@
 	return buildList(target, reqs, nil)
 }
 
-func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) module.Version) ([]module.Version, error) {
+func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) (module.Version, error)) ([]module.Version, error) {
 	// Explore work graph in parallel in case reqs.Required
 	// does high-latency network operations.
 	type modGraphNode struct {
@@ -133,6 +132,10 @@
 		min      = map[string]string{} // maps module path to minimum required version
 		haveErr  int32
 	)
+	setErr := func(n *modGraphNode, err error) {
+		n.err = err
+		atomic.StoreInt32(&haveErr, 1)
+	}
 
 	var work par.Work
 	work.Add(target)
@@ -149,8 +152,7 @@
 
 		required, err := reqs.Required(m)
 		if err != nil {
-			node.err = err
-			atomic.StoreInt32(&haveErr, 1)
+			setErr(node, err)
 			return
 		}
 		node.required = required
@@ -159,9 +161,9 @@
 		}
 
 		if upgrade != nil {
-			u := upgrade(m)
-			if u.Path == "" {
-				base.Errorf("Upgrade(%v) returned zero module", m)
+			u, err := upgrade(m)
+			if err != nil {
+				setErr(node, err)
 				return
 			}
 			if u != m {
@@ -332,17 +334,12 @@
 // UpgradeAll returns a build list for the target module
 // in which every module is upgraded to its latest version.
 func UpgradeAll(target module.Version, reqs Reqs) ([]module.Version, error) {
-	return buildList(target, reqs, func(m module.Version) module.Version {
+	return buildList(target, reqs, func(m module.Version) (module.Version, error) {
 		if m.Path == target.Path {
-			return target
+			return target, nil
 		}
 
-		latest, err := reqs.Upgrade(m)
-		if err != nil {
-			panic(err) // TODO
-		}
-		m.Version = latest.Version
-		return m
+		return reqs.Upgrade(m)
 	})
 }
 
@@ -351,7 +348,7 @@
 func Upgrade(target module.Version, reqs Reqs, upgrade ...module.Version) ([]module.Version, error) {
 	list, err := reqs.Required(target)
 	if err != nil {
-		panic(err) // TODO
+		return nil, err
 	}
 	// TODO: Maybe if an error is given,
 	// rerun with BuildList(upgrade[0], reqs) etc
@@ -370,7 +367,7 @@
 func Downgrade(target module.Version, reqs Reqs, downgrade ...module.Version) ([]module.Version, error) {
 	list, err := reqs.Required(target)
 	if err != nil {
-		panic(err) // TODO
+		return nil, err
 	}
 	max := make(map[string]string)
 	for _, r := range list {
@@ -409,7 +406,17 @@
 		}
 		list, err := reqs.Required(m)
 		if err != nil {
-			panic(err) // TODO
+			// If we can't load the requirements, we couldn't load the go.mod file.
+			// There are a number of reasons this can happen, but this usually
+			// means an older version of the module had a missing or invalid
+			// go.mod file. For example, if example.com/mod released v2.0.0 before
+			// migrating to modules (v2.0.0+incompatible), then added a valid go.mod
+			// in v2.0.1, downgrading from v2.0.1 would cause this error.
+			//
+			// TODO(golang.org/issue/31730, golang.org/issue/30134): if the error
+			// is transient (we couldn't download go.mod), return the error from
+			// Downgrade. Currently, we can't tell what kind of error it is.
+			exclude(m)
 		}
 		for _, r := range list {
 			add(r)
@@ -429,7 +436,12 @@
 		for excluded[r] {
 			p, err := reqs.Previous(r)
 			if err != nil {
-				return nil, err // TODO
+				// This is likely a transient error reaching the repository,
+				// rather than a permanent error with the retrieved version.
+				//
+				// TODO(golang.org/issue/31730, golang.org/issue/30134):
+				// decode what to do based on the actual error.
+				return nil, err
 			}
 			// If the target version is a pseudo-version, it may not be
 			// included when iterating over prior versions using reqs.Previous.
diff --git a/src/cmd/go/internal/work/buildid.go b/src/cmd/go/internal/work/buildid.go
index 1a98980..1f6d1e8 100644
--- a/src/cmd/go/internal/work/buildid.go
+++ b/src/cmd/go/internal/work/buildid.go
@@ -159,7 +159,7 @@
 // which influences the action ID half of the build ID, is based on the content ID,
 // then the Linux compiler binary and Mac compiler binary will have different tool IDs
 // and therefore produce executables with different action IDs.
-// To avoids this problem, for releases we use the release version string instead
+// To avoid this problem, for releases we use the release version string instead
 // of the compiler binary's content hash. This assumes that all compilers built
 // on all different systems are semantically equivalent, which is of course only true
 // modulo bugs. (Producing the exact same executables also requires that the different
@@ -215,7 +215,7 @@
 }
 
 // gccToolID returns the unique ID to use for a tool that is invoked
-// by the GCC driver. This is in particular gccgo, but this can also
+// by the GCC driver. This is used particularly for gccgo, but this can also
 // be used for gcc, g++, gfortran, etc.; those tools all use the GCC
 // driver under different names. The approach used here should also
 // work for sufficiently new versions of clang. Unlike toolID, the
diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go
index 35e70dd..6f2d319 100644
--- a/src/cmd/go/internal/work/exec.go
+++ b/src/cmd/go/internal/work/exec.go
@@ -211,6 +211,9 @@
 	fmt.Fprintf(h, "goos %s goarch %s\n", cfg.Goos, cfg.Goarch)
 	fmt.Fprintf(h, "import %q\n", p.ImportPath)
 	fmt.Fprintf(h, "omitdebug %v standard %v local %v prefix %q\n", p.Internal.OmitDebug, p.Standard, p.Internal.Local, p.Internal.LocalPrefix)
+	if cfg.BuildTrimpath {
+		fmt.Fprintln(h, "trimpath")
+	}
 	if p.Internal.ForceLibrary {
 		fmt.Fprintf(h, "forcelibrary\n")
 	}
@@ -1116,6 +1119,9 @@
 	fmt.Fprintf(h, "buildmode %s goos %s goarch %s\n", cfg.BuildBuildmode, cfg.Goos, cfg.Goarch)
 	fmt.Fprintf(h, "import %q\n", p.ImportPath)
 	fmt.Fprintf(h, "omitdebug %v standard %v local %v prefix %q\n", p.Internal.OmitDebug, p.Standard, p.Internal.Local, p.Internal.LocalPrefix)
+	if cfg.BuildTrimpath {
+		fmt.Fprintln(h, "trimpath")
+	}
 
 	// Toolchain-dependent configuration, shared with b.linkSharedActionID.
 	b.printLinkerConfig(h, p)
diff --git a/src/cmd/go/testdata/mod/example.com_downgrade_v2.0.0.txt b/src/cmd/go/testdata/mod/example.com_downgrade_v2.0.0.txt
new file mode 100644
index 0000000..88d50e5
--- /dev/null
+++ b/src/cmd/go/testdata/mod/example.com_downgrade_v2.0.0.txt
@@ -0,0 +1,9 @@
+example.com/downgrade v2.0.0
+written by hand
+
+-- .mod --
+module example.com/downgrade
+
+require rsc.io/quote v1.5.2
+-- .info --
+{"Version":"v2.0.0"}
diff --git a/src/cmd/go/testdata/mod/example.com_downgrade_v2_v2.0.1.txt b/src/cmd/go/testdata/mod/example.com_downgrade_v2_v2.0.1.txt
new file mode 100644
index 0000000..a4d665f
--- /dev/null
+++ b/src/cmd/go/testdata/mod/example.com_downgrade_v2_v2.0.1.txt
@@ -0,0 +1,13 @@
+example.com/downgrade/v2 v2.0.1
+written by hand
+
+-- .mod --
+module example.com/downgrade/v2
+
+require rsc.io/quote v1.5.2
+-- .info --
+{"Version":"v2.0.1"}
+-- go.mod --
+module example.com/downgrade/v2
+
+require rsc.io/quote v1.5.2
diff --git a/src/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.0.txt b/src/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.0.txt
new file mode 100644
index 0000000..25bd3d9
--- /dev/null
+++ b/src/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.0.txt
@@ -0,0 +1,14 @@
+example.com/latemigrate/v2 v2.0.0
+written by hand
+
+This repository migrated to modules in v2.0.1 after v2.0.0 was already tagged.
+All versions require rsc.io/quote so we can test downgrades.
+
+v2.0.0 is technically part of example.com/latemigrate as v2.0.0+incompatible.
+Proxies may serve it as part of the version list for example.com/latemigrate/v2.
+'go get' must be able to ignore these versions.
+
+-- .mod --
+module example.com/latemigrate
+-- .info --
+{"Version":"v2.0.0"}
diff --git a/src/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.1.txt b/src/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.1.txt
new file mode 100644
index 0000000..be427a3
--- /dev/null
+++ b/src/cmd/go/testdata/mod/example.com_latemigrate_v2_v2.0.1.txt
@@ -0,0 +1,20 @@
+example.com/latemigrate/v2 v2.0.1
+written by hand
+
+This repository migrated to modules in v2.0.1 after v2.0.0 was already tagged.
+All versions require rsc.io/quote so we can test downgrades.
+
+v2.0.1 belongs to example.com/latemigrate/v2.
+
+-- .mod --
+module example.com/latemigrate/v2
+
+require rsc.io/quote v1.3.0
+-- .info --
+{"Version":"v2.0.1"}
+-- go.mod --
+module example.com/latemigrate/v2
+
+require rsc.io/quote v1.3.0
+-- late.go --
+package late
diff --git a/src/cmd/go/testdata/script/build_cache_trimpath.txt b/src/cmd/go/testdata/script/build_cache_trimpath.txt
new file mode 100644
index 0000000..39367ae
--- /dev/null
+++ b/src/cmd/go/testdata/script/build_cache_trimpath.txt
@@ -0,0 +1,20 @@
+env GO111MODULE=on
+
+# Set up fresh GOCACHE.
+env GOCACHE=$WORK/gocache
+mkdir $GOCACHE
+
+cd $WORK
+go build -o a.out
+
+# Varying -trimpath should cause a rebuild.
+go build -x -o a.out -trimpath
+stderr '(compile|gccgo)( |\.exe)'
+stderr 'link( |\.exe)'
+
+-- $WORK/hello.go --
+package main
+func main() { println("hello") }
+
+-- $WORK/go.mod --
+module m
diff --git a/src/cmd/go/testdata/script/mod_get_downgrade.txt b/src/cmd/go/testdata/script/mod_get_downgrade.txt
index 00cd93e..ee9ac96 100644
--- a/src/cmd/go/testdata/script/mod_get_downgrade.txt
+++ b/src/cmd/go/testdata/script/mod_get_downgrade.txt
@@ -2,6 +2,7 @@
 [short] skip
 
 # downgrade sampler should downgrade quote
+cp go.mod.orig go.mod
 go get rsc.io/sampler@v1.0.0
 go list -m all
 stdout 'rsc.io/quote v1.4.0'
@@ -31,9 +32,21 @@
 stdout 'rsc.io/sampler v1.0.0'
 ! stdout golang.org/x/text
 
--- go.mod --
+# downgrading away quote should also downgrade away latemigrate/v2,
+# since there are no older versions. v2.0.0 is incompatible.
+cp go.mod.orig go.mod
+go list -m -versions example.com/latemigrate/v2
+stdout v2.0.0 # proxy may serve incompatible versions
+go get rsc.io/quote@none
+go list -m all
+! stdout 'example.com/latemigrate/v2'
+
+-- go.mod.orig --
 module x
-require rsc.io/quote v1.5.1
+require (
+	rsc.io/quote v1.5.1
+	example.com/latemigrate/v2 v2.0.1
+)
 -- go.mod.empty --
 module x
 -- x.go --
diff --git a/src/cmd/go/testdata/script/mod_get_test.txt b/src/cmd/go/testdata/script/mod_get_test.txt
new file mode 100644
index 0000000..f921168
--- /dev/null
+++ b/src/cmd/go/testdata/script/mod_get_test.txt
@@ -0,0 +1,58 @@
+env GO111MODULE=on
+
+# By default, 'go get' should ignore tests
+cp go.mod.empty go.mod
+go get m/a
+! grep rsc.io/quote go.mod
+
+# 'go get -t' should consider test dependencies of the named package.
+cp go.mod.empty go.mod
+go get -d -t m/a
+grep 'rsc.io/quote v1.5.2$' go.mod
+
+# 'go get -t' should not consider test dependencies of imported packages,
+# including packages imported from tests.
+cp go.mod.empty go.mod
+go get -d -t m/b
+! grep rsc.io/quote go.mod
+
+# 'go get -t -u' should update test dependencies of the named package.
+cp go.mod.empty go.mod
+go mod edit -require=rsc.io/quote@v1.5.1
+go get -d -t -u m/a
+grep 'rsc.io/quote v1.5.2$' go.mod
+
+# 'go get -t -u' should not add or update test dependencies
+# of imported packages, including packages imported from tests.
+cp go.mod.empty go.mod
+go get -d -t -u m/b
+! grep rsc.io/quote go.mod
+go mod edit -require=rsc.io/quote@v1.5.1
+go get -d -t -u m/b
+grep 'rsc.io/quote v1.5.1$' go.mod
+
+# 'go get all' should consider test dependencies with or without -t.
+cp go.mod.empty go.mod
+go get all
+grep 'rsc.io/quote v1.5.2$' go.mod
+
+-- go.mod.empty --
+module m
+
+-- a/a.go --
+package a
+
+-- a/a_test.go --
+package a_test
+
+import _ "rsc.io/quote"
+
+-- b/b.go --
+package b
+
+import _ "m/a"
+
+-- b/b_test.go --
+package b_test
+
+import _ "m/a"
diff --git a/src/cmd/go/testdata/script/mod_sumdb_golang.txt b/src/cmd/go/testdata/script/mod_sumdb_golang.txt
index ca040c5..0eb0fc8 100644
--- a/src/cmd/go/testdata/script/mod_sumdb_golang.txt
+++ b/src/cmd/go/testdata/script/mod_sumdb_golang.txt
@@ -1,16 +1,16 @@
-[!net] skip
-
+# Test default GOPROXY and GOSUMDB
 env GOPROXY=
 env GOSUMDB=
 go env GOPROXY
-stdout '^direct$'
+stdout '^https://proxy.golang.org$'
 go env GOSUMDB
-stdout '^off$'
+stdout '^sum.golang.org$'
 env GOPROXY=https://proxy.golang.org
 go env GOSUMDB
 stdout '^sum.golang.org$'
 
 # download direct from github
+[!net] skip
 env GOSUMDB=sum.golang.org
 env GOPROXY=direct
 go get -m rsc.io/quote
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go
index 3ea29a8..66748b2 100644
--- a/src/cmd/internal/obj/link.go
+++ b/src/cmd/internal/obj/link.go
@@ -377,6 +377,7 @@
 )
 
 // An LSym is the sort of symbol that is written to an object file.
+// It represents Go symbols in a flat pkg+"."+name namespace.
 type LSym struct {
 	Name string
 	Type objabi.SymKind
diff --git a/src/cmd/internal/obj/x86/pcrelative_test.go b/src/cmd/internal/obj/x86/pcrelative_test.go
index 51b60cf..487a65d 100644
--- a/src/cmd/internal/obj/x86/pcrelative_test.go
+++ b/src/cmd/internal/obj/x86/pcrelative_test.go
@@ -96,6 +96,9 @@
 		for idx := len(data) - 1; idx >= 0; idx-- {
 			// check that RET wasn't overwritten.
 			if bytes.Index(data[idx], []byte("RET")) != -1 {
+				if testing.Short() {
+					break LOOP
+				}
 				continue LOOP
 			}
 		}
diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go
index 235db39..e52e26a 100644
--- a/src/cmd/link/dwarf_test.go
+++ b/src/cmd/link/dwarf_test.go
@@ -165,8 +165,10 @@
 
 func TestDWARF(t *testing.T) {
 	testDWARF(t, "", true)
-	if runtime.GOOS == "darwin" {
-		testDWARF(t, "c-archive", true)
+	if runtime.GOOS == "darwin" && !testing.Short() {
+		t.Run("c-archive", func(t *testing.T) {
+			testDWARF(t, "c-archive", true)
+		})
 	}
 }
 
diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go
index a783bdd..29b98e9 100644
--- a/src/cmd/link/link_test.go
+++ b/src/cmd/link/link_test.go
@@ -170,7 +170,7 @@
 	}
 }
 
-func TestBuildFortvOS(t *testing.T) {
+func TestBuildForTvOS(t *testing.T) {
 	testenv.MustHaveCGO(t)
 	testenv.MustHaveGoBuild(t)
 
@@ -178,6 +178,9 @@
 	if runtime.GOARCH != "amd64" || runtime.GOOS != "darwin" {
 		t.Skip("skipping on non-darwin/amd64 platform")
 	}
+	if testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+		t.Skip("skipping in -short mode with $GO_BUILDER_NAME empty")
+	}
 	if err := exec.Command("xcrun", "--help").Run(); err != nil {
 		t.Skipf("error running xcrun, required for iOS cross build: %v", err)
 	}
diff --git a/src/cmd/pack/pack_test.go b/src/cmd/pack/pack_test.go
index b2217c0..6121bf0 100644
--- a/src/cmd/pack/pack_test.go
+++ b/src/cmd/pack/pack_test.go
@@ -231,6 +231,9 @@
 
 // Test that pack works with very long lines in PKGDEF.
 func TestLargeDefs(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in -short mode")
+	}
 	testenv.MustHaveGoBuild(t)
 
 	dir := tmpDir(t)
diff --git a/src/compress/flate/deflate_test.go b/src/compress/flate/deflate_test.go
index 079c03c..4b1ed54 100644
--- a/src/compress/flate/deflate_test.go
+++ b/src/compress/flate/deflate_test.go
@@ -345,6 +345,9 @@
 func TestDeflateInflate(t *testing.T) {
 	t.Parallel()
 	for i, h := range deflateInflateTests {
+		if testing.Short() && len(h.in) > 10000 {
+			continue
+		}
 		testToFromWithLimit(t, h.in, fmt.Sprintf("#%d", i), [11]int{})
 	}
 }
@@ -591,6 +594,9 @@
 	}
 
 	for i, tc := range testCases {
+		if i >= 3 && testing.Short() {
+			break
+		}
 		for _, firstN := range []int{1, 65534, 65535, 65536, 65537, 131072} {
 			tc[0] = firstN
 		outer:
diff --git a/src/container/ring/ring_test.go b/src/container/ring/ring_test.go
index 552f0e2..41d18ab 100644
--- a/src/container/ring/ring_test.go
+++ b/src/container/ring/ring_test.go
@@ -179,7 +179,7 @@
 func TestLink3(t *testing.T) {
 	var r Ring
 	n := 1
-	for i := 1; i < 100; i++ {
+	for i := 1; i < 10; i++ {
 		n += i
 		verify(t, r.Link(New(i)), n, -1)
 	}
diff --git a/src/context/context.go b/src/context/context.go
index 0f36881..05d01d0 100644
--- a/src/context/context.go
+++ b/src/context/context.go
@@ -220,6 +220,7 @@
 
 // A CancelFunc tells an operation to abandon its work.
 // A CancelFunc does not wait for the work to stop.
+// A CancelFunc may be called by multiple goroutines simultaneously.
 // After the first call, subsequent calls to a CancelFunc do nothing.
 type CancelFunc func()
 
diff --git a/src/crypto/cipher/xor_test.go b/src/crypto/cipher/xor_test.go
index d49f1da..40d4e5a 100644
--- a/src/crypto/cipher/xor_test.go
+++ b/src/crypto/cipher/xor_test.go
@@ -20,6 +20,9 @@
 		testenv.SkipFlaky(t, 31812)
 	}
 	for j := 1; j <= 1024; j++ {
+		if testing.Short() && j > 16 {
+			break
+		}
 		for alignP := 0; alignP < 2; alignP++ {
 			for alignQ := 0; alignQ < 2; alignQ++ {
 				for alignD := 0; alignD < 2; alignD++ {
diff --git a/src/crypto/elliptic/fuzz_test.go b/src/crypto/elliptic/fuzz_test.go
index 10196cf..eaeed0d 100644
--- a/src/crypto/elliptic/fuzz_test.go
+++ b/src/crypto/elliptic/fuzz_test.go
@@ -22,7 +22,7 @@
 	var timeout *time.Timer
 
 	if testing.Short() {
-		timeout = time.NewTimer(500 * time.Millisecond)
+		timeout = time.NewTimer(10 * time.Millisecond)
 	} else {
 		timeout = time.NewTimer(2 * time.Second)
 	}
diff --git a/src/crypto/rand/util_test.go b/src/crypto/rand/util_test.go
index 685624e..e76ce20 100644
--- a/src/crypto/rand/util_test.go
+++ b/src/crypto/rand/util_test.go
@@ -84,6 +84,9 @@
 	for max := 1; max <= 256; max++ {
 		t.Run(fmt.Sprintf("max=%d", max), func(t *testing.T) {
 			for i := 0; i < max; i++ {
+				if testing.Short() && i == 0 {
+					i = max - 1
+				}
 				var b bytes.Buffer
 				b.WriteByte(byte(i))
 				n, err := rand.Int(&b, big.NewInt(int64(max)))
diff --git a/src/crypto/rsa/pkcs1v15_test.go b/src/crypto/rsa/pkcs1v15_test.go
index 7f380b6..d412474 100644
--- a/src/crypto/rsa/pkcs1v15_test.go
+++ b/src/crypto/rsa/pkcs1v15_test.go
@@ -274,8 +274,8 @@
 	}
 }
 
-// In order to generate new test vectors you'll need the PEM form of this key:
-// -----BEGIN RSA PRIVATE KEY-----
+// In order to generate new test vectors you'll need the PEM form of this key (and s/TESTING/PRIVATE/):
+// -----BEGIN RSA TESTING KEY-----
 // MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
 // fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
 // /ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
@@ -283,7 +283,7 @@
 // EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
 // IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
 // tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
-// -----END RSA PRIVATE KEY-----
+// -----END RSA TESTING KEY-----
 
 var rsaPrivateKey = &PrivateKey{
 	PublicKey: PublicKey{
diff --git a/src/crypto/sha1/sha1.go b/src/crypto/sha1/sha1.go
index dee290c..329435f 100644
--- a/src/crypto/sha1/sha1.go
+++ b/src/crypto/sha1/sha1.go
@@ -10,6 +10,7 @@
 
 import (
 	"crypto"
+	"encoding/binary"
 	"errors"
 	"hash"
 )
@@ -81,13 +82,13 @@
 
 func appendUint64(b []byte, x uint64) []byte {
 	var a [8]byte
-	putUint64(a[:], x)
+	binary.BigEndian.PutUint64(a[:], x)
 	return append(b, a[:]...)
 }
 
 func appendUint32(b []byte, x uint32) []byte {
 	var a [4]byte
-	putUint32(a[:], x)
+	binary.BigEndian.PutUint32(a[:], x)
 	return append(b, a[:]...)
 }
 
@@ -175,7 +176,7 @@
 
 	// Length in bits.
 	len <<= 3
-	putUint64(tmp[:], len)
+	binary.BigEndian.PutUint64(tmp[:], len)
 	d.Write(tmp[0:8])
 
 	if d.nx != 0 {
@@ -184,11 +185,11 @@
 
 	var digest [Size]byte
 
-	putUint32(digest[0:], d.h[0])
-	putUint32(digest[4:], d.h[1])
-	putUint32(digest[8:], d.h[2])
-	putUint32(digest[12:], d.h[3])
-	putUint32(digest[16:], d.h[4])
+	binary.BigEndian.PutUint32(digest[0:], d.h[0])
+	binary.BigEndian.PutUint32(digest[4:], d.h[1])
+	binary.BigEndian.PutUint32(digest[8:], d.h[2])
+	binary.BigEndian.PutUint32(digest[12:], d.h[3])
+	binary.BigEndian.PutUint32(digest[16:], d.h[4])
 
 	return digest
 }
@@ -275,23 +276,3 @@
 	d.Write(data)
 	return d.checkSum()
 }
-
-func putUint64(x []byte, s uint64) {
-	_ = x[7]
-	x[0] = byte(s >> 56)
-	x[1] = byte(s >> 48)
-	x[2] = byte(s >> 40)
-	x[3] = byte(s >> 32)
-	x[4] = byte(s >> 24)
-	x[5] = byte(s >> 16)
-	x[6] = byte(s >> 8)
-	x[7] = byte(s)
-}
-
-func putUint32(x []byte, s uint32) {
-	_ = x[3]
-	x[0] = byte(s >> 24)
-	x[1] = byte(s >> 16)
-	x[2] = byte(s >> 8)
-	x[3] = byte(s)
-}
diff --git a/src/crypto/sha256/sha256.go b/src/crypto/sha256/sha256.go
index 8e4915a..faf29f2 100644
--- a/src/crypto/sha256/sha256.go
+++ b/src/crypto/sha256/sha256.go
@@ -9,6 +9,7 @@
 import (
 	"crypto"
 	"crypto/internal/boring"
+	"encoding/binary"
 	"errors"
 	"hash"
 )
@@ -105,35 +106,15 @@
 	return nil
 }
 
-func putUint32(x []byte, s uint32) {
-	_ = x[3]
-	x[0] = byte(s >> 24)
-	x[1] = byte(s >> 16)
-	x[2] = byte(s >> 8)
-	x[3] = byte(s)
-}
-
-func putUint64(x []byte, s uint64) {
-	_ = x[7]
-	x[0] = byte(s >> 56)
-	x[1] = byte(s >> 48)
-	x[2] = byte(s >> 40)
-	x[3] = byte(s >> 32)
-	x[4] = byte(s >> 24)
-	x[5] = byte(s >> 16)
-	x[6] = byte(s >> 8)
-	x[7] = byte(s)
-}
-
 func appendUint64(b []byte, x uint64) []byte {
 	var a [8]byte
-	putUint64(a[:], x)
+	binary.BigEndian.PutUint64(a[:], x)
 	return append(b, a[:]...)
 }
 
 func appendUint32(b []byte, x uint32) []byte {
 	var a [4]byte
-	putUint32(a[:], x)
+	binary.BigEndian.PutUint32(a[:], x)
 	return append(b, a[:]...)
 }
 
@@ -255,7 +236,7 @@
 
 	// Length in bits.
 	len <<= 3
-	putUint64(tmp[:], len)
+	binary.BigEndian.PutUint64(tmp[:], len)
 	d.Write(tmp[0:8])
 
 	if d.nx != 0 {
@@ -264,15 +245,15 @@
 
 	var digest [Size]byte
 
-	putUint32(digest[0:], d.h[0])
-	putUint32(digest[4:], d.h[1])
-	putUint32(digest[8:], d.h[2])
-	putUint32(digest[12:], d.h[3])
-	putUint32(digest[16:], d.h[4])
-	putUint32(digest[20:], d.h[5])
-	putUint32(digest[24:], d.h[6])
+	binary.BigEndian.PutUint32(digest[0:], d.h[0])
+	binary.BigEndian.PutUint32(digest[4:], d.h[1])
+	binary.BigEndian.PutUint32(digest[8:], d.h[2])
+	binary.BigEndian.PutUint32(digest[12:], d.h[3])
+	binary.BigEndian.PutUint32(digest[16:], d.h[4])
+	binary.BigEndian.PutUint32(digest[20:], d.h[5])
+	binary.BigEndian.PutUint32(digest[24:], d.h[6])
 	if !d.is224 {
-		putUint32(digest[28:], d.h[7])
+		binary.BigEndian.PutUint32(digest[28:], d.h[7])
 	}
 
 	return digest
diff --git a/src/crypto/sha512/sha512.go b/src/crypto/sha512/sha512.go
index 394e001..3fefd65 100644
--- a/src/crypto/sha512/sha512.go
+++ b/src/crypto/sha512/sha512.go
@@ -13,6 +13,7 @@
 import (
 	"crypto"
 	"crypto/internal/boring"
+	"encoding/binary"
 	"errors"
 	"hash"
 )
@@ -196,21 +197,9 @@
 	return nil
 }
 
-func putUint64(x []byte, s uint64) {
-	_ = x[7]
-	x[0] = byte(s >> 56)
-	x[1] = byte(s >> 48)
-	x[2] = byte(s >> 40)
-	x[3] = byte(s >> 32)
-	x[4] = byte(s >> 24)
-	x[5] = byte(s >> 16)
-	x[6] = byte(s >> 8)
-	x[7] = byte(s)
-}
-
 func appendUint64(b []byte, x uint64) []byte {
 	var a [8]byte
-	putUint64(a[:], x)
+	binary.BigEndian.PutUint64(a[:], x)
 	return append(b, a[:]...)
 }
 
@@ -329,8 +318,8 @@
 
 	// Length in bits.
 	len <<= 3
-	putUint64(tmp[0:], 0) // upper 64 bits are always zero, because len variable has type uint64
-	putUint64(tmp[8:], len)
+	binary.BigEndian.PutUint64(tmp[0:], 0) // upper 64 bits are always zero, because len variable has type uint64
+	binary.BigEndian.PutUint64(tmp[8:], len)
 	d.Write(tmp[0:16])
 
 	if d.nx != 0 {
@@ -338,15 +327,15 @@
 	}
 
 	var digest [Size]byte
-	putUint64(digest[0:], d.h[0])
-	putUint64(digest[8:], d.h[1])
-	putUint64(digest[16:], d.h[2])
-	putUint64(digest[24:], d.h[3])
-	putUint64(digest[32:], d.h[4])
-	putUint64(digest[40:], d.h[5])
+	binary.BigEndian.PutUint64(digest[0:], d.h[0])
+	binary.BigEndian.PutUint64(digest[8:], d.h[1])
+	binary.BigEndian.PutUint64(digest[16:], d.h[2])
+	binary.BigEndian.PutUint64(digest[24:], d.h[3])
+	binary.BigEndian.PutUint64(digest[32:], d.h[4])
+	binary.BigEndian.PutUint64(digest[40:], d.h[5])
 	if d.function != crypto.SHA384 {
-		putUint64(digest[48:], d.h[6])
-		putUint64(digest[56:], d.h[7])
+		binary.BigEndian.PutUint64(digest[48:], d.h[6])
+		binary.BigEndian.PutUint64(digest[56:], d.h[7])
 	}
 
 	return digest
diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go
index 40311b0..a27f107 100644
--- a/src/crypto/tls/handshake_client_test.go
+++ b/src/crypto/tls/handshake_client_test.go
@@ -880,6 +880,9 @@
 }
 
 func testResumption(t *testing.T, version uint16) {
+	if testing.Short() {
+		t.Skip("skipping in -short mode")
+	}
 	serverConfig := &Config{
 		MaxVersion:   version,
 		CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
@@ -1727,6 +1730,9 @@
 }
 
 func TestHandshakeRace(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in -short mode")
+	}
 	t.Parallel()
 	// This test races a Read and Write to try and complete a handshake in
 	// order to provide some evidence that there are no races or deadlocks
diff --git a/src/crypto/tls/handshake_server_test.go b/src/crypto/tls/handshake_server_test.go
index 131de0f..843a0a7 100644
--- a/src/crypto/tls/handshake_server_test.go
+++ b/src/crypto/tls/handshake_server_test.go
@@ -1351,8 +1351,8 @@
 e/oCO8HJ/+rJnahJ05XX1Q7lNQ==
 -----END CERTIFICATE-----`
 
-const clientKeyPEM = `
------BEGIN RSA PRIVATE KEY-----
+var clientKeyPEM = testingKey(`
+-----BEGIN RSA TESTING KEY-----
 MIICXQIBAAKBgQC6b6qGvc+/n/LvXJRgeG/oE/LRlm/N2TJuIjfOQfnKXSms4Sfa
 YaLugcsQx980WJWG6T0Z5lwnc2DIjXgC9B2kmAmjGXBpPCViZiqrIiPFe4U4Ty4J
 czKnvT6brcqEB+YPOv93xZ1BhQCKtpvusKQ/LUxM5kI+u1HI3UhU9AyORwIDAQAB
@@ -1366,7 +1366,7 @@
 rWiFla26IVXV0xcD98VWJsTBZMlgPnSOqoMdM1kSEd4fUmlAYI/dFzV1XYSkOmVr
 FhdZnklmpVDeu27P4c0CQQCuCOup0FlJSBpWY1TTfun/KMBkBatMz0VMA3d7FKIU
 csPezl677Yjo8u1r/KzeI6zLg87Z8E6r6ZWNc9wBSZK6
------END RSA PRIVATE KEY-----`
+-----END RSA TESTING KEY-----`)
 
 const clientECDSACertificatePEM = `
 -----BEGIN CERTIFICATE-----
@@ -1383,17 +1383,17 @@
 jWVim34BmT0Y9hCaOGGbLlfk+syxis7iI6CH8OFnUes=
 -----END CERTIFICATE-----`
 
-const clientECDSAKeyPEM = `
+var clientECDSAKeyPEM = testingKey(`
 -----BEGIN EC PARAMETERS-----
 BgUrgQQAIw==
 -----END EC PARAMETERS-----
------BEGIN EC PRIVATE KEY-----
+-----BEGIN EC TESTING KEY-----
 MIHcAgEBBEIBkJN9X4IqZIguiEVKMqeBUP5xtRsEv4HJEtOpOGLELwO53SD78Ew8
 k+wLWoqizS3NpQyMtrU8JFdWfj+C57UNkOugBwYFK4EEACOhgYkDgYYABACVjJF1
 FMBexFe01MNvja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd
 3kfDdq0Z9kUsjLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx
 +U56jb0JuK7qixgnTy5w/hOWusPTQBbNZU6sER7m8Q==
------END EC PRIVATE KEY-----`
+-----END EC TESTING KEY-----`)
 
 const clientEd25519CertificatePEM = `
 -----BEGIN CERTIFICATE-----
@@ -1406,10 +1406,10 @@
 7Q7hF9gRomDQijcjKsJGqjoI
 -----END CERTIFICATE-----`
 
-const clientEd25519KeyPEM = `
------BEGIN PRIVATE KEY-----
+var clientEd25519KeyPEM = testingKey(`
+-----BEGIN TESTING KEY-----
 MC4CAQAwBQYDK2VwBCIEINifzf07d9qx3d44e0FSbV4mC/xQxT644RRbpgNpin7I
------END PRIVATE KEY-----`
+-----END TESTING KEY-----`)
 
 func TestClientAuth(t *testing.T) {
 	var certPath, keyPath, ecdsaCertPath, ecdsaKeyPath, ed25519CertPath, ed25519KeyPath string
@@ -1761,7 +1761,7 @@
 DDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBYGA1UdEQQPMA2CC2V4YW1wbGUu
 Y29tMA0GCSqGSIb3DQEBCwUAA0EAxDuUS+BrrS3c+h+k+fQPOmOScy6yTX9mHw0Q
 KbucGamXYEy0URIwOdO0tQ3LHPc1YGvYSPwkDjkjqECs2Vm/AA==
------END CERTIFICATE-----`), []byte(`-----BEGIN RSA PRIVATE KEY-----
+-----END CERTIFICATE-----`), []byte(testingKey(`-----BEGIN RSA TESTING KEY-----
 MIIBOgIBAAJBAN17PWsVQPBrHYdPFtycVQ/0CFyAQYwdVXaefhVURYUkHojwL82T
 HRfLJCWuYVgHMRCcg+EqWzhPSEWgu+MmdekCAwEAAQJBALjQYNTdXF4CFBbXwUz/
 yt9QFDYT9B5WT/12jeGAe653gtYS6OOi/+eAkGmzg1GlRnw6fOfn+HYNFDORST7z
@@ -1769,7 +1769,7 @@
 nKpbtU22+PbIMSJ+e80fmY9LIPx5N4HTAiAthGSimMR9bloz0EY3GyuUEyqoDgMd
 hXxjuno2WesoJQIgemilbcALXpxsLmZLgcQ2KSmaVr7jb5ECx9R+hYKTw1sCIG4s
 T+E0J8wlH24pgwQHzy7Ko2qLwn1b5PW8ecrlvP1g
------END RSA PRIVATE KEY-----`))
+-----END RSA TESTING KEY-----`)))
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/src/crypto/tls/tls_test.go b/src/crypto/tls/tls_test.go
index 0a3aeef..a07727c 100644
--- a/src/crypto/tls/tls_test.go
+++ b/src/crypto/tls/tls_test.go
@@ -37,7 +37,7 @@
 -----END CERTIFICATE-----
 `
 
-var rsaKeyPEM = `-----BEGIN RSA PRIVATE KEY-----
+var rsaKeyPEM = testingKey(`-----BEGIN RSA TESTING KEY-----
 MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
 k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
@@ -45,12 +45,12 @@
 SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
 xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
 D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
------END RSA PRIVATE KEY-----
-`
+-----END RSA TESTING KEY-----
+`)
 
 // keyPEM is the same as rsaKeyPEM, but declares itself as just
 // "PRIVATE KEY", not "RSA PRIVATE KEY".  https://golang.org/issue/4477
-var keyPEM = `-----BEGIN PRIVATE KEY-----
+var keyPEM = testingKey(`-----BEGIN TESTING KEY-----
 MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
 k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
@@ -58,8 +58,8 @@
 SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
 xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
 D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
------END PRIVATE KEY-----
-`
+-----END TESTING KEY-----
+`)
 
 var ecdsaCertPEM = `-----BEGIN CERTIFICATE-----
 MIIB/jCCAWICCQDscdUxw16XFDAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
@@ -76,17 +76,17 @@
 -----END CERTIFICATE-----
 `
 
-var ecdsaKeyPEM = `-----BEGIN EC PARAMETERS-----
+var ecdsaKeyPEM = testingKey(`-----BEGIN EC PARAMETERS-----
 BgUrgQQAIw==
 -----END EC PARAMETERS-----
------BEGIN EC PRIVATE KEY-----
+-----BEGIN EC TESTING KEY-----
 MIHcAgEBBEIBrsoKp0oqcv6/JovJJDoDVSGWdirrkgCWxrprGlzB9o0X8fV675X0
 NwuBenXFfeZvVcwluO7/Q9wkYoPd/t3jGImgBwYFK4EEACOhgYkDgYYABAFj36bL
 06h5JRGUNB1X/Hwuw64uKW2GGJLVPPhoYMcg/ALWaW+d/t+DmV5xikwKssuFq4Bz
 VQldyCXTXGgu7OC0AQCC/Y/+ODK3NFKlRi+AsG3VQDSV4tgHLqZBBus0S6pPcg1q
 kohxS/xfFg/TEwRSSws+roJr4JFKpO2t3/be5OdqmQ==
------END EC PRIVATE KEY-----
-`
+-----END EC TESTING KEY-----
+`)
 
 var keyPairTests = []struct {
 	algo string
@@ -372,7 +372,9 @@
 		ClientSessionCache: NewLRUClientSessionCache(32),
 	}
 	for i := 0; i < 2; i++ {
-		c, err := Dial("tcp", "mail.google.com:https", config)
+		c, err := DialWithDialer(&net.Dialer{
+			Timeout: 10 * time.Second,
+		}, "tcp", "mail.google.com:https", config)
 		if err != nil {
 			t.Fatalf("Dial #%d: %v", i, err)
 		}
@@ -389,12 +391,13 @@
 		if err := c.VerifyHostname("mail.google.com"); err != nil {
 			t.Fatalf("verify mail.google.com #%d: %v", i, err)
 		}
-		// Give the client a chance to read the server session tickets.
-		c.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
+		// Have the server send some data so session tickets are delivered.
+		c.SetDeadline(time.Now().Add(5 * time.Second))
+		if _, err := io.WriteString(c, "HEAD / HTTP/1.0\n\n"); err != nil {
+			t.Fatal(err)
+		}
 		if _, err := c.Read(make([]byte, 1)); err != nil {
-			if err, ok := err.(net.Error); !ok || !err.Timeout() {
-				t.Fatal(err)
-			}
+			t.Fatal(err)
 		}
 		c.Close()
 	}
@@ -1139,3 +1142,5 @@
 		t.Fatalf("Certificates were mutated by BuildNameToCertificate\nGot: %#v\nWant: %#v\n", got, want)
 	}
 }
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
diff --git a/src/crypto/x509/pem_decrypt_test.go b/src/crypto/x509/pem_decrypt_test.go
index 685d5ee..dacef8b 100644
--- a/src/crypto/x509/pem_decrypt_test.go
+++ b/src/crypto/x509/pem_decrypt_test.go
@@ -80,8 +80,8 @@
 	{
 		kind:     PEMCipherDES,
 		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+		pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: DES-CBC,34F09A4FC8DE22B5
 
@@ -92,7 +92,7 @@
 XOH9VfTjb52q/I8Suozq9coVQwg4tXfIoYUdT//O+mB7zJb9HI9Ps77b9TxDE6Gm
 4C9brwZ3zg2vqXcwwV6QRZMtyll9rOpxkbw6NPlpfBqkc3xS51bbxivbO/Nve4KD
 r12ymjFNF4stXCfJnNqKoZ50BHmEEUDu5Wb0fpVn82XrGw7CYc4iug==
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
 		plainDER: `
 MIIBPAIBAAJBAPASZe+tCPU6p80AjHhDkVsLYa51D35e/YGa8QcZyooeZM8EHozo
 KD0fNiKI+53bHdy07N+81VQ8/ejPcRoXPlsCAwEAAQJBAMTxIuSq27VpR+zZ7WJf
@@ -105,8 +105,8 @@
 	{
 		kind:     PEMCipher3DES,
 		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+		pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: DES-EDE3-CBC,C1F4A6A03682C2C7
 
@@ -117,7 +117,7 @@
 ldw5w7WC7d13x2LsRkwo8ZrDKgIV+Y9GNvhuCCkTzNP0V3gNeJpd201HZHR+9n3w
 3z0VjR/MGqsfcy1ziEWMNOO53At3zlG6zP05aHMnMcZoVXadEK6L1gz++inSSDCq
 gI0UJP4e3JVB7AkgYymYAwiYALAkoEIuanxoc50njJk=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
 		plainDER: `
 MIIBOwIBAAJBANOCXKdoNS/iP/MAbl9cf1/SF3P+Ns7ZeNL27CfmDh0O6Zduaax5
 NBiumd2PmjkaCu7lQ5JOibHfWn+xJsc3kw0CAwEAAQJANX/W8d1Q/sCqzkuAn4xl
@@ -130,8 +130,8 @@
 	{
 		kind:     PEMCipherAES128,
 		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+		pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-128-CBC,D4492E793FC835CC038A728ED174F78A
 
@@ -142,7 +142,7 @@
 3NbvRVvYTgs8K9EPk4K+5R+P2kD8J8KvEIGxVa1vz8QoCJ/jr7Ka2rvNgPCex5/E
 080LzLHPCrXKdlr/f50yhNWq08ZxMWQFkui+FDHPDUaEELKAXV8/5PDxw80Rtybo
 AVYoCVIbZXZCuCO81op8UcOgEpTtyU5Lgh3Mw5scQL0=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
 		plainDER: `
 MIIBOgIBAAJBAMBlj5FxYtqbcy8wY89d/S7n0+r5MzD9F63BA/Lpl78vQKtdJ5dT
 cDGh/rBt1ufRrNp0WihcmZi7Mpl/3jHjiWECAwEAAQJABNOHYnKhtDIqFYj1OAJ3
@@ -155,8 +155,8 @@
 	{
 		kind:     PEMCipherAES192,
 		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+		pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-192-CBC,E2C9FB02BCA23ADE1829F8D8BC5F5369
 
@@ -167,7 +167,7 @@
 ReUtTw8exmKsY4gsSjhkg5uiw7/ZB1Ihto0qnfQJgjGc680qGkT1d6JfvOfeYAk6
 xn5RqS/h8rYAYm64KnepfC9vIujo4NqpaREDmaLdX5MJPQ+SlytITQvgUsUq3q/t
 Ss85xjQEZH3hzwjQqdJvmA4hYP6SUjxYpBM+02xZ1Xw=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
 		plainDER: `
 MIIBOwIBAAJBAMGcRrZiNNmtF20zyS6MQ7pdGx17aFDl+lTl+qnLuJRUCMUG05xs
 OmxmL/O1Qlf+bnqR8Bgg65SfKg21SYuLhiMCAwEAAQJBAL94uuHyO4wux2VC+qpj
@@ -180,8 +180,8 @@
 	{
 		kind:     PEMCipherAES256,
 		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+		pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-256-CBC,8E7ED5CD731902CE938957A886A5FFBD
 
@@ -192,7 +192,7 @@
 2XugkleBFSMKzEp9mxXKRfa++uidQvMZTFLDK9w5YjrRvMBo/l2BoZIsq0jAIE1N
 sv5Z/KwlX+3MDEpPQpUwGPlGGdLnjI3UZ+cjgqBcoMiNc6HfgbBgYJSU6aDSHuCk
 clCwByxWkBNgJ2GrkwNrF26v+bGJJJNR4SKouY1jQf0=
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
 		plainDER: `
 MIIBOgIBAAJBAKy3GFkstoCHIEeUU/qO8207m8WSrjksR+p9B4tf1w5k+2O1V/GY
 AQ5WFCApItcOkQe/I0yZZJk/PmCqMzSxrc8CAwEAAQJAOCAz0F7AW9oNelVQSP8F
@@ -207,15 +207,15 @@
 		// openssl genrsa -aes128 -passout pass:asdf -out server.orig.key 128
 		kind:     PEMCipherAES128,
 		password: []byte("asdf"),
-		pemData: []byte(`
------BEGIN RSA PRIVATE KEY-----
+		pemData: []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-128-CBC,74611ABC2571AF11B1BF9B69E62C89E7
 
 6ei/MlytjE0FFgZOGQ+jrwomKfpl8kdefeE0NSt/DMRrw8OacHAzBNi3pPEa0eX3
 eND9l7C9meCirWovjj9QWVHrXyugFuDIqgdhQ8iHTgCfF3lrmcttVrbIfMDw+smD
 hTP8O1mS/MHl92NE0nhv0w==
------END RSA PRIVATE KEY-----`),
+-----END RSA TESTING KEY-----`)),
 		plainDER: `
 MGMCAQACEQC6ssxmYuauuHGOCDAI54RdAgMBAAECEQCWIn6Yv2O+kBcDF7STctKB
 AgkA8SEfu/2i3g0CCQDGNlXbBHX7kQIIK3Ww5o0cYbECCQDCimPb0dYGsQIIeQ7A
@@ -223,14 +223,14 @@
 	},
 }
 
-const incompleteBlockPEM = `
------BEGIN RSA PRIVATE KEY-----
+var incompleteBlockPEM = testingKey(`
+-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-128-CBC,74611ABC2571AF11B1BF9B69E62C89E7
 
 6L8yXK2MTQUWBk4ZD6OvCiYp+mXyR1594TQ1K38MxGvDw5pwcDME2Lek8RrR5fd40P2XsL2Z4KKt
 ai+OP1BZUetfK6AW4MiqB2FDyIdOAJ8XeWuZy21Wtsh8wPD6yYOFM/w7WZL8weX3Y0TSeG/T
------END RSA PRIVATE KEY-----`
+-----END RSA TESTING KEY-----`)
 
 func TestIncompleteBlock(t *testing.T) {
 	// incompleteBlockPEM contains ciphertext that is not a multiple of the
@@ -245,3 +245,5 @@
 		t.Fatalf("Expected error containing %q but got: %q", expectedSubstr, e)
 	}
 }
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
diff --git a/src/crypto/x509/root_cgo_darwin.go b/src/crypto/x509/root_cgo_darwin.go
index e633207..255a8d3 100644
--- a/src/crypto/x509/root_cgo_darwin.go
+++ b/src/crypto/x509/root_cgo_darwin.go
@@ -16,7 +16,7 @@
 #include <CoreFoundation/CoreFoundation.h>
 #include <Security/Security.h>
 
-static bool isSSLPolicy(SecPolicyRef policyRef) {
+static Boolean isSSLPolicy(SecPolicyRef policyRef) {
 	if (!policyRef) {
 		return false;
 	}
@@ -24,13 +24,13 @@
 	if (properties == NULL) {
 		return false;
 	}
+	Boolean isSSL = false;
 	CFTypeRef value = NULL;
 	if (CFDictionaryGetValueIfPresent(properties, kSecPolicyOid, (const void **)&value)) {
-		CFRelease(properties);
-		return CFEqual(value, kSecPolicyAppleSSL);
+		isSSL = CFEqual(value, kSecPolicyAppleSSL);
 	}
 	CFRelease(properties);
-	return false;
+	return isSSL;
 }
 
 // sslTrustSettingsResult obtains the final kSecTrustSettingsResult value
@@ -51,6 +51,7 @@
 	}
 
 	// > no trust settings [...] means "this certificate must be verified to a known trusted certificate”
+	// (Should this cause a fallback from user to admin domain? It's unclear.)
 	if (err != errSecSuccess || trustSettings == NULL) {
 		if (trustSettings != NULL) CFRelease(trustSettings);
 		return kSecTrustSettingsResultUnspecified;
@@ -77,16 +78,12 @@
 	for (m = 0; m < CFArrayGetCount(trustSettings); m++) {
 		CFDictionaryRef tSetting = (CFDictionaryRef)CFArrayGetValueAtIndex(trustSettings, m);
 
-		// First, check if this trust setting applies to our policy. We assume
-		// only one will. The docs suggest that there might be multiple applying
-		// but don't explain how to combine them.
+		// First, check if this trust setting is constrained to a non-SSL policy.
 		SecPolicyRef policyRef;
 		if (CFDictionaryGetValueIfPresent(tSetting, _kSecTrustSettingsPolicy, (const void**)&policyRef)) {
 			if (!isSSLPolicy(policyRef)) {
 				continue;
 			}
-		} else {
-			continue;
 		}
 
 		if (CFDictionaryContainsKey(tSetting, _kSecTrustSettingsPolicyString)) {
@@ -98,13 +95,23 @@
 		if (CFDictionaryGetValueIfPresent(tSetting, _kSecTrustSettingsResult, (const void**)&cfNum)) {
 			CFNumberGetValue(cfNum, kCFNumberSInt32Type, &result);
 		} else {
-			// > If the value of the kSecTrustSettingsResult component is not
-			// > kSecTrustSettingsResultUnspecified for a usage constraints dictionary that has
-			// > no constraints, the default value kSecTrustSettingsResultTrustRoot is assumed.
+			// > If this key is not present, a default value of
+			// > kSecTrustSettingsResultTrustRoot is assumed.
 			result = kSecTrustSettingsResultTrustRoot;
 		}
 
-		break;
+		// If multiple dictionaries match, we are supposed to "OR" them,
+		// the semantics of which are not clear. Since TrustRoot and TrustAsRoot
+		// are mutually exclusive, Deny should probably override, and Invalid and
+		// Unspecified be overridden, approximate this by stopping at the first
+		// TrustRoot, TrustAsRoot or Deny.
+		if (result == kSecTrustSettingsResultTrustRoot) {
+			break;
+		} else if (result == kSecTrustSettingsResultTrustAsRoot) {
+			break;
+		} else if (result == kSecTrustSettingsResultDeny) {
+			break;
+		}
 	}
 
 	// If trust settings are present, but none of them match the policy...
@@ -143,7 +150,7 @@
 	return equal;
 }
 
-// FetchPEMRoots fetches the system's list of trusted X.509 root certificates
+// CopyPEMRoots fetches the system's list of trusted X.509 root certificates
 // for the kSecTrustSettingsPolicy SSL.
 //
 // On success it returns 0 and fills pemRoots with a CFDataRef that contains the extracted root
@@ -152,15 +159,15 @@
 //
 // Note: The CFDataRef returned in pemRoots and untrustedPemRoots must
 // be released (using CFRelease) after we've consumed its content.
-int FetchPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugDarwinRoots) {
+int CopyPEMRoots(CFDataRef *pemRoots, CFDataRef *untrustedPemRoots, bool debugDarwinRoots) {
 	int i;
 
 	if (debugDarwinRoots) {
-		printf("crypto/x509: kSecTrustSettingsResultInvalid = %d\n", kSecTrustSettingsResultInvalid);
-		printf("crypto/x509: kSecTrustSettingsResultTrustRoot = %d\n", kSecTrustSettingsResultTrustRoot);
-		printf("crypto/x509: kSecTrustSettingsResultTrustAsRoot = %d\n", kSecTrustSettingsResultTrustAsRoot);
-		printf("crypto/x509: kSecTrustSettingsResultDeny = %d\n", kSecTrustSettingsResultDeny);
-		printf("crypto/x509: kSecTrustSettingsResultUnspecified = %d\n", kSecTrustSettingsResultUnspecified);
+		fprintf(stderr, "crypto/x509: kSecTrustSettingsResultInvalid = %d\n", kSecTrustSettingsResultInvalid);
+		fprintf(stderr, "crypto/x509: kSecTrustSettingsResultTrustRoot = %d\n", kSecTrustSettingsResultTrustRoot);
+		fprintf(stderr, "crypto/x509: kSecTrustSettingsResultTrustAsRoot = %d\n", kSecTrustSettingsResultTrustAsRoot);
+		fprintf(stderr, "crypto/x509: kSecTrustSettingsResultDeny = %d\n", kSecTrustSettingsResultDeny);
+		fprintf(stderr, "crypto/x509: kSecTrustSettingsResultUnspecified = %d\n", kSecTrustSettingsResultUnspecified);
 	}
 
 	// Get certificates from all domains, not just System, this lets
@@ -170,7 +177,7 @@
 		kSecTrustSettingsDomainAdmin, kSecTrustSettingsDomainUser };
 
 	int numDomains = sizeof(domains)/sizeof(SecTrustSettingsDomain);
-	if (pemRoots == NULL) {
+	if (pemRoots == NULL || untrustedPemRoots == NULL) {
 		return -1;
 	}
 
@@ -186,8 +193,6 @@
 
 		CFIndex numCerts = CFArrayGetCount(certs);
 		for (j = 0; j < numCerts; j++) {
-			CFDataRef data = NULL;
-			CFArrayRef trustSettings = NULL;
 			SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(certs, j);
 			if (cert == NULL) {
 				continue;
@@ -206,7 +211,7 @@
 					CFErrorRef errRef = NULL;
 					CFStringRef summary = SecCertificateCopyShortDescription(NULL, cert, &errRef);
 					if (errRef != NULL) {
-						printf("crypto/x509: SecCertificateCopyShortDescription failed\n");
+						fprintf(stderr, "crypto/x509: SecCertificateCopyShortDescription failed\n");
 						CFRelease(errRef);
 						continue;
 					}
@@ -215,7 +220,7 @@
 					CFIndex maxSize = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1;
 					char *buffer = malloc(maxSize);
 					if (CFStringGetCString(summary, buffer, maxSize, kCFStringEncodingUTF8)) {
-						printf("crypto/x509: %s returned %d\n", buffer, (int)result);
+						fprintf(stderr, "crypto/x509: %s returned %d\n", buffer, (int)result);
 					}
 					free(buffer);
 					CFRelease(summary);
@@ -246,11 +251,16 @@
 			} else if (result == kSecTrustSettingsResultDeny) {
 				appendTo = combinedUntrustedData;
 			} else if (result == kSecTrustSettingsResultUnspecified) {
+				// Certificates with unspecified trust should probably be added to a pool of
+				// intermediates for chain building, or checked for transitive trust and
+				// added to the root pool (which is an imprecise approximation because it
+				// cuts chains short) but we don't support either at the moment. TODO.
 				continue;
 			} else {
 				continue;
 			}
 
+			CFDataRef data = NULL;
 			err = SecItemExport(cert, kSecFormatX509Cert, kSecItemPemArmour, NULL, &data);
 			if (err != noErr) {
 				continue;
@@ -274,22 +284,22 @@
 )
 
 func loadSystemRoots() (*CertPool, error) {
-	roots := NewCertPool()
-
-	var data C.CFDataRef = 0
-	var untrustedData C.CFDataRef = 0
-	err := C.FetchPEMRoots(&data, &untrustedData, C.bool(debugDarwinRoots))
+	var data, untrustedData C.CFDataRef
+	err := C.CopyPEMRoots(&data, &untrustedData, C.bool(debugDarwinRoots))
 	if err == -1 {
 		return nil, errors.New("crypto/x509: failed to load darwin system roots with cgo")
 	}
-
 	defer C.CFRelease(C.CFTypeRef(data))
+	defer C.CFRelease(C.CFTypeRef(untrustedData))
+
 	buf := C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(data)), C.int(C.CFDataGetLength(data)))
+	roots := NewCertPool()
 	roots.AppendCertsFromPEM(buf)
-	if untrustedData == 0 {
+
+	if C.CFDataGetLength(untrustedData) == 0 {
 		return roots, nil
 	}
-	defer C.CFRelease(C.CFTypeRef(untrustedData))
+
 	buf = C.GoBytes(unsafe.Pointer(C.CFDataGetBytePtr(untrustedData)), C.int(C.CFDataGetLength(untrustedData)))
 	untrustedRoots := NewCertPool()
 	untrustedRoots.AppendCertsFromPEM(buf)
diff --git a/src/crypto/x509/root_darwin_test.go b/src/crypto/x509/root_darwin_test.go
index 1165a97e..0a1529e 100644
--- a/src/crypto/x509/root_darwin_test.go
+++ b/src/crypto/x509/root_darwin_test.go
@@ -120,12 +120,10 @@
 
 	if t.Failed() && debugDarwinRoots {
 		cmd := exec.Command("security", "dump-trust-settings")
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
+		cmd.Stdout, cmd.Stderr = os.Stderr, os.Stderr
 		cmd.Run()
 		cmd = exec.Command("security", "dump-trust-settings", "-d")
-		cmd.Stdout = os.Stdout
-		cmd.Stderr = os.Stderr
+		cmd.Stdout, cmd.Stderr = os.Stderr, os.Stderr
 		cmd.Run()
 	}
 }
diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go
index 7dadb77..171509f 100644
--- a/src/crypto/x509/x509_test.go
+++ b/src/crypto/x509/x509_test.go
@@ -112,8 +112,8 @@
 -----END PUBLIC KEY-----
 `
 
-var pemPrivateKey = `
------BEGIN RSA PRIVATE KEY-----
+var pemPrivateKey = testingKey(`
+-----BEGIN RSA TESTING KEY-----
 MIICXAIBAAKBgQCxoeCUW5KJxNPxMp+KmCxKLc1Zv9Ny+4CFqcUXVUYH69L3mQ7v
 IWrJ9GBfcaA7BPQqUlWxWM+OCEQZH1EZNIuqRMNQVuIGCbz5UQ8w6tS0gcgdeGX7
 J7jgCQ4RK3F/PuCM38QBLaHx988qG8NMc6VKErBjctCXFHQt14lerd5KpQIDAQAB
@@ -127,8 +127,8 @@
 AAA7eoZ9AEHflUeuLn9QJI/r0hyQQLEtrpwv6rDT1GCWaLII5HJ6NUFVf4TTcqxo
 6vdM4QGKTJoO+SaCyP0CQFdpcxSAuzpFcKv0IlJ8XzS/cy+mweCMwyJ1PFEc4FX6
 wg/HcAJWY60xZTJDFN+Qfx8ZQvBEin6c2/h+zZi5IVY=
------END RSA PRIVATE KEY-----
-`
+-----END RSA TESTING KEY-----
+`)
 
 // pemEd25519Key is the example from RFC 8410, Secrion 4.
 var pemEd25519Key = `
@@ -1243,10 +1243,13 @@
 }
 
 func TestImports(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in -short mode")
+	}
 	testenv.MustHaveGoRun(t)
 
-	if err := exec.Command(testenv.GoToolPath(t), "run", "x509_test_import.go").Run(); err != nil {
-		t.Errorf("failed to run x509_test_import.go: %s", err)
+	if out, err := exec.Command(testenv.GoToolPath(t), "run", "x509_test_import.go").CombinedOutput(); err != nil {
+		t.Errorf("failed to run x509_test_import.go: %s\n%s", err, out)
 	}
 }
 
diff --git a/src/crypto/x509/x509_test_import.go b/src/crypto/x509/x509_test_import.go
index 3fda7da..b778df2 100644
--- a/src/crypto/x509/x509_test_import.go
+++ b/src/crypto/x509/x509_test_import.go
@@ -15,6 +15,7 @@
 	"crypto/x509/pkix"
 	"encoding/pem"
 	"math/big"
+	"strings"
 	"time"
 )
 
@@ -41,7 +42,7 @@
 	}
 }
 
-var pemPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
+var pemPrivateKey = testingKey(`-----BEGIN RSA TESTING KEY-----
 MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
 fd7Ai2KW5ToIwzFofvJcS/STa6HA5gQenRUCAwEAAQJBAIq9amn00aS0h/CrjXqu
 /ThglAXJmZhOMPVn4eiu7/ROixi9sex436MaVeMqSNf7Ex9a8fRNfWss7Sqd9eWu
@@ -49,5 +50,7 @@
 EO+ZJ79TJKN5yiGBRsv5yvx5UiHxajEXAiAhAol5N4EUyq6I9w1rYdhPMGpLfk7A
 IU2snfRJ6Nq2CQIgFrPsWRCkV+gOYcajD17rEqmuLrdIRexpg8N1DOSXoJ8CIGlS
 tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
------END RSA PRIVATE KEY-----
-`
+-----END RSA TESTING KEY-----
+`)
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
diff --git a/src/debug/gosym/pclntab_test.go b/src/debug/gosym/pclntab_test.go
index ef644f8..6baa53d 100644
--- a/src/debug/gosym/pclntab_test.go
+++ b/src/debug/gosym/pclntab_test.go
@@ -196,6 +196,9 @@
 }
 
 func TestPCLine(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in -short mode")
+	}
 	dotest(t)
 	defer endtest()
 
diff --git a/src/encoding/gob/decgen.go b/src/encoding/gob/decgen.go
index bad4fe5..1c31e66 100644
--- a/src/encoding/gob/decgen.go
+++ b/src/encoding/gob/decgen.go
@@ -185,10 +185,12 @@
 		log.Fatal("source format error:", err)
 	}
 	fd, err := os.Create(*output)
-	_, err = fd.Write(source)
 	if err != nil {
 		log.Fatal(err)
 	}
+	if _, err := fd.Write(source); err != nil {
+		log.Fatal(err)
+	}
 }
 
 func printMaps(b *bytes.Buffer, upperClass string) {
diff --git a/src/encoding/gob/encgen.go b/src/encoding/gob/encgen.go
index 0c051d2..409b8c9 100644
--- a/src/encoding/gob/encgen.go
+++ b/src/encoding/gob/encgen.go
@@ -164,10 +164,12 @@
 		log.Fatal("source format error:", err)
 	}
 	fd, err := os.Create(*output)
-	_, err = fd.Write(source)
 	if err != nil {
 		log.Fatal(err)
 	}
+	if _, err := fd.Write(source); err != nil {
+		log.Fatal(err)
+	}
 }
 
 func printMaps(b *bytes.Buffer, upperClass string) {
diff --git a/src/encoding/json/encode_test.go b/src/encoding/json/encode_test.go
index cd5eadf..bdf2a9f 100644
--- a/src/encoding/json/encode_test.go
+++ b/src/encoding/json/encode_test.go
@@ -580,6 +580,9 @@
 	// Test that encodeState.stringBytes and encodeState.string use the same encoding.
 	var r []rune
 	for i := '\u0000'; i <= unicode.MaxRune; i++ {
+		if testing.Short() && i > 1000 {
+			i = unicode.MaxRune
+		}
 		r = append(r, i)
 	}
 	s := string(r) + "\xff\xff\xffhello" // some invalid UTF-8 too
@@ -864,6 +867,9 @@
 
 	var digits = "1.2345678901234567890123"
 	for i := len(digits); i >= 2; i-- {
+		if testing.Short() && i < len(digits)-4 {
+			break
+		}
 		for exp := -30; exp <= 30; exp++ {
 			for _, sign := range "+-" {
 				for bits := 32; bits <= 64; bits += 32 {
diff --git a/src/encoding/pem/pem_test.go b/src/encoding/pem/pem_test.go
index 204611b..8515b46 100644
--- a/src/encoding/pem/pem_test.go
+++ b/src/encoding/pem/pem_test.go
@@ -285,7 +285,7 @@
 	}
 }
 
-var pemData = `verify return:0
+var pemData = testingKey(`verify return:0
 -----BEGIN CERTIFICATE-----
 sdlfkjskldfj
   -----BEGIN CERTIFICATE-----
@@ -296,13 +296,13 @@
 -----BEGIN CERTIFICATE-----
 testing
 -----BEGIN CERTIFICATE-----
------BEGIN CERTIFICATE----- 
+-----BEGIN CERTIFICATE-----
 MIID6TCCA1ICAQEwDQYJKoZIhvcNAQEFBQAwgYsxCzAJBgNVBAYTAlVTMRMwEQYD
 VQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRQwEgYDVQQK
-EwtHb29nbGUgSW5jLjEMMAoGA1UECxMDRW5nMQwwCgYDVQQDEwNhZ2wxHTAbBgkq 
-hkiG9w0BCQEWDmFnbEBnb29nbGUuY29tMB4XDTA5MDkwOTIyMDU0M1oXDTEwMDkw  
-OTIyMDU0M1owajELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAf  	  
-BgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEjMCEGA1UEAxMaZXVyb3Bh		  
+EwtHb29nbGUgSW5jLjEMMAoGA1UECxMDRW5nMQwwCgYDVQQDEwNhZ2wxHTAbBgkq
+hkiG9w0BCQEWDmFnbEBnb29nbGUuY29tMB4XDTA5MDkwOTIyMDU0M1oXDTEwMDkw
+OTIyMDU0M1owajELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAf
+BgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEjMCEGA1UEAxMaZXVyb3Bh
 LnNmby5jb3JwLmdvb2dsZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
 AoICAQC6pgYt7/EibBDumASF+S0qvqdL/f+nouJw2T1Qc8GmXF/iiUcrsgzh/Fd8
 pDhz/T96Qg9IyR4ztuc2MXrmPra+zAuSf5bevFReSqvpIt8Duv0HbDbcqs/XKPfB
@@ -318,15 +318,15 @@
 SIb3DQEBBQUAA4GBAOKnQDtqBV24vVqvesL5dnmyFpFPXBn3WdFfwD6DzEb21UVG
 5krmJiu+ViipORJPGMkgoL6BjU21XI95VQbun5P8vvg8Z+FnFsvRFY3e1CCzAVQY
 ZsUkLw2I7zI/dNlWdB8Xp7v+3w9sX5N3J/WuJ1KOO5m26kRlHQo7EzT3974g
------END CERTIFICATE-----   
+-----END CERTIFICATE-----
  1 s:/C=ZA/O=Ca Inc./CN=CA Inc
 
------BEGIN RSA PRIVATE KEY-----   	
-Proc-Type: 4,ENCRYPTED	  
-DEK-Info: DES-EDE3-CBC,80C7C7A09690757A  	
-  	
+-----BEGIN RSA TESTING KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,80C7C7A09690757A
+
 eQp5ZkH6CyHBz7BZfUPxyLCCmftsBJ7HlqGb8Ld21cSwnzWZ4/SIlhyrUtsfw7VR
-2TTwA+odo9ex7GdxOTaH8oZFumIRoiEjHsk8U7Bhntp+ekkPP79xunnN7hb7hkhr   
+2TTwA+odo9ex7GdxOTaH8oZFumIRoiEjHsk8U7Bhntp+ekkPP79xunnN7hb7hkhr
 yGDQZgA7s2cQHQ71v3gwT2BACAft26jCjbM1wgNzBnJ8M0Rzn68YWqaPtdBu8qb/
 zVR5JB1mnqvTSbFsfF5yMc6o2WQ9jJCl6KypnMl+BpL+dlvdjYVK4l9lYsB1Hs3d
 +zDBbWxos818zzhS8/y6eIfiSG27cqrbhURbmgiSfDXjncK4m/pLcQ7mmBL6mFOr
@@ -338,7 +338,7 @@
 wHFsZc20TzSdsVLBtwksUacpbDogcEVMctnNrB8FIrB3vZEv9Q0Z1VeY7nmTpF+6
 a+z2P7acL7j6A6Pr3+q8P9CPiPC7zFonVzuVPyB8GchGR2hytyiOVpuD9+k8hcuw
 ZWAaUoVtWIQ52aKS0p19G99hhb+IVANC4akkdHV4SP8i7MVNZhfUmg==
------END RSA PRIVATE KEY-----
+-----END RSA TESTING KEY-----
 
 
 -----BEGIN EMPTY-----
@@ -363,7 +363,7 @@
 -----BEGIN HEADERS-----
 Header: 1
 
------END HEADERS-----`
+-----END HEADERS-----`)
 
 var certificate = &Block{Type: "CERTIFICATE",
 	Headers: map[string]string{},
@@ -582,7 +582,7 @@
 	},
 }
 
-var pemPrivateKey2 = `-----BEGIN RSA PRIVATE KEY-----
+var pemPrivateKey2 = testingKey(`-----BEGIN RSA TESTING KEY-----
 Proc-Type: 4,ENCRYPTED
 Content-Domain: RFC822
 DEK-Info: AES-128-CBC,BFCD243FEDBB40A4AA6DDAA1335473A4
@@ -594,8 +594,8 @@
 GjA4DbE7Z4dk9coyZ9HIpT0jcsQGr497Jqw8dZGhABPGXEnVPOeyspng1SX64hKA
 N4XPksobn/NO2IDvPM7N9ZCe+aeyDEkE8QmP6mPScLuGvzSrsgOxWTMWF7Dbdzj0
 tJQLJRZ+ItT5Irl4owSEBNLahC1j3fhQavbj9WVAfKk=
------END RSA PRIVATE KEY-----
-`
+-----END RSA TESTING KEY-----
+`)
 
 func TestBadEncode(t *testing.T) {
 	b := &Block{Type: "BAD", Headers: map[string]string{"X:Y": "Z"}}
@@ -610,3 +610,5 @@
 		t.Fatalf("EncodeToMemory returned non-nil data")
 	}
 }
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
diff --git a/src/errors/example_test.go b/src/errors/example_test.go
index 7724c16..d7dd782 100644
--- a/src/errors/example_test.go
+++ b/src/errors/example_test.go
@@ -36,11 +36,12 @@
 }
 
 func ExampleAs() {
-	_, err := os.Open("non-existing")
-	if err != nil {
+	if _, err := os.Open("non-existing"); err != nil {
 		var pathError *os.PathError
 		if errors.As(err, &pathError) {
 			fmt.Println("Failed at path:", pathError.Path)
+		} else {
+			fmt.Println(err)
 		}
 	}
 
diff --git a/src/errors/wrap.go b/src/errors/wrap.go
index 62332b1..760a08a 100644
--- a/src/errors/wrap.go
+++ b/src/errors/wrap.go
@@ -8,8 +8,9 @@
 	"internal/reflectlite"
 )
 
-// Unwrap returns the result of calling the Unwrap method on err, if err
-// implements Wrapper. Otherwise, Unwrap returns nil.
+// Unwrap returns the result of calling the Unwrap method on err, if err's
+// type contains an Unwrap method returning error.
+// Otherwise, Unwrap returns nil.
 func Unwrap(err error) error {
 	u, ok := err.(interface {
 		Unwrap() error
diff --git a/src/fmt/print.go b/src/fmt/print.go
index 3253e80..5958691 100644
--- a/src/fmt/print.go
+++ b/src/fmt/print.go
@@ -122,7 +122,7 @@
 	panicking bool
 	// erroring is set when printing an error string to guard against calling handleMethods.
 	erroring bool
-	// wrapErrors is set when the format string may contain a %w verb.
+	// wrapErrs is set when the format string may contain a %w verb.
 	wrapErrs bool
 	// wrappedErr records the target of the %w verb.
 	wrappedErr error
@@ -137,6 +137,7 @@
 	p := ppFree.Get().(*pp)
 	p.panicking = false
 	p.erroring = false
+	p.wrapErrs = false
 	p.fmt.init(&p.buf)
 	return p
 }
diff --git a/src/go/internal/srcimporter/srcimporter_test.go b/src/go/internal/srcimporter/srcimporter_test.go
index 087f974..5654943 100644
--- a/src/go/internal/srcimporter/srcimporter_test.go
+++ b/src/go/internal/srcimporter/srcimporter_test.go
@@ -81,10 +81,10 @@
 		t.Skip("no source code available")
 	}
 
-	dt := maxTime
 	if testing.Short() && testenv.Builder() == "" {
-		dt = 500 * time.Millisecond
+		t.Skip("skipping in -short mode")
 	}
+	dt := maxTime
 	nimports, _ := walkDir(t, "", time.Now().Add(dt)) // installed packages
 	t.Logf("tested %d imports", nimports)
 }
diff --git a/src/image/decode_test.go b/src/image/decode_test.go
index 85e235e..2b3ff6b 100644
--- a/src/image/decode_test.go
+++ b/src/image/decode_test.go
@@ -123,6 +123,10 @@
 			continue
 		}
 		c, _, err := decodeConfig(it.filename)
+		if err != nil {
+			t.Errorf("%s: %v", it.filename, err)
+			continue loop
+		}
 		if m.ColorModel() != c.ColorModel {
 			t.Errorf("%s: color models differ", it.filename)
 			continue loop
diff --git a/src/image/gif/writer.go b/src/image/gif/writer.go
index 5819df0..7220446d 100644
--- a/src/image/gif/writer.go
+++ b/src/image/gif/writer.go
@@ -433,8 +433,18 @@
 		opts.Drawer = draw.FloydSteinberg
 	}
 
-	pm, ok := m.(*image.Paletted)
-	if !ok || len(pm.Palette) > opts.NumColors {
+	pm, _ := m.(*image.Paletted)
+	if pm == nil {
+		if cp, ok := m.ColorModel().(color.Palette); ok {
+			pm = image.NewPaletted(b, cp)
+			for y := b.Min.Y; y < b.Max.Y; y++ {
+				for x := b.Min.X; x < b.Max.X; x++ {
+					pm.Set(x, y, cp.Convert(m.At(x, y)))
+				}
+			}
+		}
+	}
+	if pm == nil || len(pm.Palette) > opts.NumColors {
 		// Set pm to be a palettedized copy of m, including its bounds, which
 		// might not start at (0, 0).
 		//
diff --git a/src/image/gif/writer_test.go b/src/image/gif/writer_test.go
index 91275bb..0bc24d1 100644
--- a/src/image/gif/writer_test.go
+++ b/src/image/gif/writer_test.go
@@ -48,11 +48,17 @@
 // have the same bounds.
 func averageDelta(m0, m1 image.Image) int64 {
 	b := m0.Bounds()
+	return averageDeltaBound(m0, m1, b, b)
+}
+
+// averageDeltaBounds returns the average delta in RGB space. The average delta is
+// calulated in the specified bounds.
+func averageDeltaBound(m0, m1 image.Image, b0, b1 image.Rectangle) int64 {
 	var sum, n int64
-	for y := b.Min.Y; y < b.Max.Y; y++ {
-		for x := b.Min.X; x < b.Max.X; x++ {
+	for y := b0.Min.Y; y < b0.Max.Y; y++ {
+		for x := b0.Min.X; x < b0.Max.X; x++ {
 			c0 := m0.At(x, y)
-			c1 := m1.At(x, y)
+			c1 := m1.At(x-b0.Min.X+b1.Min.X, y-b0.Min.Y+b1.Min.Y)
 			r0, g0, b0, _ := c0.RGBA()
 			r1, g1, b1, _ := c1.RGBA()
 			sum += delta(r0, r1)
@@ -581,6 +587,75 @@
 	}
 }
 
+type offsetImage struct {
+	image.Image
+	Rect image.Rectangle
+}
+
+func (i offsetImage) Bounds() image.Rectangle {
+	return i.Rect
+}
+
+func TestEncodeWrappedImage(t *testing.T) {
+	m0, err := readImg("../testdata/video-001.gif")
+	if err != nil {
+		t.Fatalf("readImg: %v", err)
+	}
+
+	// Case 1: Enocde a wrapped image.Image
+	buf := new(bytes.Buffer)
+	w0 := offsetImage{m0, m0.Bounds()}
+	err = Encode(buf, w0, nil)
+	if err != nil {
+		t.Fatalf("Encode: %v", err)
+	}
+	w1, err := Decode(buf)
+	if err != nil {
+		t.Fatalf("Dencode: %v", err)
+	}
+	avgDelta := averageDelta(m0, w1)
+	if avgDelta > 0 {
+		t.Fatalf("Wrapped: average delta is too high. expected: 0, got %d", avgDelta)
+	}
+
+	// Case 2: Enocde a wrapped image.Image with offset
+	b0 := image.Rectangle{
+		Min: image.Point{
+			X: 128,
+			Y: 64,
+		},
+		Max: image.Point{
+			X: 256,
+			Y: 128,
+		},
+	}
+	w0 = offsetImage{m0, b0}
+	buf = new(bytes.Buffer)
+	err = Encode(buf, w0, nil)
+	if err != nil {
+		t.Fatalf("Encode: %v", err)
+	}
+	w1, err = Decode(buf)
+	if err != nil {
+		t.Fatalf("Dencode: %v", err)
+	}
+
+	b1 := image.Rectangle{
+		Min: image.Point{
+			X: 0,
+			Y: 0,
+		},
+		Max: image.Point{
+			X: 128,
+			Y: 64,
+		},
+	}
+	avgDelta = averageDeltaBound(m0, w1, b0, b1)
+	if avgDelta > 0 {
+		t.Fatalf("Wrapped and offset: average delta is too high. expected: 0, got %d", avgDelta)
+	}
+}
+
 func BenchmarkEncode(b *testing.B) {
 	bo := image.Rect(0, 0, 640, 480)
 	rnd := rand.New(rand.NewSource(123))
diff --git a/src/image/testdata/triangle-001.gif b/src/image/testdata/triangle-001.gif
new file mode 100644
index 0000000..f3d45bb
--- /dev/null
+++ b/src/image/testdata/triangle-001.gif
Binary files differ
diff --git a/src/internal/poll/writev.go b/src/internal/poll/writev.go
index a48a38b..6050d1f 100644
--- a/src/internal/poll/writev.go
+++ b/src/internal/poll/writev.go
@@ -64,6 +64,9 @@
 		TestHookDidWritev(int(wrote))
 		n += int64(wrote)
 		consume(v, int64(wrote))
+		for i := range iovecs {
+			iovecs[i] = syscall.Iovec{}
+		}
 		if err != nil {
 			if err.(syscall.Errno) == syscall.EAGAIN {
 				if err = fd.pd.waitWrite(fd.isFile); err == nil {
diff --git a/src/internal/trace/gc_test.go b/src/internal/trace/gc_test.go
index da1cb90..4f9c770 100644
--- a/src/internal/trace/gc_test.go
+++ b/src/internal/trace/gc_test.go
@@ -79,6 +79,10 @@
 func TestMMUTrace(t *testing.T) {
 	// Can't be t.Parallel() because it modifies the
 	// testingOneBand package variable.
+	if testing.Short() {
+		// test input too big for all.bash
+		t.Skip("skipping in -short mode")
+	}
 
 	data, err := ioutil.ReadFile("testdata/stress_1_10_good")
 	if err != nil {
diff --git a/src/internal/trace/parser_test.go b/src/internal/trace/parser_test.go
index c9afa68..6d87970 100644
--- a/src/internal/trace/parser_test.go
+++ b/src/internal/trace/parser_test.go
@@ -7,6 +7,7 @@
 import (
 	"bytes"
 	"io/ioutil"
+	"os"
 	"path/filepath"
 	"strings"
 	"testing"
@@ -38,9 +39,17 @@
 		t.Fatalf("failed to read ./testdata: %v", err)
 	}
 	for _, f := range files {
-		data, err := ioutil.ReadFile(filepath.Join("./testdata", f.Name()))
+		name := filepath.Join("./testdata", f.Name())
+		info, err := os.Stat(name)
 		if err != nil {
-			t.Fatalf("failed to read input file: %v", err)
+			t.Fatal(err)
+		}
+		if testing.Short() && info.Size() > 10000 {
+			continue
+		}
+		data, err := ioutil.ReadFile(name)
+		if err != nil {
+			t.Fatal(err)
 		}
 		// Instead of Parse that requires a proper binary name for old traces,
 		// we use 'parse' that omits symbol lookup if an empty string is given.
diff --git a/src/math/big/floatmarsh_test.go b/src/math/big/floatmarsh_test.go
index 5bd906d..c056d78 100644
--- a/src/math/big/floatmarsh_test.go
+++ b/src/math/big/floatmarsh_test.go
@@ -109,6 +109,9 @@
 	for _, test := range floatVals {
 		for _, sign := range []string{"", "+", "-"} {
 			for _, prec := range []uint{0, 1, 2, 10, 53, 64, 100, 1000} {
+				if prec > 53 && testing.Short() {
+					continue
+				}
 				x := sign + test
 				var tx Float
 				_, _, err := tx.SetPrec(prec).Parse(x, 0)
diff --git a/src/math/big/natconv_test.go b/src/math/big/natconv_test.go
index 9c2acca..d390272 100644
--- a/src/math/big/natconv_test.go
+++ b/src/math/big/natconv_test.go
@@ -446,6 +446,9 @@
 	var p Word
 	for b := 2; b <= 16; b++ {
 		for p = 0; p <= 512; p++ {
+			if testing.Short() && p > 10 {
+				break
+			}
 			x := nat(nil).expWW(Word(b), p)
 			xs := x.utoa(b)
 			xs2 := itoa(x, b)
diff --git a/src/math/big/prime_test.go b/src/math/big/prime_test.go
index bf50f34..8596e33 100644
--- a/src/math/big/prime_test.go
+++ b/src/math/big/prime_test.go
@@ -125,11 +125,11 @@
 func TestProbablyPrime(t *testing.T) {
 	nreps := 20
 	if testing.Short() {
-		nreps = 3
+		nreps = 1
 	}
 	for i, s := range primes {
 		p, _ := new(Int).SetString(s, 10)
-		if !p.ProbablyPrime(nreps) || !p.ProbablyPrime(1) || !p.ProbablyPrime(0) {
+		if !p.ProbablyPrime(nreps) || nreps != 1 && !p.ProbablyPrime(1) || !p.ProbablyPrime(0) {
 			t.Errorf("#%d prime found to be non-prime (%s)", i, s)
 		}
 	}
@@ -137,7 +137,7 @@
 	for i, s := range composites {
 		s = strings.Map(cutSpace, s)
 		c, _ := new(Int).SetString(s, 10)
-		if c.ProbablyPrime(nreps) || c.ProbablyPrime(1) || c.ProbablyPrime(0) {
+		if c.ProbablyPrime(nreps) || nreps != 1 && c.ProbablyPrime(1) || c.ProbablyPrime(0) {
 			t.Errorf("#%d composite found to be prime (%s)", i, s)
 		}
 	}
@@ -197,6 +197,14 @@
 func testPseudoprimes(t *testing.T, name string, cond func(nat) bool, want []int) {
 	n := nat{1}
 	for i := 3; i < 100000; i += 2 {
+		if testing.Short() {
+			if len(want) == 0 {
+				break
+			}
+			if i < want[0]-2 {
+				i = want[0] - 2
+			}
+		}
 		n[0] = Word(i)
 		pseudo := cond(n)
 		if pseudo && (len(want) == 0 || i != want[0]) {
diff --git a/src/math/big/sqrt_test.go b/src/math/big/sqrt_test.go
index 6a412d6..d314711 100644
--- a/src/math/big/sqrt_test.go
+++ b/src/math/big/sqrt_test.go
@@ -15,6 +15,9 @@
 // behaves like float math.Sqrt.
 func TestFloatSqrt64(t *testing.T) {
 	for i := 0; i < 1e5; i++ {
+		if i == 1e2 && testing.Short() {
+			break
+		}
 		r := rand.Float64()
 
 		got := new(Float).SetPrec(53)
diff --git a/src/math/bits/bits.go b/src/math/bits/bits.go
index 24d910c..385c064 100644
--- a/src/math/bits/bits.go
+++ b/src/math/bits/bits.go
@@ -165,6 +165,8 @@
 
 // RotateLeft returns the value of x rotated left by (k mod UintSize) bits.
 // To rotate x right by k bits, call RotateLeft(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft(x uint, k int) uint {
 	if UintSize == 32 {
 		return uint(RotateLeft32(uint32(x), k))
@@ -174,6 +176,8 @@
 
 // RotateLeft8 returns the value of x rotated left by (k mod 8) bits.
 // To rotate x right by k bits, call RotateLeft8(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft8(x uint8, k int) uint8 {
 	const n = 8
 	s := uint(k) & (n - 1)
@@ -182,6 +186,8 @@
 
 // RotateLeft16 returns the value of x rotated left by (k mod 16) bits.
 // To rotate x right by k bits, call RotateLeft16(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft16(x uint16, k int) uint16 {
 	const n = 16
 	s := uint(k) & (n - 1)
@@ -190,6 +196,8 @@
 
 // RotateLeft32 returns the value of x rotated left by (k mod 32) bits.
 // To rotate x right by k bits, call RotateLeft32(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft32(x uint32, k int) uint32 {
 	const n = 32
 	s := uint(k) & (n - 1)
@@ -198,6 +206,8 @@
 
 // RotateLeft64 returns the value of x rotated left by (k mod 64) bits.
 // To rotate x right by k bits, call RotateLeft64(x, -k).
+//
+// This function's execution time does not depend on the inputs.
 func RotateLeft64(x uint64, k int) uint64 {
 	const n = 64
 	s := uint(k) & (n - 1)
@@ -245,6 +255,8 @@
 // --- ReverseBytes ---
 
 // ReverseBytes returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes(x uint) uint {
 	if UintSize == 32 {
 		return uint(ReverseBytes32(uint32(x)))
@@ -253,11 +265,15 @@
 }
 
 // ReverseBytes16 returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes16(x uint16) uint16 {
 	return x>>8 | x<<8
 }
 
 // ReverseBytes32 returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes32(x uint32) uint32 {
 	const m = 1<<32 - 1
 	x = x>>8&(m3&m) | x&(m3&m)<<8
@@ -265,6 +281,8 @@
 }
 
 // ReverseBytes64 returns the value of x with its bytes in reversed order.
+//
+// This function's execution time does not depend on the inputs.
 func ReverseBytes64(x uint64) uint64 {
 	const m = 1<<64 - 1
 	x = x>>8&(m3&m) | x&(m3&m)<<8
@@ -331,36 +349,40 @@
 // Add returns the sum with carry of x, y and carry: sum = x + y + carry.
 // The carry input must be 0 or 1; otherwise the behavior is undefined.
 // The carryOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Add(x, y, carry uint) (sum, carryOut uint) {
-	yc := y + carry
-	sum = x + yc
-	if sum < x || yc < y {
-		carryOut = 1
+	if UintSize == 32 {
+		s32, c32 := Add32(uint32(x), uint32(y), uint32(carry))
+		return uint(s32), uint(c32)
 	}
-	return
+	s64, c64 := Add64(uint64(x), uint64(y), uint64(carry))
+	return uint(s64), uint(c64)
 }
 
 // Add32 returns the sum with carry of x, y and carry: sum = x + y + carry.
 // The carry input must be 0 or 1; otherwise the behavior is undefined.
 // The carryOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Add32(x, y, carry uint32) (sum, carryOut uint32) {
-	yc := y + carry
-	sum = x + yc
-	if sum < x || yc < y {
-		carryOut = 1
-	}
+	sum64 := uint64(x) + uint64(y) + uint64(carry)
+	sum = uint32(sum64)
+	carryOut = uint32(sum64 >> 32)
 	return
 }
 
 // Add64 returns the sum with carry of x, y and carry: sum = x + y + carry.
 // The carry input must be 0 or 1; otherwise the behavior is undefined.
 // The carryOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Add64(x, y, carry uint64) (sum, carryOut uint64) {
-	yc := y + carry
-	sum = x + yc
-	if sum < x || yc < y {
-		carryOut = 1
-	}
+	sum = x + y + carry
+	// The sum will overflow if both top bits are set (x & y) or if one of them
+	// is (x | y), and a carry from the lower place happened. If such a carry
+	// happens, the top bit will be 1 + 0 + 1 = 0 (&^ sum).
+	carryOut = ((x & y) | ((x | y) &^ sum)) >> 63
 	return
 }
 
@@ -369,36 +391,41 @@
 // Sub returns the difference of x, y and borrow: diff = x - y - borrow.
 // The borrow input must be 0 or 1; otherwise the behavior is undefined.
 // The borrowOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Sub(x, y, borrow uint) (diff, borrowOut uint) {
-	yb := y + borrow
-	diff = x - yb
-	if diff > x || yb < y {
-		borrowOut = 1
+	if UintSize == 32 {
+		d32, b32 := Sub32(uint32(x), uint32(y), uint32(borrow))
+		return uint(d32), uint(b32)
 	}
-	return
+	d64, b64 := Sub64(uint64(x), uint64(y), uint64(borrow))
+	return uint(d64), uint(b64)
 }
 
 // Sub32 returns the difference of x, y and borrow, diff = x - y - borrow.
 // The borrow input must be 0 or 1; otherwise the behavior is undefined.
 // The borrowOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Sub32(x, y, borrow uint32) (diff, borrowOut uint32) {
-	yb := y + borrow
-	diff = x - yb
-	if diff > x || yb < y {
-		borrowOut = 1
-	}
+	diff = x - y - borrow
+	// The difference will underflow if the top bit of x is not set and the top
+	// bit of y is set (^x & y) or if they are the same (^(x ^ y)) and a borrow
+	// from the lower place happens. If that borrow happens, the result will be
+	// 1 - 1 - 1 = 0 - 0 - 1 = 1 (& diff).
+	borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 31
 	return
 }
 
 // Sub64 returns the difference of x, y and borrow: diff = x - y - borrow.
 // The borrow input must be 0 or 1; otherwise the behavior is undefined.
 // The borrowOut output is guaranteed to be 0 or 1.
+//
+// This function's execution time does not depend on the inputs.
 func Sub64(x, y, borrow uint64) (diff, borrowOut uint64) {
-	yb := y + borrow
-	diff = x - yb
-	if diff > x || yb < y {
-		borrowOut = 1
-	}
+	diff = x - y - borrow
+	// See Sub32 for the bit logic.
+	borrowOut = ((^x & y) | (^(x ^ y) & diff)) >> 63
 	return
 }
 
@@ -407,6 +434,8 @@
 // Mul returns the full-width product of x and y: (hi, lo) = x * y
 // with the product bits' upper half returned in hi and the lower
 // half returned in lo.
+//
+// This function's execution time does not depend on the inputs.
 func Mul(x, y uint) (hi, lo uint) {
 	if UintSize == 32 {
 		h, l := Mul32(uint32(x), uint32(y))
@@ -419,6 +448,8 @@
 // Mul32 returns the 64-bit product of x and y: (hi, lo) = x * y
 // with the product bits' upper half returned in hi and the lower
 // half returned in lo.
+//
+// This function's execution time does not depend on the inputs.
 func Mul32(x, y uint32) (hi, lo uint32) {
 	tmp := uint64(x) * uint64(y)
 	hi, lo = uint32(tmp>>32), uint32(tmp)
@@ -428,6 +459,8 @@
 // Mul64 returns the 128-bit product of x and y: (hi, lo) = x * y
 // with the product bits' upper half returned in hi and the lower
 // half returned in lo.
+//
+// This function's execution time does not depend on the inputs.
 func Mul64(x, y uint64) (hi, lo uint64) {
 	const mask32 = 1<<32 - 1
 	x0 := x & mask32
diff --git a/src/math/bits/example_test.go b/src/math/bits/example_test.go
index 18e026b..b2ed2cb 100644
--- a/src/math/bits/example_test.go
+++ b/src/math/bits/example_test.go
@@ -59,6 +59,12 @@
 	// TrailingZeros64(0000000000000000000000000000000000000000000000000000000000001110) = 1
 }
 
+func ExampleOnesCount() {
+	fmt.Printf("OnesCount(%b) = %d\n", 14, bits.OnesCount(14))
+	// Output:
+	// OnesCount(1110) = 3
+}
+
 func ExampleOnesCount8() {
 	fmt.Printf("OnesCount8(%08b) = %d\n", 14, bits.OnesCount8(14))
 	// Output:
diff --git a/src/math/rand/rand_test.go b/src/math/rand/rand_test.go
index e663b84..ee9c8f8 100644
--- a/src/math/rand/rand_test.go
+++ b/src/math/rand/rand_test.go
@@ -486,7 +486,7 @@
 	r := New(NewSource(testSeeds[0]))
 	top := 6
 	if testing.Short() {
-		top = 4
+		top = 3
 	}
 	for n := 3; n <= top; n++ {
 		t.Run(fmt.Sprintf("n=%d", n), func(t *testing.T) {
diff --git a/src/mime/mediatype.go b/src/mime/mediatype.go
index 0539077..56ceb48 100644
--- a/src/mime/mediatype.go
+++ b/src/mime/mediatype.go
@@ -19,7 +19,7 @@
 // FormatMediaType returns the empty string.
 func FormatMediaType(t string, param map[string]string) string {
 	var b strings.Builder
-	if slash := strings.Index(t, "/"); slash == -1 {
+	if slash := strings.IndexByte(t, '/'); slash == -1 {
 		if !isToken(t) {
 			return ""
 		}
@@ -48,7 +48,38 @@
 			return ""
 		}
 		b.WriteString(strings.ToLower(attribute))
+
+		needEnc := needsEncoding(value)
+		if needEnc {
+			// RFC 2231 section 4
+			b.WriteByte('*')
+		}
 		b.WriteByte('=')
+
+		if needEnc {
+			b.WriteString("utf-8''")
+
+			offset := 0
+			for index := 0; index < len(value); index++ {
+				ch := value[index]
+				// {RFC 2231 section 7}
+				// attribute-char := <any (US-ASCII) CHAR except SPACE, CTLs, "*", "'", "%", or tspecials>
+				if ch <= ' ' || ch >= 0x7F ||
+					ch == '*' || ch == '\'' || ch == '%' ||
+					isTSpecial(rune(ch)) {
+
+					b.WriteString(value[offset:index])
+					offset = index + 1
+
+					b.WriteByte('%')
+					b.WriteByte(upperhex[ch>>4])
+					b.WriteByte(upperhex[ch&0x0F])
+				}
+			}
+			b.WriteString(value[offset:])
+			continue
+		}
+
 		if isToken(value) {
 			b.WriteString(value)
 			continue
@@ -63,9 +94,6 @@
 				offset = index
 				b.WriteByte('\\')
 			}
-			if character&0x80 != 0 {
-				return ""
-			}
 		}
 		b.WriteString(value[offset:])
 		b.WriteByte('"')
diff --git a/src/mime/mediatype_test.go b/src/mime/mediatype_test.go
index 945a818..e91ff38 100644
--- a/src/mime/mediatype_test.go
+++ b/src/mime/mediatype_test.go
@@ -6,6 +6,7 @@
 
 import (
 	"reflect"
+	"strings"
 	"testing"
 )
 
@@ -481,8 +482,9 @@
 	{"noslash", map[string]string{"X": "Y"}, "noslash; x=Y"}, // e.g. Content-Disposition values (RFC 2183); issue 11289
 	{"foo bar/baz", nil, ""},
 	{"foo/bar baz", nil, ""},
-	{"attachment", map[string]string{"filename": "ĄĄŽŽČČŠŠ"}, ""},
-	{"attachment", map[string]string{"filename": "ÁÁÊÊÇÇÎÎ"}, ""},
+	{"attachment", map[string]string{"filename": "ĄĄŽŽČČŠŠ"}, "attachment; filename*=utf-8''%C4%84%C4%84%C5%BD%C5%BD%C4%8C%C4%8C%C5%A0%C5%A0"},
+	{"attachment", map[string]string{"filename": "ÁÁÊÊÇÇÎÎ"}, "attachment; filename*=utf-8''%C3%81%C3%81%C3%8A%C3%8A%C3%87%C3%87%C3%8E%C3%8E"},
+	{"attachment", map[string]string{"filename": "数据统计.png"}, "attachment; filename*=utf-8''%E6%95%B0%E6%8D%AE%E7%BB%9F%E8%AE%A1.png"},
 	{"foo/BAR", nil, "foo/bar"},
 	{"foo/BAR", map[string]string{"X": "Y"}, "foo/bar; x=Y"},
 	{"foo/BAR", map[string]string{"space": "With space"}, `foo/bar; space="With space"`},
@@ -491,7 +493,8 @@
 	{"foo/BAR", map[string]string{"both": `With \backslash and "quote`}, `foo/bar; both="With \\backslash and \"quote"`},
 	{"foo/BAR", map[string]string{"": "empty attribute"}, ""},
 	{"foo/BAR", map[string]string{"bad attribute": "baz"}, ""},
-	{"foo/BAR", map[string]string{"nonascii": "not an ascii character: ä"}, ""},
+	{"foo/BAR", map[string]string{"nonascii": "not an ascii character: ä"}, "foo/bar; nonascii*=utf-8''not%20an%20ascii%20character%3A%20%C3%A4"},
+	{"foo/BAR", map[string]string{"ctl": "newline: \n nil: \000"}, "foo/bar; ctl*=utf-8''newline%3A%20%0A%20nil%3A%20%00"},
 	{"foo/bar", map[string]string{"a": "av", "b": "bv", "c": "cv"}, "foo/bar; a=av; b=bv; c=cv"},
 	{"foo/bar", map[string]string{"0": "'", "9": "'"}, "foo/bar; 0='; 9='"},
 	{"foo", map[string]string{"bar": ""}, `foo; bar=""`},
@@ -503,5 +506,21 @@
 		if got != tt.want {
 			t.Errorf("%d. FormatMediaType(%q, %v) = %q; want %q", i, tt.typ, tt.params, got, tt.want)
 		}
+		if got == "" {
+			continue
+		}
+		typ, params, err := ParseMediaType(got)
+		if err != nil {
+			t.Errorf("%d. ParseMediaType(%q) err: %v", i, got, err)
+		}
+		if typ != strings.ToLower(tt.typ) {
+			t.Errorf("%d. ParseMediaType(%q) typ = %q; want %q", i, got, typ, tt.typ)
+		}
+		for k, v := range tt.params {
+			k = strings.ToLower(k)
+			if params[k] != v {
+				t.Errorf("%d. ParseMediaType(%q) params[%s] = %q; want %q", i, got, k, params[k], v)
+			}
+		}
 	}
 }
diff --git a/src/mime/multipart/formdata_test.go b/src/mime/multipart/formdata_test.go
index 105a82c..7d756c8 100644
--- a/src/mime/multipart/formdata_test.go
+++ b/src/mime/multipart/formdata_test.go
@@ -176,7 +176,11 @@
 // TestReadForm_NonFileMaxMemory asserts that the ReadForm maxMemory limit is applied
 // while processing non-file form data as well as file form data.
 func TestReadForm_NonFileMaxMemory(t *testing.T) {
-	largeTextValue := strings.Repeat("1", (10<<20)+25)
+	n := 10<<20 + 25
+	if testing.Short() {
+		n = 10<<10 + 25
+	}
+	largeTextValue := strings.Repeat("1", n)
 	message := `--MyBoundary
 Content-Disposition: form-data; name="largetext"
 
@@ -196,6 +200,9 @@
 	}
 	for _, tc := range testCases {
 		t.Run(tc.name, func(t *testing.T) {
+			if tc.maxMemory == 0 && testing.Short() {
+				t.Skip("skipping in -short mode")
+			}
 			b := strings.NewReader(testBody)
 			r := NewReader(b, boundary)
 			f, err := r.ReadForm(tc.maxMemory)
diff --git a/src/mime/multipart/multipart_test.go b/src/mime/multipart/multipart_test.go
index 5a8102b..5dc74b5 100644
--- a/src/mime/multipart/multipart_test.go
+++ b/src/mime/multipart/multipart_test.go
@@ -832,7 +832,10 @@
 
 func TestParseAllSizes(t *testing.T) {
 	t.Parallel()
-	const maxSize = 5 << 10
+	maxSize := 5 << 10
+	if testing.Short() {
+		maxSize = 512
+	}
 	var buf bytes.Buffer
 	body := strings.Repeat("a", maxSize)
 	bodyb := []byte(body)
diff --git a/src/mime/quotedprintable/reader_test.go b/src/mime/quotedprintable/reader_test.go
index f870bda..48a7ff6 100644
--- a/src/mime/quotedprintable/reader_test.go
+++ b/src/mime/quotedprintable/reader_test.go
@@ -116,7 +116,11 @@
 
 	var buf bytes.Buffer
 	res := make(map[string]int)
-	everySequence("", "0A \r\n=", 6, func(s string) {
+	n := 6
+	if testing.Short() {
+		n = 4
+	}
+	everySequence("", "0A \r\n=", n, func(s string) {
 		if strings.HasSuffix(s, "=") || strings.Contains(s, "==") {
 			return
 		}
@@ -200,6 +204,13 @@
 invalid bytes after =: 3949
 quotedprintable: invalid hex byte 0x0d: 2048
 unexpected EOF: 194`
+	if testing.Short() {
+		want = `OK: 896
+invalid bytes after =: 100
+quotedprintable: invalid hex byte 0x0d: 26
+unexpected EOF: 3`
+	}
+
 	if got != want {
 		t.Errorf("Got:\n%s\nWant:\n%s", got, want)
 	}
diff --git a/src/mime/type.go b/src/mime/type.go
index bf10de8..ad76313 100644
--- a/src/mime/type.go
+++ b/src/mime/type.go
@@ -69,6 +69,7 @@
 	".png":  "image/png",
 	".svg":  "image/svg+xml",
 	".wasm": "application/wasm",
+	".webp": "image/webp",
 	".xml":  "text/xml; charset=utf-8",
 }
 
diff --git a/src/net/http/httptest/recorder.go b/src/net/http/httptest/recorder.go
index f2350f0..d0bc0fa 100644
--- a/src/net/http/httptest/recorder.go
+++ b/src/net/http/httptest/recorder.go
@@ -59,7 +59,10 @@
 // an explicit DefaultRemoteAddr isn't set on ResponseRecorder.
 const DefaultRemoteAddr = "1.2.3.4"
 
-// Header returns the response headers.
+// Header implements http.ResponseWriter. It returns the response
+// headers to mutate within a handler. To test the headers that were
+// written after a handler completes, use the Result method and see
+// the returned Response value's Header.
 func (rw *ResponseRecorder) Header() http.Header {
 	m := rw.HeaderMap
 	if m == nil {
@@ -98,7 +101,8 @@
 	rw.WriteHeader(200)
 }
 
-// Write always succeeds and writes to rw.Body, if not nil.
+// Write implements http.ResponseWriter. The data in buf is written to
+// rw.Body, if not nil.
 func (rw *ResponseRecorder) Write(buf []byte) (int, error) {
 	rw.writeHeader(buf, "")
 	if rw.Body != nil {
@@ -107,7 +111,8 @@
 	return len(buf), nil
 }
 
-// WriteString always succeeds and writes to rw.Body, if not nil.
+// WriteString implements io.StringWriter. The data in str is written
+// to rw.Body, if not nil.
 func (rw *ResponseRecorder) WriteString(str string) (int, error) {
 	rw.writeHeader(nil, str)
 	if rw.Body != nil {
@@ -116,8 +121,7 @@
 	return len(str), nil
 }
 
-// WriteHeader sets rw.Code. After it is called, changing rw.Header
-// will not affect rw.HeaderMap.
+// WriteHeader implements http.ResponseWriter.
 func (rw *ResponseRecorder) WriteHeader(code int) {
 	if rw.wroteHeader {
 		return
@@ -130,7 +134,8 @@
 	rw.snapHeader = rw.HeaderMap.Clone()
 }
 
-// Flush sets rw.Flushed to true.
+// Flush implements http.Flusher. To test whether Flush was
+// called, see rw.Flushed.
 func (rw *ResponseRecorder) Flush() {
 	if !rw.wroteHeader {
 		rw.WriteHeader(200)
diff --git a/src/net/http/httputil/reverseproxy.go b/src/net/http/httputil/reverseproxy.go
index 7bb469e..1d7b0ef 100644
--- a/src/net/http/httputil/reverseproxy.go
+++ b/src/net/http/httputil/reverseproxy.go
@@ -51,8 +51,7 @@
 
 	// ErrorLog specifies an optional logger for errors
 	// that occur when attempting to proxy the request.
-	// If nil, logging goes to os.Stderr via the log package's
-	// standard logger.
+	// If nil, logging is done via the log package's standard logger.
 	ErrorLog *log.Logger
 
 	// BufferPool optionally specifies a buffer pool to
diff --git a/src/net/http/internal/testcert.go b/src/net/http/internal/testcert.go
index 4078909..2284a83 100644
--- a/src/net/http/internal/testcert.go
+++ b/src/net/http/internal/testcert.go
@@ -4,6 +4,8 @@
 
 package internal
 
+import "strings"
+
 // LocalhostCert is a PEM-encoded TLS cert with SAN IPs
 // "127.0.0.1" and "[::1]", expiring at Jan 29 16:00:00 2084 GMT.
 // generated from src/crypto/tls:
@@ -24,7 +26,7 @@
 -----END CERTIFICATE-----`)
 
 // LocalhostKey is the private key for localhostCert.
-var LocalhostKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
+var LocalhostKey = []byte(testingKey(`-----BEGIN RSA TESTING KEY-----
 MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9
 SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZB
 l2+XsDulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB
@@ -38,4 +40,6 @@
 y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIX
 qyUBnu3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo
 f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA==
------END RSA PRIVATE KEY-----`)
+-----END RSA TESTING KEY-----`))
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
index 32ddd3d..d774915 100644
--- a/src/net/http/serve_test.go
+++ b/src/net/http/serve_test.go
@@ -5758,8 +5758,12 @@
 	setParallel(t)
 	defer afterTest(t)
 
-	const goroutines = 5
-	const requests = 2000
+	goroutines := 5
+	requests := 2000
+	if testing.Short() {
+		goroutines = 3
+		requests = 100
+	}
 
 	hts := httptest.NewServer(HandlerFunc(NotFound))
 	defer hts.Close()
diff --git a/src/net/smtp/smtp_test.go b/src/net/smtp/smtp_test.go
index e366ef8..8195f91 100644
--- a/src/net/smtp/smtp_test.go
+++ b/src/net/smtp/smtp_test.go
@@ -900,8 +900,8 @@
 -----END CERTIFICATE-----`)
 
 // localhostKey is the private key for localhostCert.
-var localhostKey = []byte(`
------BEGIN RSA PRIVATE KEY-----
+var localhostKey = []byte(testingKey(`
+-----BEGIN RSA TESTING KEY-----
 MIICXgIBAAKBgQDScVtBC45ayNsa16NylbPXnc6XOJkzhtWMn2Niu43DmfZHLq5h
 AB9+Gpok4icKaZxV7ayImCWzIf1pGHq8qKhsFshRddRTUAF3np5sDOW3QuhsuXHu
 lkQzLfQuoiL0TrOYvdi90bOliWQVGdGurAS1ZhsYF/fOc7bnRLnoIJYfZQIDAQAB
@@ -915,4 +915,6 @@
 QXLEiJoClkR2orAmqjPLVhR3t2oB3INcnEjLNSq8LHyQEfXyaFfu4U9l5+fRPL2i
 jiC0k/9L5dHUsF0XZothAkEA23ddgRs+Id/HxtojqqUT27B8MT/IGNrYsp4DvS/c
 qgkeluku4GjxRlDMBuXk94xOBEinUs+p/hwP1Alll80Tpg==
------END RSA PRIVATE KEY-----`)
+-----END RSA TESTING KEY-----`))
+
+func testingKey(s string) string { return strings.ReplaceAll(s, "TESTING KEY", "PRIVATE KEY") }
diff --git a/src/net/url/url.go b/src/net/url/url.go
index 9ff707b..7f6ff93 100644
--- a/src/net/url/url.go
+++ b/src/net/url/url.go
@@ -337,10 +337,11 @@
 // Note that the Path field is stored in decoded form: /%47%6f%2f becomes /Go/.
 // A consequence is that it is impossible to tell which slashes in the Path were
 // slashes in the raw URL and which were %2f. This distinction is rarely important,
-// but when it is, code must not use Path directly.
-// The Parse function sets both Path and RawPath in the URL it returns,
-// and URL's String method uses RawPath if it is a valid encoding of Path,
-// by calling the EscapedPath method.
+// but when it is, the code should use RawPath, an optional field which only gets
+// set if the default encoding is different from Path.
+//
+// URL's String method uses the EscapedPath method to obtain the path. See the
+// EscapedPath method for more details.
 type URL struct {
 	Scheme     string
 	Opaque     string    // encoded opaque data
diff --git a/src/os/exec/exec_test.go b/src/os/exec/exec_test.go
index f9d7306..c9322f6 100644
--- a/src/os/exec/exec_test.go
+++ b/src/os/exec/exec_test.go
@@ -691,6 +691,9 @@
 	}
 
 	for i := 0; i < 10; i++ {
+		if testing.Short() && i >= 3 {
+			break
+		}
 		la := listen()
 		ca := helperCommand(t, "describefiles")
 		ca.ExtraFiles = []*os.File{listenerFile(la)}
diff --git a/src/regexp/syntax/parse_test.go b/src/regexp/syntax/parse_test.go
index fe3d251..5581ba1 100644
--- a/src/regexp/syntax/parse_test.go
+++ b/src/regexp/syntax/parse_test.go
@@ -185,6 +185,7 @@
 	{`(?-s).`, `dnl{}`},
 	{`(?:(?:^).)`, `cat{bol{}dot{}}`},
 	{`(?-s)(?:(?:^).)`, `cat{bol{}dnl{}}`},
+	{`[\s\S]a`, `cat{cc{0x0-0x10ffff}lit{a}}`},
 
 	// RE2 prefix_tests
 	{`abc|abd`, `cat{str{ab}cc{0x63-0x64}}`},
diff --git a/src/regexp/syntax/regexp.go b/src/regexp/syntax/regexp.go
index ae5fa05..3a4d2d2 100644
--- a/src/regexp/syntax/regexp.go
+++ b/src/regexp/syntax/regexp.go
@@ -139,7 +139,7 @@
 		b.WriteRune('[')
 		if len(re.Rune) == 0 {
 			b.WriteString(`^\x00-\x{10FFFF}`)
-		} else if re.Rune[0] == 0 && re.Rune[len(re.Rune)-1] == unicode.MaxRune {
+		} else if re.Rune[0] == 0 && re.Rune[len(re.Rune)-1] == unicode.MaxRune && len(re.Rune) > 2 {
 			// Contains 0 and MaxRune. Probably a negated class.
 			// Print the gaps.
 			b.WriteRune('^')
diff --git a/src/runtime/internal/atomic/atomic_test.go b/src/runtime/internal/atomic/atomic_test.go
index 25ece43..0ba7544 100644
--- a/src/runtime/internal/atomic/atomic_test.go
+++ b/src/runtime/internal/atomic/atomic_test.go
@@ -29,14 +29,18 @@
 }
 
 func TestXadduintptr(t *testing.T) {
-	const N = 20
-	const iter = 100000
+	N := 20
+	iter := 100000
+	if testing.Short() {
+		N = 10
+		iter = 10000
+	}
 	inc := uintptr(100)
 	total := uintptr(0)
 	runParallel(N, iter, func() {
 		atomic.Xadduintptr(&total, inc)
 	})
-	if want := uintptr(N * iter * inc); want != total {
+	if want := uintptr(N*iter) * inc; want != total {
 		t.Fatalf("xadduintpr error, want %d, got %d", want, total)
 	}
 	total = 0
diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go
index 59dee26..5349637 100644
--- a/src/runtime/pprof/pprof_test.go
+++ b/src/runtime/pprof/pprof_test.go
@@ -159,12 +159,27 @@
 		t.Skip("skipping on plan9")
 	}
 
-	const maxDuration = 5 * time.Second
+	broken := false
+	switch runtime.GOOS {
+	case "darwin", "dragonfly", "netbsd", "illumos", "solaris":
+		broken = true
+	case "openbsd":
+		if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
+			broken = true
+		}
+	}
+
+	maxDuration := 5 * time.Second
+	if testing.Short() && broken {
+		// If it's expected to be broken, no point waiting around.
+		maxDuration /= 10
+	}
+
 	// If we're running a long test, start with a long duration
 	// for tests that try to make sure something *doesn't* happen.
 	duration := 5 * time.Second
 	if testing.Short() {
-		duration = 200 * time.Millisecond
+		duration = 100 * time.Millisecond
 	}
 
 	// Profiling tests are inherently flaky, especially on a
@@ -190,14 +205,10 @@
 		}
 	}
 
-	switch runtime.GOOS {
-	case "darwin", "dragonfly", "netbsd", "illumos", "solaris":
-		t.Skipf("ignoring failure on %s; see golang.org/issue/13841", runtime.GOOS)
-	case "openbsd":
-		if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" {
-			t.Skipf("ignoring failure on %s/%s; see golang.org/issue/13841", runtime.GOOS, runtime.GOARCH)
-		}
+	if broken {
+		t.Skipf("ignoring failure on %s/%s; see golang.org/issue/13841", runtime.GOOS, runtime.GOARCH)
 	}
+
 	// Ignore the failure if the tests are running in a QEMU-based emulator,
 	// QEMU is not perfect at emulating everything.
 	// IN_QEMU environmental variable is set by some of the Go builders.
diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go
index 4452d51..bcb4d33 100644
--- a/src/runtime/pprof/proto_test.go
+++ b/src/runtime/pprof/proto_test.go
@@ -207,11 +207,11 @@
 7ffc34343000 7ffc34345000 00000000 [vdso]
 ffffffffff600000 ffffffffff601000 00000090 [vsyscall]
 
-00400000-07000000 r-xp 00000000 00:00 0 
+00400000-07000000 r-xp 00000000 00:00 0
 07000000-07093000 r-xp 06c00000 00:2e 536754                             /path/to/gobench_server_main
 07093000-0722d000 rw-p 06c92000 00:2e 536754                             /path/to/gobench_server_main
-0722d000-07b21000 rw-p 00000000 00:00 0 
-c000000000-c000036000 rw-p 00000000 00:00 0 
+0722d000-07b21000 rw-p 00000000 00:00 0
+c000000000-c000036000 rw-p 00000000 00:00 0
 ->
 07000000 07093000 06c00000 /path/to/gobench_server_main
 `
@@ -301,7 +301,7 @@
 	})
 }
 
-// TestMapping checkes the mapping section of CPU profiles
+// TestMapping checks the mapping section of CPU profiles
 // has the HasFunctions field set correctly. If all PCs included
 // in the samples are successfully symbolized, the corresponding
 // mapping entry (in this test case, only one entry) should have
diff --git a/src/runtime/pprof/testdata/mappingtest/main.go b/src/runtime/pprof/testdata/mappingtest/main.go
index 7850faa..476b9e8 100644
--- a/src/runtime/pprof/testdata/mappingtest/main.go
+++ b/src/runtime/pprof/testdata/mappingtest/main.go
@@ -69,7 +69,7 @@
 	if err := pprof.StartCPUProfile(os.Stdout); err != nil {
 		log.Fatal("can't start CPU profile: ", err)
 	}
-	time.Sleep(1 * time.Second)
+	time.Sleep(200 * time.Millisecond)
 	pprof.StopCPUProfile()
 
 	if err := os.Stdout.Close(); err != nil {
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index bf7835e..e9eca23 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -5211,15 +5211,6 @@
 		throw("recursive call during initialization - linker skew")
 	default: // not initialized yet
 		t.state = 1 // initialization in progress
-		if raceenabled {
-			// Randomize initialization order of packages t depends on.
-			// TODO: enable always instead of just for race?
-			s := *(*[]uintptr)(unsafe.Pointer(&slice{array: add(unsafe.Pointer(t), 3*sys.PtrSize), len: int(t.ndeps), cap: int(t.ndeps)}))
-			for i := len(s) - 1; i > 0; i-- {
-				j := int(fastrandn(uint32(i + 1)))
-				s[i], s[j] = s[j], s[i]
-			}
-		}
 		for i := uintptr(0); i < t.ndeps; i++ {
 			p := add(unsafe.Pointer(t), (3+i)*sys.PtrSize)
 			t2 := *(**initTask)(p)
diff --git a/src/runtime/semasleep_test.go b/src/runtime/semasleep_test.go
index b931095..f5b4a50 100644
--- a/src/runtime/semasleep_test.go
+++ b/src/runtime/semasleep_test.go
@@ -7,11 +7,7 @@
 package runtime_test
 
 import (
-	"internal/testenv"
-	"io/ioutil"
-	"os"
 	"os/exec"
-	"path/filepath"
 	"syscall"
 	"testing"
 	"time"
@@ -24,39 +20,14 @@
 	if *flagQuick {
 		t.Skip("-quick")
 	}
-	testenv.MustHaveGoBuild(t)
-	tempDir, err := ioutil.TempDir("", "issue-27250")
+
+	exe, err := buildTestProg(t, "testprog")
 	if err != nil {
-		t.Fatalf("Failed to create the temp directory: %v", err)
-	}
-	defer os.RemoveAll(tempDir)
-
-	repro := `
-    package main
-
-    import "time"
-
-    func main() {
-        <-time.After(1 * time.Second)
-    }
-    `
-	mainPath := filepath.Join(tempDir, "main.go")
-	if err := ioutil.WriteFile(mainPath, []byte(repro), 0644); err != nil {
-		t.Fatalf("Failed to create temp file for repro.go: %v", err)
-	}
-	binaryPath := filepath.Join(tempDir, "binary")
-
-	// Build the binary so that we can send the signal to its PID.
-	out, err := exec.Command(testenv.GoToolPath(t), "build", "-o", binaryPath, mainPath).CombinedOutput()
-	if err != nil {
-		t.Fatalf("Failed to compile the binary: err: %v\nOutput: %s\n", err, out)
-	}
-	if err := os.Chmod(binaryPath, 0755); err != nil {
-		t.Fatalf("Failed to chmod binary: %v", err)
+		t.Fatal(err)
 	}
 
-	// Now run the binary.
-	cmd := exec.Command(binaryPath)
+	start := time.Now()
+	cmd := exec.Command(exe, "After1")
 	if err := cmd.Start(); err != nil {
 		t.Fatalf("Failed to start command: %v", err)
 	}
@@ -85,6 +56,9 @@
 			if err != nil {
 				t.Fatalf("The program returned but unfortunately with an error: %v", err)
 			}
+			if time.Since(start) < 100*time.Millisecond {
+				t.Fatalf("The program stopped too quickly.")
+			}
 			return
 		}
 	}
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go
index c0e8dc2..c2f32e0 100644
--- a/src/runtime/symtab.go
+++ b/src/runtime/symtab.go
@@ -52,6 +52,11 @@
 	// if not known. If Func is not nil then Entry ==
 	// Func.Entry().
 	Entry uintptr
+
+	// The runtime's internal view of the function. This field
+	// is set (funcInfo.valid() returns true) only for Go functions,
+	// not for C functions.
+	funcInfo funcInfo
 }
 
 // CallersFrames takes a slice of PC values returned by Callers and
@@ -95,7 +100,6 @@
 			pc--
 		}
 		name := funcname(funcInfo)
-		file, line := funcline1(funcInfo, pc, false)
 		if inldata := funcdata(funcInfo, _FUNCDATA_InlTree); inldata != nil {
 			inltree := (*[1 << 20]inlinedCall)(inldata)
 			ix := pcdatavalue(funcInfo, _PCDATA_InlTreeIndex, pc, nil)
@@ -111,9 +115,9 @@
 			PC:       pc,
 			Func:     f,
 			Function: name,
-			File:     file,
-			Line:     int(line),
 			Entry:    entry,
+			funcInfo: funcInfo,
+			// Note: File,Line set below
 		})
 	}
 
@@ -121,6 +125,7 @@
 	// Avoid allocation in the common case, which is 1 or 2 frames.
 	switch len(ci.frames) {
 	case 0: // In the rare case when there are no frames at all, we return Frame{}.
+		return
 	case 1:
 		frame = ci.frames[0]
 		ci.frames = ci.frameStore[:0]
@@ -133,6 +138,13 @@
 		ci.frames = ci.frames[1:]
 	}
 	more = len(ci.frames) > 0
+	if frame.funcInfo.valid() {
+		// Compute file/line just before we need to return it,
+		// as it can be expensive. This avoids computing file/line
+		// for the Frame we find but don't return. See issue 32093.
+		file, line := funcline1(frame.funcInfo, frame.PC, false)
+		frame.File, frame.Line = file, int(line)
+	}
 	return
 }
 
@@ -157,6 +169,8 @@
 			File:     gostring(arg.file),
 			Line:     int(arg.lineno),
 			Entry:    arg.entry,
+			// funcInfo is zero, which implies !funcInfo.valid().
+			// That ensures that we use the File/Line info given here.
 		})
 		if arg.more == 0 {
 			break
diff --git a/src/runtime/testdata/testprog/deadlock.go b/src/runtime/testdata/testprog/deadlock.go
index ca2be57..5f0d120 100644
--- a/src/runtime/testdata/testprog/deadlock.go
+++ b/src/runtime/testdata/testprog/deadlock.go
@@ -112,12 +112,16 @@
 }
 
 func GoexitExit() {
+	println("t1")
 	go func() {
 		time.Sleep(time.Millisecond)
 	}()
 	i := 0
+	println("t2")
 	runtime.SetFinalizer(&i, func(p *int) {})
+	println("t3")
 	runtime.GC()
+	println("t4")
 	runtime.Goexit()
 }
 
diff --git a/src/runtime/testdata/testprog/gc.go b/src/runtime/testdata/testprog/gc.go
index ea6604f..cca9c45 100644
--- a/src/runtime/testdata/testprog/gc.go
+++ b/src/runtime/testdata/testprog/gc.go
@@ -127,59 +127,58 @@
 	fmt.Println("OK")
 }
 
-var maybeSaved []byte
-
 func GCPhys() {
-	// In this test, we construct a very specific scenario. We first
-	// allocate N objects and drop half of their pointers on the floor,
-	// effectively creating N/2 'holes' in our allocated arenas. We then
-	// try to allocate objects twice as big. At the end, we measure the
-	// physical memory overhead of large objects.
+	// This test ensures that heap-growth scavenging is working as intended.
 	//
-	// The purpose of this test is to ensure that the GC scavenges free
-	// spans eagerly to ensure high physical memory utilization even
-	// during fragmentation.
+	// It sets up a specific scenario: it allocates two pairs of objects whose
+	// sizes sum to size. One object in each pair is "small" (though must be
+	// large enough to be considered a large object by the runtime) and one is
+	// large. The small objects are kept while the large objects are freed,
+	// creating two large unscavenged holes in the heap. The heap goal should
+	// also be small as a result (so size must be at least as large as the
+	// minimum heap size). We then allocate one large object, bigger than both
+	// pairs of objects combined. This allocation, because it will tip
+	// HeapSys-HeapReleased well above the heap goal, should trigger heap-growth
+	// scavenging and scavenge most, if not all, of the large holes we created
+	// earlier.
 	const (
-		// Unfortunately, measuring actual used physical pages is
-		// difficult because HeapReleased doesn't include the parts
-		// of an arena that haven't yet been touched. So, we just
-		// make objects and size sufficiently large such that even
-		// 64 MB overhead is relatively small in the final
-		// calculation.
-		//
-		// Currently, we target 480MiB worth of memory for our test,
-		// computed as size * objects + (size*2) * (objects/2)
-		// = 2 * size * objects
-		//
 		// Size must be also large enough to be considered a large
 		// object (not in any size-segregated span).
-		size    = 1 << 20
-		objects = 240
+		size    = 4 << 20
+		split   = 64 << 10
+		objects = 2
 	)
+	// Set GOGC so that this test operates under consistent assumptions.
+	debug.SetGCPercent(100)
 	// Save objects which we want to survive, and condemn objects which we don't.
 	// Note that we condemn objects in this way and release them all at once in
 	// order to avoid having the GC start freeing up these objects while the loop
 	// is still running and filling in the holes we intend to make.
-	saved := make([][]byte, 0, objects)
-	condemned := make([][]byte, 0, objects/2+1)
-	for i := 0; i < objects; i++ {
-		// Write into a global, to prevent this from being optimized away by
-		// the compiler in the future.
-		maybeSaved = make([]byte, size)
+	saved := make([][]byte, 0, objects+1)
+	condemned := make([][]byte, 0, objects)
+	for i := 0; i < 2*objects; i++ {
 		if i%2 == 0 {
-			saved = append(saved, maybeSaved)
+			saved = append(saved, make([]byte, split))
 		} else {
-			condemned = append(condemned, maybeSaved)
+			condemned = append(condemned, make([]byte, size-split))
 		}
 	}
 	condemned = nil
 	// Clean up the heap. This will free up every other object created above
 	// (i.e. everything in condemned) creating holes in the heap.
+	// Also, if the condemned objects are still being swept, its possible that
+	// the scavenging that happens as a result of the next allocation won't see
+	// the holes at all. We call runtime.GC() twice here so that when we allocate
+	// our large object there's no race with sweeping.
 	runtime.GC()
-	// Allocate many new objects of 2x size.
-	for i := 0; i < objects/2; i++ {
-		saved = append(saved, make([]byte, size*2))
-	}
+	runtime.GC()
+	// Perform one big allocation which should also scavenge any holes.
+	//
+	// The heap goal will rise after this object is allocated, so it's very
+	// important that we try to do all the scavenging in a single allocation
+	// that exceeds the heap goal. Otherwise the rising heap goal could foil our
+	// test.
+	saved = append(saved, make([]byte, objects*size))
 	// Clean up the heap again just to put it in a known state.
 	runtime.GC()
 	// heapBacked is an estimate of the amount of physical memory used by
@@ -191,21 +190,29 @@
 	var stats runtime.MemStats
 	runtime.ReadMemStats(&stats)
 	heapBacked := stats.HeapSys - stats.HeapReleased
-	// If heapBacked exceeds the amount of memory actually used for heap
-	// allocated objects by 10% (post-GC HeapAlloc should be quite close to
-	// the size of the working set), then fail.
+	// If heapBacked does not exceed the heap goal by more than retainExtraPercent
+	// then the scavenger is working as expected; the newly-created holes have been
+	// scavenged immediately as part of the allocations which cannot fit in the holes.
 	//
-	// In the context of this test, that indicates a large amount of
-	// fragmentation with physical pages that are otherwise unused but not
-	// returned to the OS.
+	// Since the runtime should scavenge the entirety of the remaining holes,
+	// theoretically there should be no more free and unscavenged memory. However due
+	// to other allocations that happen during this test we may still see some physical
+	// memory over-use. 10% here is an arbitrary but very conservative threshold which
+	// should easily account for any other allocations this test may have done.
 	overuse := (float64(heapBacked) - float64(stats.HeapAlloc)) / float64(stats.HeapAlloc)
-	if overuse > 0.1 {
-		fmt.Printf("exceeded physical memory overuse threshold of 10%%: %3.2f%%\n"+
-			"(alloc: %d, sys: %d, rel: %d, objs: %d)\n", overuse*100, stats.HeapAlloc,
-			stats.HeapSys, stats.HeapReleased, len(saved))
+	if overuse <= 0.10 {
+		fmt.Println("OK")
 		return
 	}
-	fmt.Println("OK")
+	// Physical memory utilization exceeds the threshold, so heap-growth scavenging
+	// did not operate as expected.
+	//
+	// In the context of this test, this indicates a large amount of
+	// fragmentation with physical pages that are otherwise unused but not
+	// returned to the OS.
+	fmt.Printf("exceeded physical memory overuse threshold of 10%%: %3.2f%%\n"+
+		"(alloc: %d, goal: %d, sys: %d, rel: %d, objs: %d)\n", overuse*100,
+		stats.HeapAlloc, stats.NextGC, stats.HeapSys, stats.HeapReleased, len(saved))
 	runtime.KeepAlive(saved)
 }
 
diff --git a/src/runtime/testdata/testprog/sleep.go b/src/runtime/testdata/testprog/sleep.go
new file mode 100644
index 0000000..86e2f6c
--- /dev/null
+++ b/src/runtime/testdata/testprog/sleep.go
@@ -0,0 +1,17 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "time"
+
+// for golang.org/issue/27250
+
+func init() {
+	register("After1", After1)
+}
+
+func After1() {
+	<-time.After(1 * time.Second)
+}
diff --git a/src/runtime/trace/trace_test.go b/src/runtime/trace/trace_test.go
index e289fa5..235845d 100644
--- a/src/runtime/trace/trace_test.go
+++ b/src/runtime/trace/trace_test.go
@@ -186,6 +186,10 @@
 	if IsEnabled() {
 		t.Skip("skipping because -test.trace is set")
 	}
+	if testing.Short() {
+		t.Skip("skipping in -short mode")
+	}
+
 	var wg sync.WaitGroup
 	done := make(chan bool)
 
diff --git a/src/strconv/ftoa.go b/src/strconv/ftoa.go
index 432521b..8ce6ef3 100644
--- a/src/strconv/ftoa.go
+++ b/src/strconv/ftoa.go
@@ -289,39 +289,80 @@
 	// would round to the original mantissa and not the neighbors.
 	inclusive := mant%2 == 0
 
+	// As we walk the digits we want to know whether rounding up would fall
+	// within the upper bound. This is tracked by upperdelta:
+	//
+	// If upperdelta == 0, the digits of d and upper are the same so far.
+	//
+	// If upperdelta == 1, we saw a difference of 1 between d and upper on a
+	// previous digit and subsequently only 9s for d and 0s for upper.
+	// (Thus rounding up may fall outside the bound, if it is exclusive.)
+	//
+	// If upperdelta == 2, then the difference is greater than 1
+	// and we know that rounding up falls within the bound.
+	var upperdelta uint8
+
 	// Now we can figure out the minimum number of digits required.
 	// Walk along until d has distinguished itself from upper and lower.
-	for i := 0; i < d.nd; i++ {
-		l := byte('0') // lower digit
-		if i < lower.nd {
-			l = lower.d[i]
+	for ui := 0; ; ui++ {
+		// lower, d, and upper may have the decimal points at different
+		// places. In this case upper is the longest, so we iterate from
+		// ui==0 and start li and mi at (possibly) -1.
+		mi := ui - upper.dp + d.dp
+		if mi >= d.nd {
+			break
 		}
-		m := d.d[i]    // middle digit
+		li := ui - upper.dp + lower.dp
+		l := byte('0') // lower digit
+		if li >= 0 && li < lower.nd {
+			l = lower.d[li]
+		}
+		m := byte('0') // middle digit
+		if mi >= 0 {
+			m = d.d[mi]
+		}
 		u := byte('0') // upper digit
-		if i < upper.nd {
-			u = upper.d[i]
+		if ui < upper.nd {
+			u = upper.d[ui]
 		}
 
 		// Okay to round down (truncate) if lower has a different digit
 		// or if lower is inclusive and is exactly the result of rounding
 		// down (i.e., and we have reached the final digit of lower).
-		okdown := l != m || inclusive && i+1 == lower.nd
+		okdown := l != m || inclusive && li+1 == lower.nd
 
+		switch {
+		case upperdelta == 0 && m+1 < u:
+			// Example:
+			// m = 12345xxx
+			// u = 12347xxx
+			upperdelta = 2
+		case upperdelta == 0 && m != u:
+			// Example:
+			// m = 12345xxx
+			// u = 12346xxx
+			upperdelta = 1
+		case upperdelta == 1 && (m != '9' || u != '0'):
+			// Example:
+			// m = 1234598x
+			// u = 1234600x
+			upperdelta = 2
+		}
 		// Okay to round up if upper has a different digit and either upper
 		// is inclusive or upper is bigger than the result of rounding up.
-		okup := m != u && (inclusive || m+1 < u || i+1 < upper.nd)
+		okup := upperdelta > 0 && (inclusive || upperdelta > 1 || ui+1 < upper.nd)
 
 		// If it's okay to do either, then round to the nearest one.
 		// If it's okay to do only one, do it.
 		switch {
 		case okdown && okup:
-			d.Round(i + 1)
+			d.Round(mi + 1)
 			return
 		case okdown:
-			d.RoundDown(i + 1)
+			d.RoundDown(mi + 1)
 			return
 		case okup:
-			d.RoundUp(i + 1)
+			d.RoundUp(mi + 1)
 			return
 		}
 	}
diff --git a/src/strconv/ftoa_test.go b/src/strconv/ftoa_test.go
index 055fef9..755c986 100644
--- a/src/strconv/ftoa_test.go
+++ b/src/strconv/ftoa_test.go
@@ -137,6 +137,10 @@
 	{383260575764816448, 'f', 0, "383260575764816448"},
 	{383260575764816448, 'g', -1, "3.8326057576481645e+17"},
 
+	// Issue 29491.
+	{498484681984085570, 'f', -1, "498484681984085570"},
+	{-5.8339553793802237e+23, 'g', -1, "-5.8339553793802237e+23"},
+
 	// rounding
 	{2.275555555555555, 'x', -1, "0x1.23456789abcdep+01"},
 	{2.275555555555555, 'x', 0, "0x1p+01"},
diff --git a/src/sync/pool_test.go b/src/sync/pool_test.go
index 796a5a0..ff1174c 100644
--- a/src/sync/pool_test.go
+++ b/src/sync/pool_test.go
@@ -105,6 +105,9 @@
 	const N = 100
 loop:
 	for try := 0; try < 3; try++ {
+		if try == 1 && testing.Short() {
+			break
+		}
 		var fin, fin1 uint32
 		for i := 0; i < N; i++ {
 			v := new(string)
diff --git a/src/syscall/getdirentries_test.go b/src/syscall/getdirentries_test.go
index b20ae1d..8505a0b 100644
--- a/src/syscall/getdirentries_test.go
+++ b/src/syscall/getdirentries_test.go
@@ -26,6 +26,9 @@
 	}
 }
 func testGetdirentries(t *testing.T, count int) {
+	if count > 100 && testing.Short() && os.Getenv("GO_BUILDER_NAME") == "" {
+		t.Skip("skipping in -short mode")
+	}
 	d, err := ioutil.TempDir("", "getdirentries-test")
 	if err != nil {
 		t.Fatalf("Tempdir: %v", err)
diff --git a/src/testing/quick/quick_test.go b/src/testing/quick/quick_test.go
index 4246cd1..9df6dd4 100644
--- a/src/testing/quick/quick_test.go
+++ b/src/testing/quick/quick_test.go
@@ -319,7 +319,7 @@
 		}
 		return true
 	}
-	cfg := &Config{MaxCount: 100000}
+	cfg := &Config{MaxCount: 10000}
 	Check(f, cfg)
 	if uint64(lo)>>62 == 0 || uint64(hi)>>62 == 0 {
 		t.Errorf("int64 returned range %#016x,%#016x; does not look like full range", lo, hi)
diff --git a/src/testing/testing.go b/src/testing/testing.go
index 753de9f..339df13 100644
--- a/src/testing/testing.go
+++ b/src/testing/testing.go
@@ -771,7 +771,7 @@
 // for the caller after skip frames (where 0 means the current function).
 func callerName(skip int) string {
 	// Make room for the skip PC.
-	var pc [2]uintptr
+	var pc [1]uintptr
 	n := runtime.Callers(skip+2, pc[:]) // skip + runtime.Callers + callerName
 	if n == 0 {
 		panic("testing: zero callers found")
diff --git a/src/text/template/doc.go b/src/text/template/doc.go
index 0179dec..dbffaa4 100644
--- a/src/text/template/doc.go
+++ b/src/text/template/doc.go
@@ -328,6 +328,11 @@
 		Returns the result of indexing its first argument by the
 		following arguments. Thus "index x 1 2 3" is, in Go syntax,
 		x[1][2][3]. Each indexed item must be a map, slice, or array.
+	slice
+		slice returns the result of slicing its first argument by the
+		remaining arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2],
+		while "slice x" is x[:], "slice x 1" is x[1:], and "slice x 1 2 3"
+		is x[1:2:3]. The first argument must be a string, slice, or array.
 	js
 		Returns the escaped JavaScript equivalent of the textual
 		representation of its arguments.
diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go
index c45df89..81f9e04 100644
--- a/src/text/template/exec_test.go
+++ b/src/text/template/exec_test.go
@@ -23,7 +23,7 @@
 	True        bool
 	I           int
 	U16         uint16
-	X           string
+	X, S        string
 	FloatZero   float64
 	ComplexZero complex128
 	// Nested structs.
@@ -36,8 +36,11 @@
 	W1, W2 *W
 	// Slices
 	SI      []int
+	SICap   []int
 	SIEmpty []int
 	SB      []bool
+	// Arrays
+	AI [3]int
 	// Maps
 	MSI      map[string]int
 	MSIone   map[string]int // one element, for deterministic output
@@ -122,12 +125,15 @@
 	I:      17,
 	U16:    16,
 	X:      "x",
+	S:      "xyz",
 	U:      &U{"v"},
 	V0:     V{6666},
 	V1:     &V{7777}, // leave V2 as nil
 	W0:     W{888},
 	W1:     &W{999}, // leave W2 as nil
 	SI:     []int{3, 4, 5},
+	SICap:  make([]int, 5, 10),
+	AI:     [3]int{3, 4, 5},
 	SB:     []bool{true, false},
 	MSI:    map[string]int{"one": 1, "two": 2, "three": 3},
 	MSIone: map[string]int{"one": 1},
@@ -491,6 +497,31 @@
 	{"map MI8S", "{{index .MI8S 3}}", "i83", tVal, true},
 	{"map MUI8S", "{{index .MUI8S 2}}", "u82", tVal, true},
 
+	// Slicing.
+	{"slice[:]", "{{slice .SI}}", "[3 4 5]", tVal, true},
+	{"slice[1:]", "{{slice .SI 1}}", "[4 5]", tVal, true},
+	{"slice[1:2]", "{{slice .SI 1 2}}", "[4]", tVal, true},
+	{"slice[-1:]", "{{slice .SI -1}}", "", tVal, false},
+	{"slice[1:-2]", "{{slice .SI 1 -2}}", "", tVal, false},
+	{"slice[1:2:-1]", "{{slice .SI 1 2 -1}}", "", tVal, false},
+	{"slice[2:1]", "{{slice .SI 2 1}}", "", tVal, false},
+	{"slice[2:2:1]", "{{slice .SI 2 2 1}}", "", tVal, false},
+	{"out of range", "{{slice .SI 4 5}}", "", tVal, false},
+	{"out of range", "{{slice .SI 2 2 5}}", "", tVal, false},
+	{"len(s) < indexes < cap(s)", "{{slice .SICap 6 10}}", "[0 0 0 0]", tVal, true},
+	{"len(s) < indexes < cap(s)", "{{slice .SICap 6 10 10}}", "[0 0 0 0]", tVal, true},
+	{"indexes > cap(s)", "{{slice .SICap 10 11}}", "", tVal, false},
+	{"indexes > cap(s)", "{{slice .SICap 6 10 11}}", "", tVal, false},
+	{"array[:]", "{{slice .AI}}", "[3 4 5]", tVal, true},
+	{"array[1:]", "{{slice .AI 1}}", "[4 5]", tVal, true},
+	{"array[1:2]", "{{slice .AI 1 2}}", "[4]", tVal, true},
+	{"string[:]", "{{slice .S}}", "xyz", tVal, true},
+	{"string[0:1]", "{{slice .S 0 1}}", "x", tVal, true},
+	{"string[1:]", "{{slice .S 1}}", "yz", tVal, true},
+	{"string[1:2]", "{{slice .S 1 2}}", "y", tVal, true},
+	{"out of range", "{{slice .S 1 5}}", "", tVal, false},
+	{"3-index slice of string", "{{slice .S 1 2 2}}", "", tVal, false},
+
 	// Len.
 	{"slice", "{{len .SI}}", "3", tVal, true},
 	{"map", "{{len .MSI }}", "3", tVal, true},
@@ -1417,6 +1448,9 @@
 }
 
 func TestMaxExecDepth(t *testing.T) {
+	if testing.Short() {
+		t.Skip("skipping in -short mode")
+	}
 	tmpl := Must(New("tmpl").Parse(`{{template "tmpl" .}}`))
 	err := tmpl.Execute(ioutil.Discard, nil)
 	got := "<nil>"
diff --git a/src/text/template/funcs.go b/src/text/template/funcs.go
index a626247..248dbcf 100644
--- a/src/text/template/funcs.go
+++ b/src/text/template/funcs.go
@@ -34,6 +34,7 @@
 	"call":     call,
 	"html":     HTMLEscaper,
 	"index":    index,
+	"slice":    slice,
 	"js":       JSEscaper,
 	"len":      length,
 	"not":      not,
@@ -159,17 +160,36 @@
 	return false
 }
 
+// indexArg checks if a reflect.Value can be used as an index, and converts it to int if possible.
+func indexArg(index reflect.Value, cap int) (int, error) {
+	var x int64
+	switch index.Kind() {
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		x = index.Int()
+	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+		x = int64(index.Uint())
+	case reflect.Invalid:
+		return 0, fmt.Errorf("cannot index slice/array with nil")
+	default:
+		return 0, fmt.Errorf("cannot index slice/array with type %s", index.Type())
+	}
+	if x < 0 || int(x) < 0 || int(x) > cap {
+		return 0, fmt.Errorf("index out of range: %d", x)
+	}
+	return int(x), nil
+}
+
 // Indexing.
 
 // index returns the result of indexing its first argument by the following
 // arguments. Thus "index x 1 2 3" is, in Go syntax, x[1][2][3]. Each
 // indexed item must be a map, slice, or array.
-func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
+func index(item reflect.Value, indexes ...reflect.Value) (reflect.Value, error) {
 	v := indirectInterface(item)
 	if !v.IsValid() {
 		return reflect.Value{}, fmt.Errorf("index of untyped nil")
 	}
-	for _, i := range indices {
+	for _, i := range indexes {
 		index := indirectInterface(i)
 		var isNil bool
 		if v, isNil = indirect(v); isNil {
@@ -177,21 +197,11 @@
 		}
 		switch v.Kind() {
 		case reflect.Array, reflect.Slice, reflect.String:
-			var x int64
-			switch index.Kind() {
-			case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-				x = index.Int()
-			case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
-				x = int64(index.Uint())
-			case reflect.Invalid:
-				return reflect.Value{}, fmt.Errorf("cannot index slice/array with nil")
-			default:
-				return reflect.Value{}, fmt.Errorf("cannot index slice/array with type %s", index.Type())
+			x, err := indexArg(index, v.Len())
+			if err != nil {
+				return reflect.Value{}, err
 			}
-			if x < 0 || x >= int64(v.Len()) {
-				return reflect.Value{}, fmt.Errorf("index out of range: %d", x)
-			}
-			v = v.Index(int(x))
+			v = v.Index(x)
 		case reflect.Map:
 			index, err := prepareArg(index, v.Type().Key())
 			if err != nil {
@@ -212,6 +222,57 @@
 	return v, nil
 }
 
+// Slicing.
+
+// slice returns the result of slicing its first argument by the remaining
+// arguments. Thus "slice x 1 2" is, in Go syntax, x[1:2], while "slice x"
+// is x[:], "slice x 1" is x[1:], and "slice x 1 2 3" is x[1:2:3]. The first
+// argument must be a string, slice, or array.
+func slice(item reflect.Value, indexes ...reflect.Value) (reflect.Value, error) {
+	var (
+		cap int
+		v   = indirectInterface(item)
+	)
+	if !v.IsValid() {
+		return reflect.Value{}, fmt.Errorf("slice of untyped nil")
+	}
+	if len(indexes) > 3 {
+		return reflect.Value{}, fmt.Errorf("too many slice indexes: %d", len(indexes))
+	}
+	switch v.Kind() {
+	case reflect.String:
+		if len(indexes) == 3 {
+			return reflect.Value{}, fmt.Errorf("cannot 3-index slice a string")
+		}
+		cap = v.Len()
+	case reflect.Array, reflect.Slice:
+		cap = v.Cap()
+	default:
+		return reflect.Value{}, fmt.Errorf("can't slice item of type %s", v.Type())
+	}
+	// set default values for cases item[:], item[i:].
+	idx := [3]int{0, v.Len()}
+	for i, index := range indexes {
+		x, err := indexArg(index, cap)
+		if err != nil {
+			return reflect.Value{}, err
+		}
+		idx[i] = x
+	}
+	// given item[i:j], make sure i <= j.
+	if idx[0] > idx[1] {
+		return reflect.Value{}, fmt.Errorf("invalid slice index: %d > %d", idx[0], idx[1])
+	}
+	if len(indexes) < 3 {
+		return item.Slice(idx[0], idx[1]), nil
+	}
+	// given item[i:j:k], make sure i <= j <= k.
+	if idx[1] > idx[2] {
+		return reflect.Value{}, fmt.Errorf("invalid slice index: %d > %d", idx[1], idx[2])
+	}
+	return item.Slice3(idx[0], idx[1], idx[2]), nil
+}
+
 // Length
 
 // length returns the length of the item, with an error if it has no defined length.
diff --git a/test/fixedbugs/issue15071.dir/exp/exp.go b/test/fixedbugs/issue15071.dir/exp.go
similarity index 100%
rename from test/fixedbugs/issue15071.dir/exp/exp.go
rename to test/fixedbugs/issue15071.dir/exp.go
diff --git a/test/fixedbugs/issue15071.go b/test/fixedbugs/issue15071.go
new file mode 100644
index 0000000..af6f134
--- /dev/null
+++ b/test/fixedbugs/issue15071.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue15609.go b/test/fixedbugs/issue15609.go
new file mode 100644
index 0000000..87c96b4
--- /dev/null
+++ b/test/fixedbugs/issue15609.go
@@ -0,0 +1,7 @@
+// runindir
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue29612.go b/test/fixedbugs/issue29612.go
new file mode 100644
index 0000000..87c96b4
--- /dev/null
+++ b/test/fixedbugs/issue29612.go
@@ -0,0 +1,7 @@
+// runindir
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue31636.dir/a.go b/test/fixedbugs/issue31636.dir/a.go
new file mode 100644
index 0000000..e57e0d5
--- /dev/null
+++ b/test/fixedbugs/issue31636.dir/a.go
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+func init() {
+	println("a")
+}
diff --git a/test/fixedbugs/issue31636.dir/b.go b/test/fixedbugs/issue31636.dir/b.go
new file mode 100644
index 0000000..990e682
--- /dev/null
+++ b/test/fixedbugs/issue31636.dir/b.go
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package b
+
+func init() {
+	println("b")
+}
diff --git a/test/fixedbugs/issue31636.dir/c.go b/test/fixedbugs/issue31636.dir/c.go
new file mode 100644
index 0000000..e53529a
--- /dev/null
+++ b/test/fixedbugs/issue31636.dir/c.go
@@ -0,0 +1,9 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package c
+
+func init() {
+	println("c")
+}
diff --git a/test/fixedbugs/issue31636.dir/main.go b/test/fixedbugs/issue31636.dir/main.go
new file mode 100644
index 0000000..d8ae902
--- /dev/null
+++ b/test/fixedbugs/issue31636.dir/main.go
@@ -0,0 +1,20 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// We want the initializers of these packages to occur in source code
+// order. See issue 31636. This is the behavior up to and including
+// 1.13. For 1.14, we will move to a variant of lexicographic ordering
+// which will require a change to the test output of this test.
+import (
+	_ "c"
+
+	_ "b"
+
+	_ "a"
+)
+
+func main() {
+}
diff --git a/test/fixedbugs/issue31636.go b/test/fixedbugs/issue31636.go
new file mode 100644
index 0000000..af6f134
--- /dev/null
+++ b/test/fixedbugs/issue31636.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue31636.out b/test/fixedbugs/issue31636.out
new file mode 100644
index 0000000..e274b2b
--- /dev/null
+++ b/test/fixedbugs/issue31636.out
@@ -0,0 +1,3 @@
+c
+b
+a
diff --git a/test/fixedbugs/issue31959.dir/a.go b/test/fixedbugs/issue31959.dir/a.go
new file mode 100644
index 0000000..6c7ffa3
--- /dev/null
+++ b/test/fixedbugs/issue31959.dir/a.go
@@ -0,0 +1,12 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+type T struct{}
+
+func F() {
+	type T = int
+	println(T(0))
+}
diff --git a/test/fixedbugs/issue31959.dir/main.go b/test/fixedbugs/issue31959.dir/main.go
new file mode 100644
index 0000000..895c4e5
--- /dev/null
+++ b/test/fixedbugs/issue31959.dir/main.go
@@ -0,0 +1,21 @@
+// run
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Check import package contains type alias in function
+// with the same name with an export type not panic
+
+package main
+
+import (
+	"fmt"
+
+	"a"
+)
+
+func main() {
+	fmt.Println(a.T{})
+	a.F()
+}
diff --git a/test/fixedbugs/issue31959.go b/test/fixedbugs/issue31959.go
new file mode 100644
index 0000000..af6f134
--- /dev/null
+++ b/test/fixedbugs/issue31959.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored
diff --git a/test/fixedbugs/issue31959.out b/test/fixedbugs/issue31959.out
new file mode 100644
index 0000000..8ddcb67
--- /dev/null
+++ b/test/fixedbugs/issue31959.out
@@ -0,0 +1,2 @@
+{}
+0
diff --git a/test/fixedbugs/issue32175.go b/test/fixedbugs/issue32175.go
new file mode 100644
index 0000000..a677351
--- /dev/null
+++ b/test/fixedbugs/issue32175.go
@@ -0,0 +1,22 @@
+// run
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// This used to print 0, because x was incorrectly captured by value.
+
+func f() (x int) {
+	defer func() func() {
+		return func() {
+			println(x)
+		}
+	}()()
+	return 42
+}
+
+func main() {
+	f()
+}
diff --git a/test/fixedbugs/issue32175.out b/test/fixedbugs/issue32175.out
new file mode 100644
index 0000000..d81cc07
--- /dev/null
+++ b/test/fixedbugs/issue32175.out
@@ -0,0 +1 @@
+42
diff --git a/test/run.go b/test/run.go
index f66db63..28ed865 100644
--- a/test/run.go
+++ b/test/run.go
@@ -34,6 +34,7 @@
 	keep           = flag.Bool("k", false, "keep. keep temporary directory.")
 	numParallel    = flag.Int("n", runtime.NumCPU(), "number of parallel tests to run")
 	summary        = flag.Bool("summary", false, "show summary of results")
+	allCodegen     = flag.Bool("all_codegen", false, "run all goos/goarch for codegen")
 	showSkips      = flag.Bool("show_skips", false, "show skipped tests")
 	runSkips       = flag.Bool("run_skips", false, "run skipped tests (ignore skip and build tags)")
 	linkshared     = flag.Bool("linkshared", false, "")
@@ -521,7 +522,7 @@
 
 	// TODO: Clean up/simplify this switch statement.
 	switch action {
-	case "compile", "compiledir", "build", "builddir", "buildrundir", "run", "buildrun", "runoutput", "rundir", "asmcheck":
+	case "compile", "compiledir", "build", "builddir", "buildrundir", "run", "buildrun", "runoutput", "rundir", "runindir", "asmcheck":
 		// nothing to do
 	case "errorcheckandrundir":
 		wantError = false // should be no error if also will run
@@ -602,16 +603,19 @@
 	}
 
 	useTmp := true
+	runInDir := false
 	runcmd := func(args ...string) ([]byte, error) {
 		cmd := exec.Command(args[0], args[1:]...)
 		var buf bytes.Buffer
 		cmd.Stdout = &buf
 		cmd.Stderr = &buf
+		cmd.Env = os.Environ()
 		if useTmp {
 			cmd.Dir = t.tempDir
 			cmd.Env = envForDir(cmd.Dir)
-		} else {
-			cmd.Env = os.Environ()
+		}
+		if runInDir {
+			cmd.Dir = t.goDirName()
 		}
 
 		var err error
@@ -653,7 +657,13 @@
 		// Compile Go file and match the generated assembly
 		// against a set of regexps in comments.
 		ops := t.wantedAsmOpcodes(long)
+		self := runtime.GOOS + "/" + runtime.GOARCH
 		for _, env := range ops.Envs() {
+			// Only run checks relevant to the current GOOS/GOARCH,
+			// to avoid triggering a cross-compile of the runtime.
+			if string(env) != self && !strings.HasPrefix(string(env), self+"/") && !*allCodegen {
+				continue
+			}
 			// -S=2 forces outermost line numbers when disassembling inlined code.
 			cmdline := []string{"build", "-gcflags", "-S=2"}
 			cmdline = append(cmdline, flags...)
@@ -827,6 +837,28 @@
 			}
 		}
 
+	case "runindir":
+		// run "go run ." in t.goDirName()
+		// It's used when test requires go build and run the binary success.
+		// Example when long import path require (see issue29612.dir) or test
+		// contains assembly file (see issue15609.dir).
+		// Verify the expected output.
+		useTmp = false
+		runInDir = true
+		cmd := []string{goTool(), "run", goGcflags()}
+		if *linkshared {
+			cmd = append(cmd, "-linkshared")
+		}
+		cmd = append(cmd, ".")
+		out, err := runcmd(cmd...)
+		if err != nil {
+			t.err = err
+			return
+		}
+		if strings.Replace(string(out), "\r\n", "\n", -1) != t.expectedOutput() {
+			t.err = fmt.Errorf("incorrect output\n%s", out)
+		}
+
 	case "build":
 		// Build Go file.
 		_, err := runcmd(goTool(), "build", goGcflags(), "-o", "a.exe", long)