mirror of https://github.com/golang/go.git
cmd/cgo: don't replace newlines with semicolons in composite literals
Fixes #29748 Change-Id: I2b19165bdb3c99df5b79574390b5d5f6d40462dc Reviewed-on: https://go-review.googlesource.com/c/157961 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
3e9c3cfd1e
commit
76e8ca447c
|
|
@ -0,0 +1,22 @@
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
// Error handling a struct initializer that requires pointer checking.
|
||||||
|
// Compilation test only, nothing to run.
|
||||||
|
|
||||||
|
package cgotest
|
||||||
|
|
||||||
|
// typedef struct { char **p; } S29748;
|
||||||
|
// static int f29748(S29748 *p) { return 0; }
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
var Vissue29748 = C.f29748(&C.S29748{
|
||||||
|
nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
func Fissue299748() {
|
||||||
|
C.f29748(&C.S29748{
|
||||||
|
nil,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -127,8 +127,21 @@ func gofmt(n interface{}) string {
|
||||||
return gofmtBuf.String()
|
return gofmtBuf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// gofmtLineReplacer is used to put a gofmt-formatted string for an
|
||||||
|
// AST expression onto a single line. The lexer normally inserts a
|
||||||
|
// semicolon at each newline, so we can replace newline with semicolon.
|
||||||
|
// However, we can't do that in cases where the lexer would not insert
|
||||||
|
// a semicolon. Fortunately we only have to worry about cases that
|
||||||
|
// can occur in an expression passed through gofmt, which just means
|
||||||
|
// composite literals.
|
||||||
|
var gofmtLineReplacer = strings.NewReplacer(
|
||||||
|
"{\n", "{",
|
||||||
|
",\n", ",",
|
||||||
|
"\n", ";",
|
||||||
|
)
|
||||||
|
|
||||||
// gofmtLine returns the gofmt-formatted string for an AST node,
|
// gofmtLine returns the gofmt-formatted string for an AST node,
|
||||||
// ensuring that it is on a single line.
|
// ensuring that it is on a single line.
|
||||||
func gofmtLine(n interface{}) string {
|
func gofmtLine(n interface{}) string {
|
||||||
return strings.Replace(gofmt(n), "\n", ";", -1)
|
return gofmtLineReplacer.Replace(gofmt(n))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue