mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.typeparams] all: merge master (c8f4e61) into dev.typeparams
Conflicts: - src/runtime/internal/sys/zgoarch_386.go - src/runtime/internal/sys/zgoarch_amd64.go - src/runtime/internal/sys/zgoarch_arm.go - src/runtime/internal/sys/zgoarch_arm64.go - src/runtime/internal/sys/zgoarch_arm64be.go - src/runtime/internal/sys/zgoarch_armbe.go - src/runtime/internal/sys/zgoarch_mips.go - src/runtime/internal/sys/zgoarch_mips64.go - src/runtime/internal/sys/zgoarch_mips64le.go - src/runtime/internal/sys/zgoarch_mips64p32.go - src/runtime/internal/sys/zgoarch_mips64p32le.go - src/runtime/internal/sys/zgoarch_mipsle.go - src/runtime/internal/sys/zgoarch_ppc.go - src/runtime/internal/sys/zgoarch_ppc64.go - src/runtime/internal/sys/zgoarch_ppc64le.go - src/runtime/internal/sys/zgoarch_riscv.go - src/runtime/internal/sys/zgoarch_riscv64.go - src/runtime/internal/sys/zgoarch_s390.go - src/runtime/internal/sys/zgoarch_s390x.go - src/runtime/internal/sys/zgoarch_sparc.go - src/runtime/internal/sys/zgoarch_sparc64.go - src/runtime/internal/sys/zgoarch_wasm.go On dev.typeparams, CL 328336 moved these files to internal/goarch; whereas on master, CL 333909 reserved GOARCH=loong64. For this CL, I resolved the conflict by simply running "go generate internal/goarch". Merge List: + 2021-07-19c8f4e6152dspec: correct example comment in Conversions from slice to array + 2021-07-191d91551b73time: correct typo in documentation for UnixMicro + 2021-07-19404127c30fcmd/compile: fix off-by-one error in traceback argument counting + 2021-07-196298cfe672cmd/compile: fix typo in fatal message of builtinCall + 2021-07-1949402bee36cmd/{compile,link}: fix bug in map.zero handling + 2021-07-18a66190eceetest/bench/go1: fix size for RegexpMatchMedium_32 + 2021-07-18650fc2117atext/scanner: use Go convention in Position doc comment + 2021-07-16aa4e0f528enet/http: correct capitalization in cancelTimeBody comment + 2021-07-150941dbca6atesting: clarify in docs that TestMain is advanced + 2021-07-1569728ead87cmd/go: update error messages in tests to match CL 332573 + 2021-07-15c1cc9f9c3dcmd/compile: fix lookup package of redeclared dot import symbol + 2021-07-1521a04e3335doc/go1.17: mention GOARCH=loong64 + 2021-07-142b00a54bafgo/build, runtime/internal/sys: reserve GOARCH=loong64 + 2021-07-1460ddf42b46cmd/go: change link in error message from /wiki to /doc. + 2021-07-13d8f348a589cmd/go: remove a duplicated word from 'go help mod graph' + 2021-07-12a98589711dcrypto/tls: test key type when casting + 2021-07-12cfbd73ba33doc/go1.17: editing pass over the "Compiler" section + 2021-07-09ab4085ce84runtime/pprof: call runtime.GC twice in memory profile test Change-Id: I1490a4c7e4c560659c21a4eb67d243f35d1f908e
This commit is contained in:
commit
e4994e71fb
53 changed files with 486 additions and 75 deletions
|
|
@ -119,6 +119,17 @@ Do not send CLs removing the interior tags from such phrases.
|
||||||
stack frame pointers only on Linux, macOS, and iOS.
|
stack frame pointers only on Linux, macOS, and iOS.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<h3 id="loong64">loong64 GOARCH value reserved</h3>
|
||||||
|
|
||||||
|
<p><!-- CL 333909 -->
|
||||||
|
The main Go compiler does not yet support the LoongArch
|
||||||
|
architecture, but we've reserved the <code>GOARCH</code> value
|
||||||
|
"<code>loong64</code>".
|
||||||
|
This means that Go files named <code>*_loong64.go</code> will now
|
||||||
|
be <a href="/pkg/go/build/#hdr-Build_Constraints">ignored by Go
|
||||||
|
tools</a> except when that GOARCH value is being used.
|
||||||
|
</p>
|
||||||
|
|
||||||
<h2 id="tools">Tools</h2>
|
<h2 id="tools">Tools</h2>
|
||||||
|
|
||||||
<h3 id="go-command">Go command</h3>
|
<h3 id="go-command">Go command</h3>
|
||||||
|
|
@ -401,30 +412,37 @@ func Foo() bool {
|
||||||
|
|
||||||
<p><!-- golang.org/issue/40724 -->
|
<p><!-- golang.org/issue/40724 -->
|
||||||
Go 1.17 implements a new way of passing function arguments and results using
|
Go 1.17 implements a new way of passing function arguments and results using
|
||||||
registers instead of the stack. This work is enabled for Linux, macOS, and
|
registers instead of the stack.
|
||||||
Windows on the 64-bit x86 architecture (the <code>linux/amd64</code>,
|
Benchmarks for a representative set of Go packages and programs show
|
||||||
<code>darwin/amd64</code>, <code>windows/amd64</code> ports). For a
|
performance improvements of about 5%, and a typical reduction in
|
||||||
representative set of Go packages and programs, benchmarking has shown
|
binary size of about 2%.
|
||||||
performance improvements of about 5%, and a typical reduction in binary size
|
This is currently enabled for Linux, macOS, and Windows on the
|
||||||
of about 2%.
|
64-bit x86 architecture (the <code>linux/amd64</code>,
|
||||||
|
<code>darwin/amd64</code>, and <code>windows/amd64</code> ports).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
This change does not affect the functionality of any safe Go code. It can affect
|
This change does not affect the functionality of any safe Go code
|
||||||
code outside the <a href="/doc/go1compat">compatibility guidelines</a> with
|
and is designed to have no impact on most assembly code.
|
||||||
minimal impact. To maintain compatibility with existing assembly functions,
|
It may affect code that violates
|
||||||
adapter functions converting between the new register-based calling convention
|
the <a href="/pkg/unsafe#Pointer"><code>unsafe.Pointer</code></a>
|
||||||
and the previous stack-based calling convention (also known as ABI wrappers)
|
rules when accessing function arguments, or that depends on
|
||||||
are sometimes used. This is mostly invisible to users, except for assembly
|
undocumented behavior involving comparing function code pointers.
|
||||||
functions that have their addresses taken in Go. Using <code>reflect.ValueOf(fn).Pointer()</code>
|
To maintain compatibility with existing assembly functions, the
|
||||||
(or similar approaches such as via <code>unsafe.Pointer</code>) to get the address
|
compiler generates adapter functions that convert between the new
|
||||||
of an assembly function will now return the address of the ABI wrapper. This is
|
register-based calling convention and the previous stack-based
|
||||||
mostly harmless, except for special-purpose assembly code (such as accessing
|
calling convention.
|
||||||
thread-local storage or requiring a special stack alignment). Assembly functions
|
These adapters are typically invisible to users, except that taking
|
||||||
called indirectly from Go via <code>func</code> values will now be made through
|
the address of a Go function in assembly code or taking the address
|
||||||
ABI wrappers, which may cause a very small performance overhead. Also, calling
|
of an assembly function in Go code
|
||||||
Go functions from assembly may now go through ABI wrappers, with a very small
|
using <code>reflect.ValueOf(fn).Pointer()</code>
|
||||||
performance overhead.
|
or <code>unsafe.Pointer</code> will now return the address of the
|
||||||
|
adapter.
|
||||||
|
Code that depends on the value of these code pointers may no longer
|
||||||
|
behave as expected.
|
||||||
|
Adapters also may cause a very small performance overhead in two
|
||||||
|
cases: calling an assembly function indirectly from Go via
|
||||||
|
a <code>func</code> value, and calling Go functions from assembly.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- CL 304470 -->
|
<p><!-- CL 304470 -->
|
||||||
|
|
@ -440,11 +458,14 @@ func Foo() bool {
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p><!-- CL 283112, golang.org/issue/28727 -->
|
<p><!-- CL 283112, golang.org/issue/28727 -->
|
||||||
Functions containing closures can now be inlined. One effect of this change is
|
Functions containing closures can now be inlined.
|
||||||
that a function with a closure may actually produce a distinct closure function
|
One effect of this change is that a function with a closure may
|
||||||
for each place that the function is inlined. Hence, this change could reveal
|
produce a distinct closure code pointer for each place that the
|
||||||
bugs where Go functions are compared (incorrectly) by pointer value. Go
|
function is inlined.
|
||||||
functions are by definition not comparable.
|
Go function values are not directly comparable, but this change
|
||||||
|
could reveal bugs in code that uses <code>reflect</code>
|
||||||
|
or <code>unsafe.Pointer</code> to bypass this language restriction
|
||||||
|
and compare functions by code pointer.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="library">Core library</h2>
|
<h2 id="library">Core library</h2>
|
||||||
|
|
|
||||||
|
|
@ -4334,7 +4334,7 @@ s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
|
||||||
|
|
||||||
var t []string
|
var t []string
|
||||||
t0 := (*[0]string)(t) // t0 == nil
|
t0 := (*[0]string)(t) // t0 == nil
|
||||||
t1 := (*[1]string)(t) // panics: len([1]string) > len(s)
|
t1 := (*[1]string)(t) // panics: len([1]string) > len(t)
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3 id="Constant_expressions">Constant expressions</h3>
|
<h3 id="Constant_expressions">Constant expressions</h3>
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ func dumpdata() {
|
||||||
if reflectdata.ZeroSize > 0 {
|
if reflectdata.ZeroSize > 0 {
|
||||||
zero := base.PkgLinksym("go.map", "zero", obj.ABI0)
|
zero := base.PkgLinksym("go.map", "zero", obj.ABI0)
|
||||||
objw.Global(zero, int32(reflectdata.ZeroSize), obj.DUPOK|obj.RODATA)
|
objw.Global(zero, int32(reflectdata.ZeroSize), obj.DUPOK|obj.RODATA)
|
||||||
zero.Set(obj.AttrContentAddressable, true)
|
zero.Set(obj.AttrStatic, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
staticdata.WriteFuncSyms()
|
staticdata.WriteFuncSyms()
|
||||||
|
|
|
||||||
|
|
@ -6434,6 +6434,7 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym {
|
||||||
x := base.Ctxt.Lookup(fmt.Sprintf("%s.arginfo%d", f.LSym.Name, f.ABI))
|
x := base.Ctxt.Lookup(fmt.Sprintf("%s.arginfo%d", f.LSym.Name, f.ABI))
|
||||||
|
|
||||||
PtrSize := int64(types.PtrSize)
|
PtrSize := int64(types.PtrSize)
|
||||||
|
uintptrTyp := types.Types[types.TUINTPTR]
|
||||||
|
|
||||||
isAggregate := func(t *types.Type) bool {
|
isAggregate := func(t *types.Type) bool {
|
||||||
return t.IsStruct() || t.IsArray() || t.IsComplex() || t.IsInterface() || t.IsString() || t.IsSlice()
|
return t.IsStruct() || t.IsArray() || t.IsComplex() || t.IsInterface() || t.IsString() || t.IsSlice()
|
||||||
|
|
@ -6477,12 +6478,8 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym {
|
||||||
n := 0
|
n := 0
|
||||||
writebyte := func(o uint8) { wOff = objw.Uint8(x, wOff, o) }
|
writebyte := func(o uint8) { wOff = objw.Uint8(x, wOff, o) }
|
||||||
|
|
||||||
// Write one non-aggrgate arg/field/element if there is room.
|
// Write one non-aggrgate arg/field/element.
|
||||||
// Returns whether to continue.
|
write1 := func(sz, offset int64) {
|
||||||
write1 := func(sz, offset int64) bool {
|
|
||||||
if n >= limit {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if offset >= _special {
|
if offset >= _special {
|
||||||
writebyte(_offsetTooLarge)
|
writebyte(_offsetTooLarge)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -6490,7 +6487,6 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym {
|
||||||
writebyte(uint8(sz))
|
writebyte(uint8(sz))
|
||||||
}
|
}
|
||||||
n++
|
n++
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Visit t recursively and write it out.
|
// Visit t recursively and write it out.
|
||||||
|
|
@ -6498,10 +6494,12 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym {
|
||||||
var visitType func(baseOffset int64, t *types.Type, depth int) bool
|
var visitType func(baseOffset int64, t *types.Type, depth int) bool
|
||||||
visitType = func(baseOffset int64, t *types.Type, depth int) bool {
|
visitType = func(baseOffset int64, t *types.Type, depth int) bool {
|
||||||
if n >= limit {
|
if n >= limit {
|
||||||
|
writebyte(_dotdotdot)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if !isAggregate(t) {
|
if !isAggregate(t) {
|
||||||
return write1(t.Size(), baseOffset)
|
write1(t.Size(), baseOffset)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
writebyte(_startAgg)
|
writebyte(_startAgg)
|
||||||
depth++
|
depth++
|
||||||
|
|
@ -6511,58 +6509,47 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym {
|
||||||
n++
|
n++
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
var r bool
|
|
||||||
switch {
|
switch {
|
||||||
case t.IsInterface(), t.IsString():
|
case t.IsInterface(), t.IsString():
|
||||||
r = write1(PtrSize, baseOffset) &&
|
_ = visitType(baseOffset, uintptrTyp, depth) &&
|
||||||
write1(PtrSize, baseOffset+PtrSize)
|
visitType(baseOffset+PtrSize, uintptrTyp, depth)
|
||||||
case t.IsSlice():
|
case t.IsSlice():
|
||||||
r = write1(PtrSize, baseOffset) &&
|
_ = visitType(baseOffset, uintptrTyp, depth) &&
|
||||||
write1(PtrSize, baseOffset+PtrSize) &&
|
visitType(baseOffset+PtrSize, uintptrTyp, depth) &&
|
||||||
write1(PtrSize, baseOffset+PtrSize*2)
|
visitType(baseOffset+PtrSize*2, uintptrTyp, depth)
|
||||||
case t.IsComplex():
|
case t.IsComplex():
|
||||||
r = write1(t.Size()/2, baseOffset) &&
|
_ = visitType(baseOffset, types.FloatForComplex(t), depth) &&
|
||||||
write1(t.Size()/2, baseOffset+t.Size()/2)
|
visitType(baseOffset+t.Size()/2, types.FloatForComplex(t), depth)
|
||||||
case t.IsArray():
|
case t.IsArray():
|
||||||
r = true
|
|
||||||
if t.NumElem() == 0 {
|
if t.NumElem() == 0 {
|
||||||
n++ // {} counts as a component
|
n++ // {} counts as a component
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
for i := int64(0); i < t.NumElem(); i++ {
|
for i := int64(0); i < t.NumElem(); i++ {
|
||||||
if !visitType(baseOffset, t.Elem(), depth) {
|
if !visitType(baseOffset, t.Elem(), depth) {
|
||||||
r = false
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
baseOffset += t.Elem().Size()
|
baseOffset += t.Elem().Size()
|
||||||
}
|
}
|
||||||
case t.IsStruct():
|
case t.IsStruct():
|
||||||
r = true
|
|
||||||
if t.NumFields() == 0 {
|
if t.NumFields() == 0 {
|
||||||
n++ // {} counts as a component
|
n++ // {} counts as a component
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
for _, field := range t.Fields().Slice() {
|
for _, field := range t.Fields().Slice() {
|
||||||
if !visitType(baseOffset+field.Offset, field.Type, depth) {
|
if !visitType(baseOffset+field.Offset, field.Type, depth) {
|
||||||
r = false
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !r {
|
|
||||||
writebyte(_dotdotdot)
|
|
||||||
}
|
|
||||||
writebyte(_endAgg)
|
writebyte(_endAgg)
|
||||||
return r
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
c := true
|
|
||||||
for _, a := range abiInfo.InParams() {
|
for _, a := range abiInfo.InParams() {
|
||||||
if !c {
|
if !visitType(a.FrameOffset(abiInfo), a.Type, 0) {
|
||||||
writebyte(_dotdotdot)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
c = visitType(a.FrameOffset(abiInfo), a.Type, 0)
|
|
||||||
}
|
}
|
||||||
writebyte(_endSeq)
|
writebyte(_endSeq)
|
||||||
if wOff > maxLen {
|
if wOff > maxLen {
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,17 @@ func Export(n *ir.Name) {
|
||||||
// Redeclared emits a diagnostic about symbol s being redeclared at pos.
|
// Redeclared emits a diagnostic about symbol s being redeclared at pos.
|
||||||
func Redeclared(pos src.XPos, s *types.Sym, where string) {
|
func Redeclared(pos src.XPos, s *types.Sym, where string) {
|
||||||
if !s.Lastlineno.IsKnown() {
|
if !s.Lastlineno.IsKnown() {
|
||||||
pkgName := DotImportRefs[s.Def.(*ir.Ident)]
|
var pkgName *ir.PkgName
|
||||||
|
if s.Def == nil {
|
||||||
|
for id, pkg := range DotImportRefs {
|
||||||
|
if id.Sym().Name == s.Name {
|
||||||
|
pkgName = pkg
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pkgName = DotImportRefs[s.Def.(*ir.Ident)]
|
||||||
|
}
|
||||||
base.ErrorfAt(pos, "%v redeclared %s\n"+
|
base.ErrorfAt(pos, "%v redeclared %s\n"+
|
||||||
"\t%v: previous declaration during import %q", s, where, base.FmtPos(pkgName.Pos()), pkgName.Pkg.Path)
|
"\t%v: previous declaration during import %q", s, where, base.FmtPos(pkgName.Pos()), pkgName.Pkg.Path)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1741,7 +1741,7 @@ func (r *importReader) exprsOrNil() (a, b ir.Node) {
|
||||||
func builtinCall(pos src.XPos, op ir.Op) *ir.CallExpr {
|
func builtinCall(pos src.XPos, op ir.Op) *ir.CallExpr {
|
||||||
if go117ExportTypes {
|
if go117ExportTypes {
|
||||||
// These should all be encoded as direct ops, not OCALL.
|
// These should all be encoded as direct ops, not OCALL.
|
||||||
base.Fatalf("builtinCall should not be invoked when types are included in inport/export")
|
base.Fatalf("builtinCall should not be invoked when types are included in import/export")
|
||||||
}
|
}
|
||||||
return ir.NewCallExpr(pos, ir.OCALL, ir.NewIdent(base.Pos, types.BuiltinPkg.Lookup(ir.OpNames[op])), nil)
|
return ir.NewCallExpr(pos, ir.OCALL, ir.NewIdent(base.Pos, types.BuiltinPkg.Lookup(ir.OpNames[op])), nil)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1193,7 +1193,7 @@
|
||||||
// and one of its requirements. Each module is identified as a string of the form
|
// and one of its requirements. Each module is identified as a string of the form
|
||||||
// path@version, except for the main module, which has no @version suffix.
|
// path@version, except for the main module, which has no @version suffix.
|
||||||
//
|
//
|
||||||
// The -go flag causes graph to report the module graph as loaded by by the
|
// The -go flag causes graph to report the module graph as loaded by the
|
||||||
// given Go version, instead of the version indicated by the 'go' directive
|
// given Go version, instead of the version indicated by the 'go' directive
|
||||||
// in the go.mod file.
|
// in the go.mod file.
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ in text form. Each line in the output has two space-separated fields: a module
|
||||||
and one of its requirements. Each module is identified as a string of the form
|
and one of its requirements. Each module is identified as a string of the form
|
||||||
path@version, except for the main module, which has no @version suffix.
|
path@version, except for the main module, which has no @version suffix.
|
||||||
|
|
||||||
The -go flag causes graph to report the module graph as loaded by by the
|
The -go flag causes graph to report the module graph as loaded by the
|
||||||
given Go version, instead of the version indicated by the 'go' directive
|
given Go version, instead of the version indicated by the 'go' directive
|
||||||
in the go.mod file.
|
in the go.mod file.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1808,7 +1808,7 @@ func (ld *loader) checkTidyCompatibility(ctx context.Context, rs *Requirements)
|
||||||
fmt.Fprintf(os.Stderr, "If reproducibility with go %s is not needed:\n\tgo mod tidy%s -compat=%s\n", ld.TidyCompatibleVersion, goFlag, ld.GoVersion)
|
fmt.Fprintf(os.Stderr, "If reproducibility with go %s is not needed:\n\tgo mod tidy%s -compat=%s\n", ld.TidyCompatibleVersion, goFlag, ld.GoVersion)
|
||||||
|
|
||||||
// TODO(#46141): Populate the linked wiki page.
|
// TODO(#46141): Populate the linked wiki page.
|
||||||
fmt.Fprintf(os.Stderr, "For other options, see:\n\thttps://golang.org/wiki/PruningModules\n")
|
fmt.Fprintf(os.Stderr, "For other options, see:\n\thttps://golang.org/doc/modules/pruning\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
mg, err := rs.Graph(ctx)
|
mg, err := rs.Graph(ctx)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ cp go.mod go.mod.orig
|
||||||
|
|
||||||
stderr '^example\.com/m imports\n\texample\.net/indirect imports\n\texample\.net/ambiguous/nested/pkg loaded from example\.net/ambiguous/nested@v0\.1\.0,\n\tbut go 1.16 would fail to locate it:\n\tambiguous import: found package example\.net/ambiguous/nested/pkg in multiple modules:\n\texample\.net/ambiguous v0.1.0 \(.*\)\n\texample\.net/ambiguous/nested v0.1.0 \(.*\)\n\n'
|
stderr '^example\.com/m imports\n\texample\.net/indirect imports\n\texample\.net/ambiguous/nested/pkg loaded from example\.net/ambiguous/nested@v0\.1\.0,\n\tbut go 1.16 would fail to locate it:\n\tambiguous import: found package example\.net/ambiguous/nested/pkg in multiple modules:\n\texample\.net/ambiguous v0.1.0 \(.*\)\n\texample\.net/ambiguous/nested v0.1.0 \(.*\)\n\n'
|
||||||
|
|
||||||
stderr '\n\nTo proceed despite packages unresolved in go 1\.16:\n\tgo mod tidy -e\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1\.17\nFor other options, see:\n\thttps://golang\.org/wiki/PruningModules\n'
|
stderr '\n\nTo proceed despite packages unresolved in go 1\.16:\n\tgo mod tidy -e\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1\.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
|
||||||
|
|
||||||
cmp go.mod go.mod.orig
|
cmp go.mod go.mod.orig
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ cp go.mod go.mod.orig
|
||||||
|
|
||||||
stderr '^example\.com/m imports\n\texample\.net/deleted loaded from example\.net/deleted@v0\.1\.0,\n\tbut go 1\.16 would fail to locate it in example\.net/deleted@v0\.2\.0\n\n'
|
stderr '^example\.com/m imports\n\texample\.net/deleted loaded from example\.net/deleted@v0\.1\.0,\n\tbut go 1\.16 would fail to locate it in example\.net/deleted@v0\.2\.0\n\n'
|
||||||
|
|
||||||
stderr '\n\nTo upgrade to the versions selected by go 1.16, leaving some packages unresolved:\n\tgo mod tidy -e -go=1\.16 && go mod tidy -e -go=1\.17\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1\.17\nFor other options, see:\n\thttps://golang\.org/wiki/PruningModules\n'
|
stderr '\n\nTo upgrade to the versions selected by go 1.16, leaving some packages unresolved:\n\tgo mod tidy -e -go=1\.16 && go mod tidy -e -go=1\.17\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1\.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
|
||||||
|
|
||||||
|
|
||||||
# The suggested 'go mod tidy -e' command should proceed anyway.
|
# The suggested 'go mod tidy -e' command should proceed anyway.
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ env MODFMT='{{with .Module}}{{.Path}} {{.Version}}{{end}}'
|
||||||
cp go.mod go.mod.orig
|
cp go.mod go.mod.orig
|
||||||
! go mod tidy
|
! go mod tidy
|
||||||
stderr '^example\.com/m imports\n\texample\.net/lazy tested by\n\texample\.net/lazy.test imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
|
stderr '^example\.com/m imports\n\texample\.net/lazy tested by\n\texample\.net/lazy.test imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
|
||||||
stderr '\n\nTo upgrade to the versions selected by go 1\.16:\n\tgo mod tidy -go=1\.16 && go mod tidy -go=1\.17\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1.17\nFor other options, see:\n\thttps://golang\.org/wiki/PruningModules\n'
|
stderr '\n\nTo upgrade to the versions selected by go 1\.16:\n\tgo mod tidy -go=1\.16 && go mod tidy -go=1\.17\nIf reproducibility with go 1.16 is not needed:\n\tgo mod tidy -compat=1.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
|
||||||
|
|
||||||
cmp go.mod go.mod.orig
|
cmp go.mod go.mod.orig
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ env MODFMT='{{with .Module}}{{.Path}} {{.Version}}{{end}}'
|
||||||
cp go.mod go.mod.orig
|
cp go.mod go.mod.orig
|
||||||
! go mod tidy
|
! go mod tidy
|
||||||
stderr '^example\.com/m imports\n\texample\.net/lazy imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
|
stderr '^example\.com/m imports\n\texample\.net/lazy imports\n\texample\.com/retract/incompatible loaded from example\.com/retract/incompatible@v1\.0\.0,\n\tbut go 1\.16 would select v2\.0\.0\+incompatible\n\n'
|
||||||
stderr '\n\nTo upgrade to the versions selected by go 1\.16:\n\tgo mod tidy -go=1\.16 && go mod tidy -go=1\.17\nIf reproducibility with go 1\.16 is not needed:\n\tgo mod tidy -compat=1.17\nFor other options, see:\n\thttps://golang\.org/wiki/PruningModules\n'
|
stderr '\n\nTo upgrade to the versions selected by go 1\.16:\n\tgo mod tidy -go=1\.16 && go mod tidy -go=1\.17\nIf reproducibility with go 1\.16 is not needed:\n\tgo mod tidy -compat=1.17\nFor other options, see:\n\thttps://golang\.org/doc/modules/pruning\n'
|
||||||
|
|
||||||
cmp go.mod go.mod.orig
|
cmp go.mod go.mod.orig
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -459,6 +459,15 @@ func (st *loadState) addSym(name string, ver int, r *oReader, li uint32, kind in
|
||||||
if l.flags&FlagStrictDups != 0 {
|
if l.flags&FlagStrictDups != 0 {
|
||||||
l.checkdup(name, r, li, oldi)
|
l.checkdup(name, r, li, oldi)
|
||||||
}
|
}
|
||||||
|
// Fix for issue #47185 -- given two dupok symbols with
|
||||||
|
// different sizes, favor symbol with larger size. See
|
||||||
|
// also issue #46653.
|
||||||
|
szdup := l.SymSize(oldi)
|
||||||
|
sz := int64(r.Sym(li).Siz())
|
||||||
|
if szdup < sz {
|
||||||
|
// new symbol overwrites old symbol.
|
||||||
|
l.objSyms[oldi] = objSym{r.objidx, li}
|
||||||
|
}
|
||||||
return oldi
|
return oldi
|
||||||
}
|
}
|
||||||
oldr, oldli := l.toLocal(oldi)
|
oldr, oldli := l.toLocal(oldi)
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,11 @@ func (ka rsaKeyAgreement) generateClientKeyExchange(config *Config, clientHello
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
encrypted, err := rsa.EncryptPKCS1v15(config.rand(), cert.PublicKey.(*rsa.PublicKey), preMasterSecret)
|
rsaKey, ok := cert.PublicKey.(*rsa.PublicKey)
|
||||||
|
if !ok {
|
||||||
|
return nil, nil, errors.New("tls: server certificate contains incorrect key type for selected ciphersuite")
|
||||||
|
}
|
||||||
|
encrypted, err := rsa.EncryptPKCS1v15(config.rand(), rsaKey, preMasterSecret)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,4 @@ package build
|
||||||
// Do not remove from this list, as these are used for go/build filename matching.
|
// Do not remove from this list, as these are used for go/build filename matching.
|
||||||
|
|
||||||
const goosList = "aix android darwin dragonfly freebsd hurd illumos ios js linux nacl netbsd openbsd plan9 solaris windows zos "
|
const goosList = "aix android darwin dragonfly freebsd hurd illumos ios js linux nacl netbsd openbsd plan9 solaris windows zos "
|
||||||
const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc riscv riscv64 s390 s390x sparc sparc64 wasm "
|
const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le loong64 mips mipsle mips64 mips64le mips64p32 mips64p32le ppc riscv riscv64 s390 s390x sparc sparc64 wasm "
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 1
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 1
|
const IsArm64be = 1
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
33
src/internal/goarch/zgoarch_loong64.go
Normal file
33
src/internal/goarch/zgoarch_loong64.go
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Code generated by gengoarch.go using 'go generate'. DO NOT EDIT.
|
||||||
|
|
||||||
|
//go:build loong64
|
||||||
|
// +build loong64
|
||||||
|
|
||||||
|
package goarch
|
||||||
|
|
||||||
|
const GOARCH = `loong64`
|
||||||
|
|
||||||
|
const Is386 = 0
|
||||||
|
const IsAmd64 = 0
|
||||||
|
const IsAmd64p32 = 0
|
||||||
|
const IsArm = 0
|
||||||
|
const IsArmbe = 0
|
||||||
|
const IsArm64 = 0
|
||||||
|
const IsArm64be = 0
|
||||||
|
const IsPpc64 = 0
|
||||||
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 1
|
||||||
|
const IsMips = 0
|
||||||
|
const IsMipsle = 0
|
||||||
|
const IsMips64 = 0
|
||||||
|
const IsMips64le = 0
|
||||||
|
const IsMips64p32 = 0
|
||||||
|
const IsMips64p32le = 0
|
||||||
|
const IsPpc = 0
|
||||||
|
const IsRiscv = 0
|
||||||
|
const IsRiscv64 = 0
|
||||||
|
const IsS390 = 0
|
||||||
|
const IsS390x = 0
|
||||||
|
const IsSparc = 0
|
||||||
|
const IsSparc64 = 0
|
||||||
|
const IsWasm = 0
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 1
|
const IsMips = 1
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 1
|
const IsMips64 = 1
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 1
|
const IsMipsle = 1
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 1
|
const IsPpc64 = 1
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 1
|
const IsPpc64le = 1
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ const IsArm64 = 0
|
||||||
const IsArm64be = 0
|
const IsArm64be = 0
|
||||||
const IsPpc64 = 0
|
const IsPpc64 = 0
|
||||||
const IsPpc64le = 0
|
const IsPpc64le = 0
|
||||||
|
const IsLoong64 = 0
|
||||||
const IsMips = 0
|
const IsMips = 0
|
||||||
const IsMipsle = 0
|
const IsMipsle = 0
|
||||||
const IsMips64 = 0
|
const IsMips64 = 0
|
||||||
|
|
|
||||||
|
|
@ -951,7 +951,7 @@ func (c *Client) CloseIdleConnections() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// cancelTimerBody is an io.ReadCloser that wraps rc with two features:
|
// cancelTimerBody is an io.ReadCloser that wraps rc with two features:
|
||||||
// 1) on Read error or close, the stop func is called.
|
// 1) On Read error or close, the stop func is called.
|
||||||
// 2) On Read failure, if reqDidTimeout is true, the error is wrapped and
|
// 2) On Read failure, if reqDidTimeout is true, the error is wrapped and
|
||||||
// marked as net.Error that hit its timeout.
|
// marked as net.Error that hit its timeout.
|
||||||
type cancelTimerBody struct {
|
type cancelTimerBody struct {
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,17 @@ func TestMemoryProfiler(t *testing.T) {
|
||||||
|
|
||||||
runtime.GC() // materialize stats
|
runtime.GC() // materialize stats
|
||||||
|
|
||||||
|
// TODO(mknyszek): Fix #45315 and remove this extra call.
|
||||||
|
//
|
||||||
|
// Unfortunately, it's possible for the sweep termination condition
|
||||||
|
// to flap, so with just one runtime.GC call, a freed object could be
|
||||||
|
// missed, leading this test to fail. A second call reduces the chance
|
||||||
|
// of this happening to zero, because sweeping actually has to finish
|
||||||
|
// to move on to the next GC, during which nothing will happen.
|
||||||
|
//
|
||||||
|
// See #46500 for more details.
|
||||||
|
runtime.GC()
|
||||||
|
|
||||||
memoryProfilerRun++
|
memoryProfilerRun++
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ func TestTracebackArgs(t *testing.T) {
|
||||||
}{
|
}{
|
||||||
// simple ints
|
// simple ints
|
||||||
{
|
{
|
||||||
func() int { return testTracebackArgs1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) },
|
func() int { return testTracebackArgs1(1, 2, 3, 4, 5) },
|
||||||
"testTracebackArgs1(0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, ...)",
|
"testTracebackArgs1(0x1, 0x2, 0x3, 0x4, 0x5)",
|
||||||
},
|
},
|
||||||
// some aggregates
|
// some aggregates
|
||||||
{
|
{
|
||||||
|
|
@ -53,6 +53,58 @@ func TestTracebackArgs(t *testing.T) {
|
||||||
},
|
},
|
||||||
"testTracebackArgs5(0x0, {0x1, {}, {{}, {}}}, {}, {}, {}, {}, {}, ...)",
|
"testTracebackArgs5(0x0, {0x1, {}, {{}, {}}}, {}, {}, {}, {}, {}, ...)",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// edge cases for ...
|
||||||
|
// no ... for 10 args
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs6a(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) },
|
||||||
|
"testTracebackArgs6a(0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa)",
|
||||||
|
},
|
||||||
|
// has ... for 11 args
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs6b(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) },
|
||||||
|
"testTracebackArgs6b(0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, ...)",
|
||||||
|
},
|
||||||
|
// no ... for aggregates with 10 words
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs7a([10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) },
|
||||||
|
"testTracebackArgs7a({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa})",
|
||||||
|
},
|
||||||
|
// has ... for aggregates with 11 words
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs7b([11]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}) },
|
||||||
|
"testTracebackArgs7b({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, ...})",
|
||||||
|
},
|
||||||
|
// no ... for aggregates, but with more args
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs7c([10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 11) },
|
||||||
|
"testTracebackArgs7c({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa}, ...)",
|
||||||
|
},
|
||||||
|
// has ... for aggregates and also for more args
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs7d([11]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 12) },
|
||||||
|
"testTracebackArgs7d({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, ...}, ...)",
|
||||||
|
},
|
||||||
|
// nested aggregates, no ...
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs8a(testArgsType8a{1, 2, 3, 4, 5, 6, 7, 8, [2]int{9, 10}}) },
|
||||||
|
"testTracebackArgs8a({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, {0x9, 0xa}})",
|
||||||
|
},
|
||||||
|
// nested aggregates, ... in inner but not outer
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs8b(testArgsType8b{1, 2, 3, 4, 5, 6, 7, 8, [3]int{9, 10, 11}}) },
|
||||||
|
"testTracebackArgs8b({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, {0x9, 0xa, ...}})",
|
||||||
|
},
|
||||||
|
// nested aggregates, ... in outer but not inner
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs8c(testArgsType8c{1, 2, 3, 4, 5, 6, 7, 8, [2]int{9, 10}, 11}) },
|
||||||
|
"testTracebackArgs8c({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, {0x9, 0xa}, ...})",
|
||||||
|
},
|
||||||
|
// nested aggregates, ... in both inner and outer
|
||||||
|
{
|
||||||
|
func() int { return testTracebackArgs8d(testArgsType8d{1, 2, 3, 4, 5, 6, 7, 8, [3]int{9, 10, 11}, 12}) },
|
||||||
|
"testTracebackArgs8d({0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, {0x9, 0xa, ...}, ...})",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
n := test.fn()
|
n := test.fn()
|
||||||
|
|
@ -64,11 +116,11 @@ func TestTracebackArgs(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:noinline
|
//go:noinline
|
||||||
func testTracebackArgs1(a, b, c, d, e, f, g, h, i, j, k, l int) int {
|
func testTracebackArgs1(a, b, c, d, e int) int {
|
||||||
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
if a < 0 {
|
if a < 0 {
|
||||||
// use in-reg args to keep them alive
|
// use in-reg args to keep them alive
|
||||||
return a + b + c + d + e + f + g + h + i + j + k + l
|
return a + b + c + d + e
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
@ -119,3 +171,122 @@ func testTracebackArgs5(a bool, x struct {
|
||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs6a(a, b, c, d, e, f, g, h, i, j int) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a + b + c + d + e + f + g + h + i + j
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs6b(a, b, c, d, e, f, g, h, i, j, k int) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a + b + c + d + e + f + g + h + i + j + k
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs7a(a [10]int) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a[0] < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9]
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs7b(a [11]int) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a[0] < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9] + a[10]
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs7c(a [10]int, b int) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a[0] < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9] + b
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs7d(a [11]int, b int) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a[0] < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9] + a[10] + b
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
type testArgsType8a struct {
|
||||||
|
a, b, c, d, e, f, g, h int
|
||||||
|
i [2]int
|
||||||
|
}
|
||||||
|
type testArgsType8b struct {
|
||||||
|
a, b, c, d, e, f, g, h int
|
||||||
|
i [3]int
|
||||||
|
}
|
||||||
|
type testArgsType8c struct {
|
||||||
|
a, b, c, d, e, f, g, h int
|
||||||
|
i [2]int
|
||||||
|
j int
|
||||||
|
}
|
||||||
|
type testArgsType8d struct {
|
||||||
|
a, b, c, d, e, f, g, h int
|
||||||
|
i [3]int
|
||||||
|
j int
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs8a(a testArgsType8a) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a.a < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a.b + a.c + a.d + a.e + a.f + a.g + a.h + a.i[0] + a.i[1]
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs8b(a testArgsType8b) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a.a < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a.b + a.c + a.d + a.e + a.f + a.g + a.h + a.i[0] + a.i[1] + a.i[2]
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs8c(a testArgsType8c) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a.a < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a.b + a.c + a.d + a.e + a.f + a.g + a.h + a.i[0] + a.i[1] + a.j
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:noinline
|
||||||
|
func testTracebackArgs8d(a testArgsType8d) int {
|
||||||
|
n := runtime.Stack(testTracebackArgsBuf[:], false)
|
||||||
|
if a.a < 0 {
|
||||||
|
// use in-reg args to keep them alive
|
||||||
|
return a.b + a.c + a.d + a.e + a.f + a.g + a.h + a.i[0] + a.i[1] + a.i[2] + a.j
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -233,6 +233,8 @@
|
||||||
// os.Exit(m.Run())
|
// os.Exit(m.Run())
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
|
// TestMain is a low-level primitive and should not be necessary for casual
|
||||||
|
// testing needs, where ordinary test functions suffice.
|
||||||
package testing
|
package testing
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ import (
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A source position is represented by a Position value.
|
// Position is a value that represents a source position.
|
||||||
// A position is valid if Line > 0.
|
// A position is valid if Line > 0.
|
||||||
type Position struct {
|
type Position struct {
|
||||||
Filename string // filename, if any
|
Filename string // filename, if any
|
||||||
|
|
|
||||||
|
|
@ -1334,7 +1334,7 @@ func UnixMilli(msec int64) Time {
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnixMicro returns the local Time corresponding to the given Unix time,
|
// UnixMicro returns the local Time corresponding to the given Unix time,
|
||||||
// usec milliseconds since January 1, 1970 UTC.
|
// usec microseconds since January 1, 1970 UTC.
|
||||||
func UnixMicro(usec int64) Time {
|
func UnixMicro(usec int64) Time {
|
||||||
return Unix(usec/1e6, (usec%1e6)*1e3)
|
return Unix(usec/1e6, (usec%1e6)*1e3)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ func BenchmarkRegexpMatchEasy0_32(b *testing.B) { benchmark(b, easy0, 32<<0) }
|
||||||
func BenchmarkRegexpMatchEasy0_1K(b *testing.B) { benchmark(b, easy0, 1<<10) }
|
func BenchmarkRegexpMatchEasy0_1K(b *testing.B) { benchmark(b, easy0, 1<<10) }
|
||||||
func BenchmarkRegexpMatchEasy1_32(b *testing.B) { benchmark(b, easy1, 32<<0) }
|
func BenchmarkRegexpMatchEasy1_32(b *testing.B) { benchmark(b, easy1, 32<<0) }
|
||||||
func BenchmarkRegexpMatchEasy1_1K(b *testing.B) { benchmark(b, easy1, 1<<10) }
|
func BenchmarkRegexpMatchEasy1_1K(b *testing.B) { benchmark(b, easy1, 1<<10) }
|
||||||
func BenchmarkRegexpMatchMedium_32(b *testing.B) { benchmark(b, medium, 1<<0) }
|
func BenchmarkRegexpMatchMedium_32(b *testing.B) { benchmark(b, medium, 32<<0) }
|
||||||
func BenchmarkRegexpMatchMedium_1K(b *testing.B) { benchmark(b, medium, 1<<10) }
|
func BenchmarkRegexpMatchMedium_1K(b *testing.B) { benchmark(b, medium, 1<<10) }
|
||||||
func BenchmarkRegexpMatchHard_32(b *testing.B) { benchmark(b, hard, 32<<0) }
|
func BenchmarkRegexpMatchHard_32(b *testing.B) { benchmark(b, hard, 32<<0) }
|
||||||
func BenchmarkRegexpMatchHard_1K(b *testing.B) { benchmark(b, hard, 1<<10) }
|
func BenchmarkRegexpMatchHard_1K(b *testing.B) { benchmark(b, hard, 1<<10) }
|
||||||
|
|
|
||||||
72
test/fixedbugs/issue47185.dir/bad/bad.go
Normal file
72
test/fixedbugs/issue47185.dir/bad/bad.go
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
// 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 a
|
||||||
|
|
||||||
|
// Note that the use of CGO here is solely to trigger external
|
||||||
|
// linking, since that is required to trigger that bad behavior
|
||||||
|
// in this bug.
|
||||||
|
|
||||||
|
// #include <stdlib.h>
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
func Bad() {
|
||||||
|
m := make(map[int64]A)
|
||||||
|
a := m[0]
|
||||||
|
if len(a.B.C1.D2.E2.F1) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F2) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F3) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F4) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F5) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F6) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F7) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F8) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F9) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F10) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F11) != 0 ||
|
||||||
|
len(a.B.C1.D2.E2.F16) != 0 {
|
||||||
|
panic("bad")
|
||||||
|
}
|
||||||
|
C.malloc(100)
|
||||||
|
}
|
||||||
|
|
||||||
|
type A struct {
|
||||||
|
B
|
||||||
|
}
|
||||||
|
|
||||||
|
type B struct {
|
||||||
|
C1 C
|
||||||
|
C2 C
|
||||||
|
}
|
||||||
|
|
||||||
|
type C struct {
|
||||||
|
D1 D
|
||||||
|
D2 D
|
||||||
|
}
|
||||||
|
|
||||||
|
type D struct {
|
||||||
|
E1 E
|
||||||
|
E2 E
|
||||||
|
E3 E
|
||||||
|
E4 E
|
||||||
|
}
|
||||||
|
|
||||||
|
type E struct {
|
||||||
|
F1 string
|
||||||
|
F2 string
|
||||||
|
F3 string
|
||||||
|
F4 string
|
||||||
|
F5 string
|
||||||
|
F6 string
|
||||||
|
F7 string
|
||||||
|
F8 string
|
||||||
|
F9 string
|
||||||
|
F10 string
|
||||||
|
F11 string
|
||||||
|
F12 string
|
||||||
|
F13 string
|
||||||
|
F14 string
|
||||||
|
F15 string
|
||||||
|
F16 string
|
||||||
|
}
|
||||||
28
test/fixedbugs/issue47185.dir/main.go
Normal file
28
test/fixedbugs/issue47185.dir/main.go
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
// 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 (
|
||||||
|
bad "issue47185.dir/bad"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
another()
|
||||||
|
bad.Bad()
|
||||||
|
}
|
||||||
|
|
||||||
|
func another() L {
|
||||||
|
m := make(map[string]L)
|
||||||
|
return m[""]
|
||||||
|
}
|
||||||
|
|
||||||
|
type L struct {
|
||||||
|
A Data
|
||||||
|
B Data
|
||||||
|
}
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
F1 [22][]string
|
||||||
|
}
|
||||||
11
test/fixedbugs/issue47185.go
Normal file
11
test/fixedbugs/issue47185.go
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
// +build cgo
|
||||||
|
// runindir
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// Another test to verify compiler and linker handling of multiple
|
||||||
|
// competing map.zero symbol definitions.
|
||||||
|
|
||||||
|
package ignored
|
||||||
13
test/fixedbugs/issue47201.dir/a.go
Normal file
13
test/fixedbugs/issue47201.dir/a.go
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
// 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"
|
||||||
|
)
|
||||||
|
|
||||||
|
func test() {
|
||||||
|
Println("foo")
|
||||||
|
}
|
||||||
9
test/fixedbugs/issue47201.dir/b.go
Normal file
9
test/fixedbugs/issue47201.dir/b.go
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
// 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
|
||||||
|
|
||||||
|
func Println() {} // ERROR "Println redeclared in this block"
|
||||||
|
|
||||||
|
func main() {}
|
||||||
7
test/fixedbugs/issue47201.go
Normal file
7
test/fixedbugs/issue47201.go
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
// errorcheckdir
|
||||||
|
|
||||||
|
// 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 ignored
|
||||||
|
|
@ -2151,6 +2151,7 @@ var types2Failures = setOf(
|
||||||
"fixedbugs/issue4232.go", // types2 reports (correct) extra errors
|
"fixedbugs/issue4232.go", // types2 reports (correct) extra errors
|
||||||
"fixedbugs/issue4452.go", // types2 reports (correct) extra errors
|
"fixedbugs/issue4452.go", // types2 reports (correct) extra errors
|
||||||
"fixedbugs/issue4510.go", // types2 reports different (but ok) line numbers
|
"fixedbugs/issue4510.go", // types2 reports different (but ok) line numbers
|
||||||
|
"fixedbugs/issue47201.go", // types2 spells the error message differently
|
||||||
"fixedbugs/issue5609.go", // types2 needs a better error message
|
"fixedbugs/issue5609.go", // types2 needs a better error message
|
||||||
"fixedbugs/issue7525b.go", // types2 reports init cycle error on different line - ok otherwise
|
"fixedbugs/issue7525b.go", // types2 reports init cycle error on different line - ok otherwise
|
||||||
"fixedbugs/issue7525c.go", // types2 reports init cycle error on different line - ok otherwise
|
"fixedbugs/issue7525c.go", // types2 reports init cycle error on different line - ok otherwise
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue