mirror of
https://github.com/golang/go.git
synced 2025-05-05 23:53:05 +00:00
[dev.boringcrypto.go1.14] all: merge go1.14.15 into dev.boringcrypto.go1.14
Change-Id: I0abd542a4c1cd90c29eb4c65493548af575e07ab
This commit is contained in:
commit
47419f9cac
@ -2351,7 +2351,7 @@
|
|||||||
(Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _))
|
(Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _))
|
||||||
&& t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq
|
&& t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq
|
||||||
&& isSamePtr(tmp1, tmp2)
|
&& isSamePtr(tmp1, tmp2)
|
||||||
&& isStackPtr(src)
|
&& isStackPtr(src) && !isVolatile(src)
|
||||||
&& disjoint(src, s, tmp2, s)
|
&& disjoint(src, s, tmp2, s)
|
||||||
&& (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
&& (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
||||||
-> (Move {t1} [s] dst src midmem)
|
-> (Move {t1} [s] dst src midmem)
|
||||||
@ -2360,7 +2360,7 @@
|
|||||||
(Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _)))
|
(Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _)))
|
||||||
&& t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq
|
&& t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq
|
||||||
&& isSamePtr(tmp1, tmp2)
|
&& isSamePtr(tmp1, tmp2)
|
||||||
&& isStackPtr(src)
|
&& isStackPtr(src) && !isVolatile(src)
|
||||||
&& disjoint(src, s, tmp2, s)
|
&& disjoint(src, s, tmp2, s)
|
||||||
&& (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
&& (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
||||||
-> (Move {t1} [s] dst src midmem)
|
-> (Move {t1} [s] dst src midmem)
|
||||||
|
@ -32031,7 +32031,7 @@ func rewriteValuegeneric_OpMove_20(v *Value) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _))
|
// match: (Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _))
|
||||||
// cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
// cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
||||||
// result: (Move {t1} [s] dst src midmem)
|
// result: (Move {t1} [s] dst src midmem)
|
||||||
for {
|
for {
|
||||||
s := v.AuxInt
|
s := v.AuxInt
|
||||||
@ -32047,7 +32047,7 @@ func rewriteValuegeneric_OpMove_20(v *Value) bool {
|
|||||||
_ = midmem.Args[2]
|
_ = midmem.Args[2]
|
||||||
tmp2 := midmem.Args[0]
|
tmp2 := midmem.Args[0]
|
||||||
src := midmem.Args[1]
|
src := midmem.Args[1]
|
||||||
if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) {
|
if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpMove)
|
v.reset(OpMove)
|
||||||
@ -32059,7 +32059,7 @@ func rewriteValuegeneric_OpMove_20(v *Value) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _)))
|
// match: (Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _)))
|
||||||
// cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
// cond: t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))
|
||||||
// result: (Move {t1} [s] dst src midmem)
|
// result: (Move {t1} [s] dst src midmem)
|
||||||
for {
|
for {
|
||||||
s := v.AuxInt
|
s := v.AuxInt
|
||||||
@ -32079,7 +32079,7 @@ func rewriteValuegeneric_OpMove_20(v *Value) bool {
|
|||||||
_ = midmem_0.Args[2]
|
_ = midmem_0.Args[2]
|
||||||
tmp2 := midmem_0.Args[0]
|
tmp2 := midmem_0.Args[0]
|
||||||
src := midmem_0.Args[1]
|
src := midmem_0.Args[1]
|
||||||
if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) {
|
if !(t1.(*types.Type).Compare(t2.(*types.Type)) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpMove)
|
v.reset(OpMove)
|
||||||
|
@ -56,9 +56,6 @@ type Builder struct {
|
|||||||
id sync.Mutex
|
id sync.Mutex
|
||||||
toolIDCache map[string]string // tool name -> tool ID
|
toolIDCache map[string]string // tool name -> tool ID
|
||||||
buildIDCache map[string]string // file name -> build ID
|
buildIDCache map[string]string // file name -> build ID
|
||||||
|
|
||||||
cgoEnvOnce sync.Once
|
|
||||||
cgoEnvCache []string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: Much of Action would not need to be exported if not for test.
|
// NOTE: Much of Action would not need to be exported if not for test.
|
||||||
|
@ -1076,7 +1076,10 @@ func (b *Builder) vet(a *Action) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO(rsc): Why do we pass $GCCGO to go vet?
|
// TODO(rsc): Why do we pass $GCCGO to go vet?
|
||||||
env := b.cgoEnv()
|
env := b.cCompilerEnv()
|
||||||
|
if cfg.BuildToolchainName == "gccgo" {
|
||||||
|
env = append(env, "GCCGO="+BuildToolchain.compiler())
|
||||||
|
}
|
||||||
|
|
||||||
p := a.Package
|
p := a.Package
|
||||||
tool := VetTool
|
tool := VetTool
|
||||||
@ -1980,24 +1983,6 @@ func (b *Builder) cCompilerEnv() []string {
|
|||||||
return []string{"TERM=dumb"}
|
return []string{"TERM=dumb"}
|
||||||
}
|
}
|
||||||
|
|
||||||
// cgoEnv returns environment variables to set when running cgo.
|
|
||||||
// Some of these pass through to cgo running the C compiler,
|
|
||||||
// so it includes cCompilerEnv.
|
|
||||||
func (b *Builder) cgoEnv() []string {
|
|
||||||
b.cgoEnvOnce.Do(func() {
|
|
||||||
cc, err := exec.LookPath(b.ccExe()[0])
|
|
||||||
if err != nil || filepath.Base(cc) == cc { // reject relative path
|
|
||||||
cc = "/missing-cc"
|
|
||||||
}
|
|
||||||
gccgo := GccgoBin
|
|
||||||
if filepath.Base(gccgo) == gccgo { // reject relative path
|
|
||||||
gccgo = "/missing-gccgo"
|
|
||||||
}
|
|
||||||
b.cgoEnvCache = append(b.cCompilerEnv(), "CC="+cc, "GCCGO="+gccgo)
|
|
||||||
})
|
|
||||||
return b.cgoEnvCache
|
|
||||||
}
|
|
||||||
|
|
||||||
// mkdir makes the named directory.
|
// mkdir makes the named directory.
|
||||||
func (b *Builder) Mkdir(dir string) error {
|
func (b *Builder) Mkdir(dir string) error {
|
||||||
// Make Mkdir(a.Objdir) a no-op instead of an error when a.Objdir == "".
|
// Make Mkdir(a.Objdir) a no-op instead of an error when a.Objdir == "".
|
||||||
@ -2543,7 +2528,7 @@ func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgo
|
|||||||
// along to the host linker. At this point in the code, cgoLDFLAGS
|
// along to the host linker. At this point in the code, cgoLDFLAGS
|
||||||
// consists of the original $CGO_LDFLAGS (unchecked) and all the
|
// consists of the original $CGO_LDFLAGS (unchecked) and all the
|
||||||
// flags put together from source code (checked).
|
// flags put together from source code (checked).
|
||||||
cgoenv := b.cgoEnv()
|
cgoenv := b.cCompilerEnv()
|
||||||
if len(cgoLDFLAGS) > 0 {
|
if len(cgoLDFLAGS) > 0 {
|
||||||
flags := make([]string, len(cgoLDFLAGS))
|
flags := make([]string, len(cgoLDFLAGS))
|
||||||
for i, f := range cgoLDFLAGS {
|
for i, f := range cgoLDFLAGS {
|
||||||
@ -2764,7 +2749,7 @@ func (b *Builder) dynimport(a *Action, p *load.Package, objdir, importGo, cgoExe
|
|||||||
if p.Standard && p.ImportPath == "runtime/cgo" {
|
if p.Standard && p.ImportPath == "runtime/cgo" {
|
||||||
cgoflags = []string{"-dynlinker"} // record path to dynamic linker
|
cgoflags = []string{"-dynlinker"} // record path to dynamic linker
|
||||||
}
|
}
|
||||||
return b.run(a, p.Dir, p.ImportPath, b.cgoEnv(), cfg.BuildToolexec, cgoExe, "-dynpackage", p.Name, "-dynimport", dynobj, "-dynout", importGo, cgoflags)
|
return b.run(a, p.Dir, p.ImportPath, b.cCompilerEnv(), cfg.BuildToolexec, cgoExe, "-dynpackage", p.Name, "-dynimport", dynobj, "-dynout", importGo, cgoflags)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run SWIG on all SWIG input files.
|
// Run SWIG on all SWIG input files.
|
||||||
|
12
src/cmd/go/testdata/script/cgo_path.txt
vendored
12
src/cmd/go/testdata/script/cgo_path.txt
vendored
@ -1,12 +1,20 @@
|
|||||||
[!cgo] skip
|
[!cgo] skip
|
||||||
|
|
||||||
|
# Set CC explicitly to something that requires a PATH lookup.
|
||||||
|
# Normally, the default is gcc or clang, but if CC was set during make.bash,
|
||||||
|
# that becomes the default.
|
||||||
|
[exec:clang] env CC=clang
|
||||||
|
[exec:gcc] env CC=gcc
|
||||||
|
[!exec:clang] [!exec:gcc] skip 'Unknown C compiler'
|
||||||
|
|
||||||
env GOCACHE=$WORK/gocache # Looking for compile flags, so need a clean cache.
|
env GOCACHE=$WORK/gocache # Looking for compile flags, so need a clean cache.
|
||||||
[!windows] env PATH=.:$PATH
|
[!windows] env PATH=.:$PATH
|
||||||
[!windows] chmod 0777 p/gcc p/clang
|
[!windows] chmod 0755 p/gcc p/clang
|
||||||
[!windows] exists p/gcc p/clang
|
[!windows] exists p/gcc p/clang
|
||||||
[windows] exists p/gcc.bat p/clang.bat
|
[windows] exists p/gcc.bat p/clang.bat
|
||||||
! exists p/bug.txt
|
! exists p/bug.txt
|
||||||
go build -x
|
! go build -x
|
||||||
|
stderr '^cgo: exec (clang|gcc): (clang|gcc) resolves to executable in current directory \(.[/\\](clang|gcc)(.bat)?\)$'
|
||||||
! exists p/bug.txt
|
! exists p/bug.txt
|
||||||
|
|
||||||
-- go.mod --
|
-- go.mod --
|
||||||
|
52
src/cmd/go/testdata/script/cgo_path_space.txt
vendored
Normal file
52
src/cmd/go/testdata/script/cgo_path_space.txt
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Check that if the PATH directory containing the C compiler has a space,
|
||||||
|
# we can still use that compiler with cgo.
|
||||||
|
# Verifies #43808.
|
||||||
|
[!cgo] skip
|
||||||
|
|
||||||
|
# Set CC explicitly to something that requires a PATH lookup.
|
||||||
|
# Normally, the default is gcc or clang, but if CC was set during make.bash,
|
||||||
|
# that becomes the default.
|
||||||
|
[exec:clang] env CC=clang
|
||||||
|
[exec:gcc] env CC=gcc
|
||||||
|
[!exec:clang] [!exec:gcc] skip 'Unknown C compiler'
|
||||||
|
|
||||||
|
[!windows] chmod 0755 $WORK/'program files'/clang
|
||||||
|
[!windows] chmod 0755 $WORK/'program files'/gcc
|
||||||
|
[!windows] env PATH=$WORK/'program files':$PATH
|
||||||
|
[windows] env PATH=$WORK\'program files';%PATH%
|
||||||
|
|
||||||
|
! exists $WORK/log.txt
|
||||||
|
! go build -x
|
||||||
|
exists $WORK/log.txt
|
||||||
|
rm $WORK/log.txt
|
||||||
|
|
||||||
|
# TODO(#41400, #43078): when CC is set explicitly, it should be allowed to
|
||||||
|
# contain spaces separating arguments, and it should be possible to quote
|
||||||
|
# arguments with spaces (including the path), as in CGO_CFLAGS and other
|
||||||
|
# variables. For now, this doesn't work.
|
||||||
|
[!windows] env CC=$WORK/'program files'/gcc
|
||||||
|
[windows] env CC=$WORK\'program files'\gcc.bat
|
||||||
|
! go build -x
|
||||||
|
! exists $WORK/log.txt
|
||||||
|
|
||||||
|
-- go.mod --
|
||||||
|
module m
|
||||||
|
|
||||||
|
-- m.go --
|
||||||
|
package m
|
||||||
|
|
||||||
|
// #define X 1
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
-- $WORK/program files/gcc --
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo ok >$WORK/log.txt
|
||||||
|
-- $WORK/program files/clang --
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo ok >$WORK/log.txt
|
||||||
|
-- $WORK/program files/gcc.bat --
|
||||||
|
echo ok >%WORK%\log.txt
|
||||||
|
-- $WORK/program files/clang.bat --
|
||||||
|
echo ok >%WORK%\log.txt
|
@ -6,5 +6,5 @@ env GOPROXY=https://proxy.golang.org,direct
|
|||||||
env GOSUMDB=off
|
env GOSUMDB=off
|
||||||
|
|
||||||
go get -x -v -d golang.org/x/tools/cmd/goimports
|
go get -x -v -d golang.org/x/tools/cmd/goimports
|
||||||
stderr '# get https://proxy.golang.org/golang.org/x/tools/@latest'
|
stderr '# get https://proxy.golang.org/golang.org/x/tools/@v/list'
|
||||||
! stderr '# get https://golang.org'
|
! stderr '# get https://golang.org'
|
||||||
|
@ -4,7 +4,7 @@ go 1.14
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d
|
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d
|
||||||
golang.org/x/net v0.0.0-20201029202311-70d85028bad3
|
golang.org/x/net v0.0.0-20210129194117-4acb7895a057
|
||||||
golang.org/x/sys v0.0.0-20200201011859-915c9c3d4ccf // indirect
|
golang.org/x/sys v0.0.0-20200201011859-915c9c3d4ccf // indirect
|
||||||
golang.org/x/text v0.3.3-0.20191031172631-4b67af870c6f // indirect
|
golang.org/x/text v0.3.3-0.20191031172631-4b67af870c6f // indirect
|
||||||
)
|
)
|
||||||
|
@ -2,8 +2,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
|||||||
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d h1:9FCpayM9Egr1baVnV1SX0H87m+XB0B8S0hAMi99X/3U=
|
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d h1:9FCpayM9Egr1baVnV1SX0H87m+XB0B8S0hAMi99X/3U=
|
||||||
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20201029202311-70d85028bad3 h1:zhmuDiUI8/S25xjIBeUn8XwfxP7SKYR41pTuOoa1O+w=
|
golang.org/x/net v0.0.0-20210129194117-4acb7895a057 h1:HThQeV5c0Ab/Puir+q6mC97b7+3dfZdsLWMLoBrzo68=
|
||||||
golang.org/x/net v0.0.0-20201029202311-70d85028bad3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20210129194117-4acb7895a057/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200201011859-915c9c3d4ccf h1:+4j7oujXP478CVb/AFvHJmVX5+Pczx2NGts5yirA0oY=
|
golang.org/x/sys v0.0.0-20200201011859-915c9c3d4ccf h1:+4j7oujXP478CVb/AFvHJmVX5+Pczx2NGts5yirA0oY=
|
||||||
|
@ -7,6 +7,7 @@ package execabs
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"internal/testenv"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@ -30,6 +31,8 @@ func TestFixCmd(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCommand(t *testing.T) {
|
func TestCommand(t *testing.T) {
|
||||||
|
testenv.MustHaveExec(t)
|
||||||
|
|
||||||
for _, cmd := range []func(string) *Cmd{
|
for _, cmd := range []func(string) *Cmd{
|
||||||
func(s string) *Cmd { return Command(s) },
|
func(s string) *Cmd { return Command(s) },
|
||||||
func(s string) *Cmd { return CommandContext(context.Background(), s) },
|
func(s string) *Cmd { return CommandContext(context.Background(), s) },
|
||||||
@ -71,6 +74,8 @@ func TestCommand(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLookPath(t *testing.T) {
|
func TestLookPath(t *testing.T) {
|
||||||
|
testenv.MustHaveExec(t)
|
||||||
|
|
||||||
tmpDir, err := ioutil.TempDir("", "execabs-test")
|
tmpDir, err := ioutil.TempDir("", "execabs-test")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("ioutil.TempDir failed: %s", err)
|
t.Fatalf("ioutil.TempDir failed: %s", err)
|
||||||
|
@ -7593,6 +7593,9 @@ func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterRe
|
|||||||
// we can keep it.
|
// we can keep it.
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(http2errStopReqBodyWrite)
|
cs.abortRequestBodyWrite(http2errStopReqBodyWrite)
|
||||||
|
if hasBody && !bodyWritten {
|
||||||
|
<-bodyWriter.resc
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if re.err != nil {
|
if re.err != nil {
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
@ -7613,6 +7616,7 @@ func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterRe
|
|||||||
} else {
|
} else {
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
|
cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
|
||||||
|
<-bodyWriter.resc
|
||||||
}
|
}
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), http2errTimeout
|
return nil, cs.getStartedWrite(), http2errTimeout
|
||||||
@ -7622,6 +7626,7 @@ func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterRe
|
|||||||
} else {
|
} else {
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
|
cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
|
||||||
|
<-bodyWriter.resc
|
||||||
}
|
}
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), ctx.Err()
|
return nil, cs.getStartedWrite(), ctx.Err()
|
||||||
@ -7631,6 +7636,7 @@ func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterRe
|
|||||||
} else {
|
} else {
|
||||||
bodyWriter.cancel()
|
bodyWriter.cancel()
|
||||||
cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
|
cs.abortRequestBodyWrite(http2errStopReqBodyWriteAndCancel)
|
||||||
|
<-bodyWriter.resc
|
||||||
}
|
}
|
||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), http2errRequestCanceled
|
return nil, cs.getStartedWrite(), http2errRequestCanceled
|
||||||
@ -7640,6 +7646,7 @@ func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterRe
|
|||||||
// forgetStreamID.
|
// forgetStreamID.
|
||||||
return nil, cs.getStartedWrite(), cs.resetErr
|
return nil, cs.getStartedWrite(), cs.resetErr
|
||||||
case err := <-bodyWriter.resc:
|
case err := <-bodyWriter.resc:
|
||||||
|
bodyWritten = true
|
||||||
// Prefer the read loop's response, if available. Issue 16102.
|
// Prefer the read loop's response, if available. Issue 16102.
|
||||||
select {
|
select {
|
||||||
case re := <-readLoopResCh:
|
case re := <-readLoopResCh:
|
||||||
@ -7650,7 +7657,6 @@ func (cc *http2ClientConn) roundTrip(req *Request) (res *Response, gotErrAfterRe
|
|||||||
cc.forgetStreamID(cs.ID)
|
cc.forgetStreamID(cs.ID)
|
||||||
return nil, cs.getStartedWrite(), err
|
return nil, cs.getStartedWrite(), err
|
||||||
}
|
}
|
||||||
bodyWritten = true
|
|
||||||
if d := cc.responseHeaderTimeout(); d != 0 {
|
if d := cc.responseHeaderTimeout(); d != 0 {
|
||||||
timer := time.NewTimer(d)
|
timer := time.NewTimer(d)
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
@ -9055,7 +9061,9 @@ func (t *http2Transport) getBodyWriterState(cs *http2clientStream, body io.Reade
|
|||||||
|
|
||||||
func (s http2bodyWriterState) cancel() {
|
func (s http2bodyWriterState) cancel() {
|
||||||
if s.timer != nil {
|
if s.timer != nil {
|
||||||
s.timer.Stop()
|
if s.timer.Stop() {
|
||||||
|
s.resc <- nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ static void *threadentry(void*);
|
|||||||
static void (*setg_gcc)(void*);
|
static void (*setg_gcc)(void*);
|
||||||
|
|
||||||
// This will be set in gcc_android.c for android-specific customization.
|
// This will be set in gcc_android.c for android-specific customization.
|
||||||
void (*x_cgo_inittls)(void **tlsg, void **tlsbase);
|
void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common));
|
||||||
|
|
||||||
void
|
void
|
||||||
x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
|
x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
|
||||||
|
@ -14,7 +14,7 @@ static void* threadentry(void*);
|
|||||||
static void (*setg_gcc)(void*);
|
static void (*setg_gcc)(void*);
|
||||||
|
|
||||||
// This will be set in gcc_android.c for android-specific customization.
|
// This will be set in gcc_android.c for android-specific customization.
|
||||||
void (*x_cgo_inittls)(void **tlsg, void **tlsbase);
|
void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common));
|
||||||
|
|
||||||
void
|
void
|
||||||
x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
|
x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
static void *threadentry(void*);
|
static void *threadentry(void*);
|
||||||
|
|
||||||
void (*x_cgo_inittls)(void **tlsg, void **tlsbase);
|
void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common));
|
||||||
static void (*setg_gcc)(void*);
|
static void (*setg_gcc)(void*);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
static void *threadentry(void*);
|
static void *threadentry(void*);
|
||||||
|
|
||||||
void (*x_cgo_inittls)(void **tlsg, void **tlsbase);
|
void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common));
|
||||||
static void (*setg_gcc)(void*);
|
static void (*setg_gcc)(void*);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
2
src/vendor/modules.txt
vendored
2
src/vendor/modules.txt
vendored
@ -8,7 +8,7 @@ golang.org/x/crypto/curve25519
|
|||||||
golang.org/x/crypto/hkdf
|
golang.org/x/crypto/hkdf
|
||||||
golang.org/x/crypto/internal/subtle
|
golang.org/x/crypto/internal/subtle
|
||||||
golang.org/x/crypto/poly1305
|
golang.org/x/crypto/poly1305
|
||||||
# golang.org/x/net v0.0.0-20201029202311-70d85028bad3
|
# golang.org/x/net v0.0.0-20210129194117-4acb7895a057
|
||||||
## explicit
|
## explicit
|
||||||
golang.org/x/net/dns/dnsmessage
|
golang.org/x/net/dns/dnsmessage
|
||||||
golang.org/x/net/http/httpguts
|
golang.org/x/net/http/httpguts
|
||||||
|
40
test/fixedbugs/issue43570.go
Normal file
40
test/fixedbugs/issue43570.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// run
|
||||||
|
|
||||||
|
// Copyright 2021 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type T [8]*int
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func f(x int) T {
|
||||||
|
return T{}
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func g(x int, t T) {
|
||||||
|
if t != (T{}) {
|
||||||
|
panic(fmt.Sprintf("bad: %v", t))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
const N = 10000
|
||||||
|
var q T
|
||||||
|
func() {
|
||||||
|
for i := 0; i < N; i++ {
|
||||||
|
q = f(0)
|
||||||
|
g(0, q)
|
||||||
|
sink = make([]byte, 1024)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
// Note that the closure is a trick to get the write to q to be a
|
||||||
|
// write to a pointer that is known to be non-nil and requires
|
||||||
|
// a write barrier.
|
||||||
|
}
|
||||||
|
|
||||||
|
var sink []byte
|
Loading…
x
Reference in New Issue
Block a user