1. 25 Sep, 2019 7 commits
  2. 24 Sep, 2019 15 commits
    • Alan Donovan's avatar
      log: mention names of flag constants in {Set,}Flags doc comments · 54776230
      Alan Donovan authored
      Change-Id: I1217f07530dc7586fd7b933bc6a65bad163782db
      Reviewed-on: https://go-review.googlesource.com/c/go/+/47232Reviewed-by: default avatarAndrew Bonventre <andybons@golang.org>
      Run-TryBot: Andrew Bonventre <andybons@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      54776230
    • Jeremy Faller's avatar
      cmd/compile: generate debug_lines in compiler · ee3dded3
      Jeremy Faller authored
      This is mostly a copy-paste jobs from the linker to generate the debug
      information in the compiler instead of the linker. The new data is
      inserted into the debug line numbers symbol defined in CL 188238.
      
      Generating the debug information BEFORE deadcode results in one subtle
      difference, and that is that the state machine needs to be reset at the
      end of every function's debug line table. The reasoning is that
      generating the table AFTER dead code allows the producer and consumer of
      the table to agree on the state of the state machine, and since these
      blocks will (eventually) be concatenated in the linker, we don't KNOW
      the state of the state machine unless we reset it. So,
      generateDebugLinesSymbol resets the state machine at the end of every
      function.
      
      Right now, we don't do anything with this line information, or the file
      table -- we just populate the symbols.
      
      Change-Id: If9103eda6cc5f1f7a11e7e1a97184a060a4ad7fb
      Reviewed-on: https://go-review.googlesource.com/c/go/+/188317
      Run-TryBot: Jeremy Faller <jeremy@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAustin Clements <austin@google.com>
      ee3dded3
    • Jeremy Faller's avatar
      cmd/link: add notion of multiple compilation units per package · 78a37347
      Jeremy Faller authored
      As we move the debug_line generation into the compiler, we need to
      upgrade the notion of compilationUnit to not just be on a per package
      basis.  That won't be the case as it will be impossible for all
      compilationUnits to have the same set of files names used to build the
      debug_lines table. (For example, assembled files in a package don't know
      about any files but themselves, so the debug_lines table could only
      reference themseves. As such, we need to break the 1:1 relationship
      between compUnit and package.)
      
      Change-Id: I2e517bb6c01de0115bbf777af828a2fe59c09ce8
      Reviewed-on: https://go-review.googlesource.com/c/go/+/189618
      Run-TryBot: Jeremy Faller <jeremy@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAustin Clements <austin@google.com>
      Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
      78a37347
    • Lynn Boger's avatar
      crypto/cipher: improve xorBytesVSX asm for ppc64x · d979ac33
      Lynn Boger authored
      This improves the performance of xorBytesVSX in crypto/cipher by
      unrolling the loop that does the stores. Improvement on power9:
      
      name                 old time/op    new time/op    delta
      XORBytes/8Bytes        17.9ns ± 0%    18.2ns ± 0%   +1.53%  (p=0.029 n=4+4)
      XORBytes/128Bytes      24.4ns ± 0%    22.5ns ± 0%   -7.79%  (p=0.029 n=4+4)
      XORBytes/2048Bytes      131ns ± 0%     109ns ± 0%  -16.79%  (p=0.029 n=4+4)
      XORBytes/32768Bytes    1.74µs ± 0%    1.43µs ± 8%  -18.04%  (p=0.029 n=4+4)
      
      Change-Id: I75bd625d3ae9daa7bda54c523028671ab036b13d
      Reviewed-on: https://go-review.googlesource.com/c/go/+/197058
      Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarCarlos Eduardo Seo <cseo@linux.vnet.ibm.com>
      d979ac33
    • Bryan C. Mills's avatar
      cmd/go: suppress errors in package-to-module queries if the package is already found · a3426f25
      Bryan C. Mills authored
      In CL 173017, I changed the package-to-module query logic to query all
      possible module paths in parallel in order to reduce latency. (For
      long package paths, most such paths will not exist and will fail with
      little overhead.)
      
      The module resolution algorithm treats various kinds of non-existence
      as “soft errors”, to be reported only if package resolution fails, but
      treats any remaining errors as hard errors that should fail the query.
      
      Unfortunately, that interacted badly with the +incompatible version
      validation added in CL 181881, causing a regression in the 'direct'
      fetch path for modules using the “major branch” layout¹ with a post-v1
      version on the repository's default branch. Because we did not
      interpret a mismatched module path as “no such module”, a go.mod file
      specifying the path 'example.com/foo/v2' would cause the search for
      module 'example.com/foo' to error out. (That regression was not caught
      ahead of time due to a lack of test coverage for 'go get' on a package
      within a /vN module.)
      
      The promotion of hard errors during parallel search also made the 'go'
      command less tolerant of servers that advertise 'go-import' tags for
      nonexistent repositories. CL 194561 mitigated that problem for HTTP
      servers that return code 404 or 410 for a nonexistent repository, but
      unfortunately a few servers in common use (notably GitLab and
      pre-1.9.3 releases of Gitea) do not.
      
      This change mitigates both of those failure modes by ignoring
      “miscellaneous” errors from shorter module paths if the requested
      package pattern was successfully matched against a module with a
      longer path.
      
      ¹https://research.swtch.com/vgo-module#from_repository_to_modules
      
      Updates #34383
      Updates #34094
      
      Change-Id: If37dc422e973eba13f3a3aeb68bc7b96e2d7f73d
      Reviewed-on: https://go-review.googlesource.com/c/go/+/197059
      Run-TryBot: Bryan C. Mills <bcmills@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarJay Conrod <jayconrod@google.com>
      a3426f25
    • Martin Möhrmann's avatar
      compile: prefer an AND instead of SHR+SHL instructions · f41451e7
      Martin Möhrmann authored
      On modern 64bit CPUs a SHR, SHL or AND instruction take 1 cycle to execute.
      A pair of shifts that operate on the same register will take 2 cycles
      and needs to wait for the input register value to be available.
      
      Large constants used to mask the high bits of a register with an AND
      instruction can not be encoded as an immediate in the AND instruction
      on amd64 and therefore need to be loaded into a register with a MOV
      instruction.
      
      However that MOV instruction is not dependent on the output register and
      on many CPUs does not compete with the AND or shift instructions for
      execution ports.
      
      Using a pair of shifts to mask high bits instead of an AND to mask high
      bits of a register has a shorter encoding and uses one less general
      purpose register but is slower due to taking one clock cycle longer
      if there is no register pressure that would make the AND variant need to
      generate a spill.
      
      For example the instructions emitted for (x & 1 << 63) before this CL are:
      48c1ea3f                SHRQ $0x3f, DX
      48c1e23f                SHLQ $0x3f, DX
      
      after this CL the instructions are the same as GCC and LLVM use:
      48b80000000000000080    MOVQ $0x8000000000000000, AX
      4821d0                  ANDQ DX, AX
      
      Some platforms such as arm64 already have SSA optimization rules to fuse
      two shift instructions back into an AND.
      
      Removing the general rule to rewrite AND to SHR+SHL speeds up this benchmark:
      
          var GlobalU uint
      
          func BenchmarkAndHighBits(b *testing.B) {
              x := uint(0)
              for i := 0; i < b.N; i++ {
                      x &= 1 << 63
              }
              GlobalU = x
          }
      
      amd64/darwin on Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz:
      name           old time/op  new time/op  delta
      AndHighBits-4  0.61ns ± 6%  0.42ns ± 6%  -31.42%  (p=0.000 n=25+25):
      
      'go run run.go -all_codegen -v codegen' passes  with following adjustments:
      
      ARM64: The BFXIL pattern ((x << lc) >> rc | y & ac) needed adjustment
             since ORshiftRL generation fusing '>> rc' and '|' interferes
             with matching ((x << lc) >> rc) to generate UBFX. Previously
             ORshiftLL was created first using the shifts generated for (y & ac).
      
      S390X: Add rules for abs and copysign to match use of AND instead of SHIFTs.
      
      Updates #33826
      Updates #32781
      
      Change-Id: I5a59f6239660d53c029cd22dfb44ddf39f93a56c
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196810
      Run-TryBot: Martin Möhrmann <moehrmann@google.com>
      Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      f41451e7
    • Bryan C. Mills's avatar
      cmd/go/internal/modfetch/codehost: work around an apparent bug in 'git fetch --unshallow' · 1804bbab
      Bryan C. Mills authored
      When 'git fetch' is passed the '--unshallow' flag, it assumes that the
      local and remote refs are equal.¹ However, we were fetching an
      expanded set of refs explicitly in the same command, violating that
      assumption.
      
      Now we first expand the set of refs, then unshallow the repo in a
      separate fetch. Empirically, this seems to work, whereas the opposite
      order does not.
      
      ¹https://github.com/git/git/blob/4c86140027f4a0d2caaa3ab4bd8bfc5ce3c11c8a/transport.c#L1303-L1309
      
      Fixes #34266
      
      Change-Id: Ie97eb7c1223f944003a1e31d0ec9e69aad0efc0d
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196961
      Run-TryBot: Bryan C. Mills <bcmills@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarJay Conrod <jayconrod@google.com>
      1804bbab
    • Eli Bendersky's avatar
      cmd/gofmt: fix computation of function header size · 47d27a87
      Eli Bendersky authored
      Function sizes are computed to determine whether a function
      can be kept on one line or should be split to several lines. Part of the
      computation is the function header from the FUNC token and until the
      opening { token.
      
      Prior to this change, the function header size used distance from the
      original source position of the current token, which led to issues when
      the source between FUNC and the original source position was rewritten
      (such as whitespace being collapsed). Now we take the current output
      position into account, so that header size represents the reformatted
      source rather than the original source.
      
      The following files in the Go repository are reformatted with this
      change:
      
      * strings/strings_test.go
      * cmd/compile/internal/gc/fmt.go
      
      In both cases the reformatting is minor and seems to be correct given
      the heuristic to single-line functions longer than 100 columns to
      multiple lines.
      
      Fixes #28082
      
      Change-Id: Ib737f6933e09b79e83715211421d5262b366ec93
      Reviewed-on: https://go-review.googlesource.com/c/go/+/188818
      Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
      Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
      Reviewed-by: default avatarEmmanuel Odeke <emm.odeke@gmail.com>
      Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      47d27a87
    • Lynn Boger's avatar
      crypto/aes,crypto/cipher: add asm implementation for aes-gcm on ppc64le · 904fdb37
      Lynn Boger authored
      This adds an asm implementation for aes-gcm on ppc64le to improve
      performance.
      
      Results on power8:
      
      name                     old time/op    new time/op     delta
      AESGCMSeal1K-192           13.4µs ± 0%      3.7µs ± 0%    -72.48%  (p=1.000 n=1+1)
      AESGCMOpen1K-192           10.6µs ± 0%      2.9µs ± 0%    -72.97%  (p=1.000 n=1+1)
      AESGCMSign8K-192           60.2µs ± 0%      1.3µs ± 0%    -97.88%  (p=1.000 n=1+1)
      AESGCMSeal8K-192           80.5µs ± 0%     22.9µs ± 0%    -71.51%  (p=1.000 n=1+1)
      AESGCMOpen8K-192           80.5µs ± 0%     21.5µs ± 0%    -73.27%  (p=1.000 n=1+1)
      
      Change-Id: I026bd4f417095a987eda0f521004af90bc964661
      Reviewed-on: https://go-review.googlesource.com/c/go/+/191969
      Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarMichael Munday <mike.munday@ibm.com>
      904fdb37
    • Michael Fraenkel's avatar
      net/http: remove http2 connections when no longer cached · eb4e5def
      Michael Fraenkel authored
      When the http2 transport returns a NoCachedConnError, the connection
      must be removed from the idle list as well as the connections per host.
      
      Fixes #34387
      
      Change-Id: I7875c9c95e694a37a339bb04385243b49f9b20d3
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196665Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
      Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      eb4e5def
    • Gregory Man's avatar
      cmd/go: allow -I= and -I$SYSROOT in cgo CFLAGS · c4fbaee8
      Gregory Man authored
      Current checkFlags() didn't allow any not safe charactars in arguments.
      In GCC "=" in arguments will be replaced with sysroot prefix, and used
      by users to work with different SDK versions.
      
      This CL allow to use "=" and $SYSROOT with -I argument.
      
      Fixes #34449
      
      Change-Id: I3d8b2b9d13251e454ea18e9d34a94b87c373c7b4
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196783
      Run-TryBot: Jay Conrod <jayconrod@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarJay Conrod <jayconrod@google.com>
      c4fbaee8
    • lukechampine's avatar
      crypto/ed25519: outline NewKeyFromSeed and Sign · 2dfff363
      lukechampine authored
      This allows the returned key/signature to be stack-allocated where possible.
      
      name              old time/op    new time/op    delta
      NewKeyFromSeed-4    61.8µs ± 8%    57.2µs ±11%      ~     (p=0.056 n=5+5)
      Signing-4           56.6µs ± 3%    67.8µs ±38%      ~     (p=1.000 n=5+5)
      
      name              old alloc/op   new alloc/op   delta
      NewKeyFromSeed-4     64.0B ± 0%      0.0B       -100.00%  (p=0.008 n=5+5)
      Signing-4             512B ± 0%      448B ± 0%   -12.50%  (p=0.008 n=5+5)
      
      name              old allocs/op  new allocs/op  delta
      NewKeyFromSeed-4      1.00 ± 0%      0.00       -100.00%  (p=0.008 n=5+5)
      Signing-4             6.00 ± 0%      5.00 ± 0%   -16.67%  (p=0.008 n=5+5)
      
      Change-Id: I7dc6a1b8a483c4b213f380ac7c30cefc5caca0f9
      GitHub-Last-Rev: 0dd2e0f93e9cd1410760544be638238f18fa5cd4
      GitHub-Pull-Request: golang/go#34357
      Reviewed-on: https://go-review.googlesource.com/c/go/+/195980Reviewed-by: default avatarFilippo Valsorda <filippo@golang.org>
      Run-TryBot: Filippo Valsorda <filippo@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      2dfff363
    • Sean Chen's avatar
      runtime: update runtime2.go itab comments about sync struct · 39ab8db9
      Sean Chen authored
      `cmd/compile/internal/gc/reflect.go:/^func.dumptypestructs` was modified many times, now is  `cmd/compile/internal/gc/reflect.go:/^func.dumptabs`
      
      Change-Id: Ie949a5bee7878c998591468a04f67a8a70c61da7
      GitHub-Last-Rev: 9ecc26985ef18c8e870649b46419db0a9c72054f
      GitHub-Pull-Request: golang/go#34489
      Reviewed-on: https://go-review.googlesource.com/c/go/+/197037Reviewed-by: default avatarKeith Randall <khr@golang.org>
      39ab8db9
    • Joel Sing's avatar
      cmd/internal/obj/riscv: implement RV64I integer computational instructions · e29d276d
      Joel Sing authored
      Add support for assembling RV64I integer computational instructions.
      
      Based on the riscv-go port.
      
      Updates #27532
      
      Integer Computational Instructions (RV64I)
      
      Change-Id: I1a082b3901c997da309d737d081f57ea2821bc62
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196838Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
      Run-TryBot: Cherry Zhang <cherryyz@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      e29d276d
    • Joel Sing's avatar
      cmd/internal/obj/riscv: add environment call/breakpoint and base counter/timer instructions · ced24542
      Joel Sing authored
      This implements assembler support for ECALL/EBREAK, along with base
      counter/timer instructions.
      
      Based on riscv-go port.
      
      Updates #27532
      
      Change-Id: I690a9fd835eeddee1fe9a5616d2b2f856d3952b8
      Reviewed-on: https://go-review.googlesource.com/c/go/+/195918Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
      Run-TryBot: Cherry Zhang <cherryyz@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      ced24542
  3. 23 Sep, 2019 12 commits
  4. 22 Sep, 2019 1 commit
    • Robert Griesemer's avatar
      go/types: don't clone interface methods when embedding them · 20f0bcb0
      Robert Griesemer authored
      https://golang.org/cl/191257 significantly changed (and simplified)
      the computation of interface method sets with embedded interfaces.
      Specifically, when adding methods from an embedded interface, those
      method objects (Func Objects) were cloned so that they could have a
      different source position (the embedding position rather than the
      original method position) for better error messages.
      
      This causes problems for code that depends on the identity of method
      objects that represent the same method, embedded or not.
      
      This CL avoids the cloning. Instead, while computing the method set
      of an interface, a position map is carried along that tracks
      embedding positions. The map is not needed anymore after type-
      checking.
      
      Updates #34421.
      
      Change-Id: I8ce188136c76fa70fba686711167db29a049f46d
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196561Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
      20f0bcb0
  5. 21 Sep, 2019 5 commits
    • Andrew Medvedev's avatar
      strings, bytes: clarify usage of EqualFolds · 78e5288b
      Andrew Medvedev authored
      This clarifies meaning of "case folding" Unicode equality with more familiar "case insensitive" wording.
      For case folding properties see ftp://ftp.unicode.org/Public/UNIDATA/CaseFolding.txt.
      
      Fixes #33447
      
      Change-Id: I6ee85ab398679bf2a0b7d18693985ff0979d6c5a
      GitHub-Last-Rev: accc9159330c61e046d77f77beac62b38bf72c19
      GitHub-Pull-Request: golang/go#34434
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196717Reviewed-by: default avatarRob Pike <r@golang.org>
      78e5288b
    • two's avatar
      runtime/type: change fieldalign to use mixedCaps · 9c0e56bf
      two authored
      All spelling in source code is "fieldAlign", except this place, so change
      "fieldalign" to use mixedCaps.
      
      Change-Id: Icbd9b9d23d9b4f756174e9a3cc4b25776fd90def
      GitHub-Last-Rev: 44a4fe140a4a473a234ceb5bd927109cbc35bb30
      GitHub-Pull-Request: golang/go#34441
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196757
      Run-TryBot: Andrew Bonventre <andybons@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
      9c0e56bf
    • Martin Möhrmann's avatar
      compile: prefer an AND instead of SHR+SHL instructions · 4e2b84ff
      Martin Möhrmann authored
      On modern 64bit CPUs a SHR, SHL or AND instruction take 1 cycle to execute.
      A pair of shifts that operate on the same register will take 2 cycles
      and needs to wait for the input register value to be available.
      
      Large constants used to mask the high bits of a register with an AND
      instruction can not be encoded as an immediate in the AND instruction
      on amd64 and therefore need to be loaded into a register with a MOV
      instruction.
      
      However that MOV instruction is not dependent on the output register and
      on many CPUs does not compete with the AND or shift instructions for
      execution ports.
      
      Using a pair of shifts to mask high bits instead of an AND to mask high
      bits of a register has a shorter encoding and uses one less general
      purpose register but is slower due to taking one clock cycle longer
      if there is no register pressure that would make the AND variant need to
      generate a spill.
      
      For example the instructions emitted for (x & 1 << 63) before this CL are:
      48c1ea3f                SHRQ $0x3f, DX
      48c1e23f                SHLQ $0x3f, DX
      
      after this CL the instructions are the same as GCC and LLVM use:
      48b80000000000000080    MOVQ $0x8000000000000000, AX
      4821d0                  ANDQ DX, AX
      
      Some platforms such as arm64 already have SSA optimization rules to fuse
      two shift instructions back into an AND.
      
      Removing the general rule to rewrite AND to SHR+SHL speeds up this benchmark:
      
          var GlobalU uint
      
          func BenchmarkAndHighBits(b *testing.B) {
              x := uint(0)
              for i := 0; i < b.N; i++ {
                      x &= 1 << 63
              }
              GlobalU = x
          }
      
      amd64/darwin on Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz:
      name           old time/op  new time/op  delta
      AndHighBits-4  0.61ns ± 6%  0.42ns ± 6%  -31.42%  (p=0.000 n=25+25):
      
      'go run run.go -all_codegen -v codegen' passes  with following adjustments:
      
      ARM64: The BFXIL pattern ((x << lc) >> rc | y & ac) needed adjustment
             since ORshiftRL generation fusing '>> rc' and '|' interferes
             with matching ((x << lc) >> rc) to generate UBFX. Previously
             ORshiftLL was created first using the shifts generated for (y & ac).
      
      S390X: Add rules for abs and copysign to match use of AND instead of SHIFTs.
      
      Updates #33826
      Updates #32781
      
      Change-Id: I43227da76b625de03fbc51117162b23b9c678cdb
      Reviewed-on: https://go-review.googlesource.com/c/go/+/194297
      Run-TryBot: Martin Möhrmann <martisch@uos.de>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
      4e2b84ff
    • Agniva De Sarker's avatar
      test/codegen: fix wasm codegen breakage · ecc7dd54
      Agniva De Sarker authored
      i32.eqz instructions don't appear unless needed in if conditions anymore
      after CL 195204. I forgot to run the codegen tests while submitting the CL.
      
      Thanks to @martisch for catching it.
      
      Fixes #34442
      
      Change-Id: I177b064b389be48e39d564849714d7a8839be13e
      Reviewed-on: https://go-review.googlesource.com/c/go/+/196580
      Run-TryBot: Agniva De Sarker <agniva.quicksilver@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarMartin Möhrmann <moehrmann@google.com>
      ecc7dd54
    • Agniva De Sarker's avatar
      cmd/compile: optimize ssa if blocks for wasm architecture · 9c384cc5
      Agniva De Sarker authored
      Check for the next block and accordingly place the successor blocks.
      This saves an additional jump instruction if the next block is any one
      of the successor blocks.
      
      While at it, inline the logic of goToBlock.
      
      Reduces the size of pkg/js_wasm by 264 bytes.
      
      Change-Id: I671ac4322e6edcb0d7e590dcca27e074268068d5
      Reviewed-on: https://go-review.googlesource.com/c/go/+/195204
      Run-TryBot: Agniva De Sarker <agniva.quicksilver@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRichard Musiol <neelance@gmail.com>
      9c384cc5