From dd1889cb22c1fd37cf444d672274a8460fe6e2bf Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 17 Jan 2019 18:35:43 -0800 Subject: [PATCH] cmd/cgo: don't replace newlines with semicolons in expressions Fixes #29781 Change-Id: Id032d07a54b8c24f0c6d3f6e512932f76920ee04 Reviewed-on: https://go-review.googlesource.com/c/158457 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/cgo/test/issue29781.go | 17 +++++++++++++++++ src/cmd/cgo/godefs.go | 21 ++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 misc/cgo/test/issue29781.go diff --git a/misc/cgo/test/issue29781.go b/misc/cgo/test/issue29781.go new file mode 100644 index 0000000000..0fd8c08b8e --- /dev/null +++ b/misc/cgo/test/issue29781.go @@ -0,0 +1,17 @@ +// 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 with newline inserted into constant expression. +// Compilation test only, nothing to run. + +package cgotest + +// static void issue29781F(char **p, int n) {} +// #define ISSUE29781C 0 +import "C" + +func issue29781G() { + var p *C.char + C.issue29781F(&p, C.ISSUE29781C+1) +} diff --git a/src/cmd/cgo/godefs.go b/src/cmd/cgo/godefs.go index c0cd8e002f..7185ea0de7 100644 --- a/src/cmd/cgo/godefs.go +++ b/src/cmd/cgo/godefs.go @@ -131,12 +131,27 @@ func gofmt(n interface{}) string { // 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. +// a semicolon. We only have to worry about cases that can occur in an +// expression passed through gofmt, which means composite literals and +// (due to the printer possibly inserting newlines because of position +// information) operators. var gofmtLineReplacer = strings.NewReplacer( "{\n", "{", ",\n", ",", + "++\n", "++;", + "--\n", "--;", + "+\n", "+", + "-\n", "-", + "*\n", "*", + "/\n", "/", + "%\n", "%", + "&\n", "&", + "|\n", "|", + "^\n", "^", + "<\n", "<", + ">\n", ">", + "=\n", "=", + ",\n", ",", "\n", ";", ) -- 2.50.0