mirror of
https://github.com/golang/go
synced 2024-11-22 17:35:19 -07:00
go/printer: parenthesize literal function types in conversions
Also: gofmt -w src misc R=r CC=golang-dev, iant https://golang.org/cl/6591071
This commit is contained in:
parent
6c740e769f
commit
1065c6f65a
@ -791,7 +791,14 @@ func (p *printer) expr1(expr ast.Expr, prec1, depth int) {
|
||||
if len(x.Args) > 1 {
|
||||
depth++
|
||||
}
|
||||
p.expr1(x.Fun, token.HighestPrec, depth)
|
||||
if _, ok := x.Fun.(*ast.FuncType); ok {
|
||||
// conversions to literal function types require parentheses around the type
|
||||
p.print(token.LPAREN)
|
||||
p.expr1(x.Fun, token.HighestPrec, depth)
|
||||
p.print(token.RPAREN)
|
||||
} else {
|
||||
p.expr1(x.Fun, token.HighestPrec, depth)
|
||||
}
|
||||
p.print(x.Lparen, token.LPAREN)
|
||||
if x.Ellipsis.IsValid() {
|
||||
p.exprList(x.Lparen, x.Args, depth, 0, x.Ellipsis)
|
||||
|
15
src/pkg/go/printer/testdata/expressions.golden
vendored
15
src/pkg/go/printer/testdata/expressions.golden
vendored
@ -647,3 +647,18 @@ func _() {
|
||||
a...,
|
||||
)
|
||||
}
|
||||
|
||||
// Literal function types in conversions must be parenthesized;
|
||||
// for now go/parser accepts the unparenthesized form where it
|
||||
// is non-ambiguous.
|
||||
func _() {
|
||||
// these conversions should be rewritten to look
|
||||
// the same as the parenthesized conversions below
|
||||
_ = (func())(nil)
|
||||
_ = (func(x int) float)(nil)
|
||||
_ = (func() func() func())(nil)
|
||||
|
||||
_ = (func())(nil)
|
||||
_ = (func(x int) float)(nil)
|
||||
_ = (func() func() func())(nil)
|
||||
}
|
||||
|
15
src/pkg/go/printer/testdata/expressions.input
vendored
15
src/pkg/go/printer/testdata/expressions.input
vendored
@ -676,3 +676,18 @@ func _() {
|
||||
a...,
|
||||
)
|
||||
}
|
||||
|
||||
// Literal function types in conversions must be parenthesized;
|
||||
// for now go/parser accepts the unparenthesized form where it
|
||||
// is non-ambiguous.
|
||||
func _() {
|
||||
// these conversions should be rewritten to look
|
||||
// the same as the parenthesized conversions below
|
||||
_ = func()()(nil)
|
||||
_ = func(x int)(float)(nil)
|
||||
_ = func() func() func()()(nil)
|
||||
|
||||
_ = (func()())(nil)
|
||||
_ = (func(x int)(float))(nil)
|
||||
_ = (func() func() func()())(nil)
|
||||
}
|
||||
|
15
src/pkg/go/printer/testdata/expressions.raw
vendored
15
src/pkg/go/printer/testdata/expressions.raw
vendored
@ -647,3 +647,18 @@ func _() {
|
||||
a...,
|
||||
)
|
||||
}
|
||||
|
||||
// Literal function types in conversions must be parenthesized;
|
||||
// for now go/parser accepts the unparenthesized form where it
|
||||
// is non-ambiguous.
|
||||
func _() {
|
||||
// these conversions should be rewritten to look
|
||||
// the same as the parenthesized conversions below
|
||||
_ = (func())(nil)
|
||||
_ = (func(x int) float)(nil)
|
||||
_ = (func() func() func())(nil)
|
||||
|
||||
_ = (func())(nil)
|
||||
_ = (func(x int) float)(nil)
|
||||
_ = (func() func() func())(nil)
|
||||
}
|
||||
|
@ -1494,7 +1494,7 @@ func TestMethod(t *testing.T) {
|
||||
}
|
||||
|
||||
// Curried method of value.
|
||||
tfunc := TypeOf(func(int) int(nil))
|
||||
tfunc := TypeOf((func(int) int)(nil))
|
||||
v := ValueOf(p).Method(1)
|
||||
if tt := v.Type(); tt != tfunc {
|
||||
t.Errorf("Value Method Type is %s; want %s", tt, tfunc)
|
||||
|
Loading…
Reference in New Issue
Block a user