Commit d5df4d61 authored by Dominik Honnef's avatar Dominik Honnef Committed by Robert Griesemer

cmd/gofmt: don't turn nil slices into empty slices during rewriting

The go/ast package uses and guarantees nil slices for optional
elements that weren't present in the parsed source code, such as the
list of return values of a function. Packages using go/ast rely on
this attribute and check for nils explicitly.

One such package is go/printer. In the presence of empty slices
instead of nil slices, it generates invalid code, such as "case :"
instead of "default:". The issues that this CL fixes are all
manifestations of that problem, each for a different syntactic
element.

Fixes #33103
Fixes #33104
Fixes #33105

Change-Id: I219f95a7da820eaf697a4ee227d458ab6e4a80bd
Reviewed-on: https://go-review.googlesource.com/c/go/+/187917Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 8875fb97
......@@ -271,6 +271,12 @@ func subst(m map[string]reflect.Value, pattern reflect.Value, pos reflect.Value)
// Otherwise copy.
switch p := pattern; p.Kind() {
case reflect.Slice:
if p.IsNil() {
// Do not turn nil slices into empty slices. go/ast
// guarantees that certain lists will be nil if not
// populated.
return reflect.Zero(p.Type())
}
v := reflect.MakeSlice(p.Type(), p.Len(), p.Len())
for i := 0; i < p.Len(); i++ {
v.Index(i).Set(subst(m, p.Index(i), pos))
......
//gofmt -r=a->a
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Issue 33103, 33104, and 33105.
package pkg
func fn() {
_ = func() {
switch {
default:
}
}
_ = func() string {}
_ = func() { var ptr *string; println(ptr) }
}
//gofmt -r=a->a
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Issue 33103, 33104, and 33105.
package pkg
func fn() {
_ = func() {
switch {
default:
}
}
_ = func() string {}
_ = func() { var ptr *string; println(ptr) }
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment