From b5d18b50ac591d41cb4aab522fa9044c61b2c1e7 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 18 May 2016 18:42:25 -0700 Subject: [PATCH] cmd/cgo: remove -O options when generating compiler errors The cgo tool generates compiler errors to find out what kind of name it is using. Turning on optimization can confuse that process by producing new unexpected messages. Fixes #14669. Change-Id: Idc8e35fd259711ecc9638566b691c11d17140325 Reviewed-on: https://go-review.googlesource.com/23231 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox --- misc/cgo/errors/issue14669.go | 23 +++++++++++++++++++++++ misc/cgo/errors/test.bash | 7 +++++++ src/cmd/cgo/gcc.go | 12 ++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 misc/cgo/errors/issue14669.go diff --git a/misc/cgo/errors/issue14669.go b/misc/cgo/errors/issue14669.go new file mode 100644 index 0000000000..04d2bcb631 --- /dev/null +++ b/misc/cgo/errors/issue14669.go @@ -0,0 +1,23 @@ +// Copyright 2016 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 14669: test that fails when build with CGO_CFLAGS selecting +// optimization. + +package p + +/* +const int E = 1; + +typedef struct s { + int c; +} s; +*/ +import "C" + +func F() { + _ = C.s{ + c: C.E, + } +} diff --git a/misc/cgo/errors/test.bash b/misc/cgo/errors/test.bash index cd358a10f8..643d038205 100755 --- a/misc/cgo/errors/test.bash +++ b/misc/cgo/errors/test.bash @@ -45,6 +45,13 @@ expect issue13129.go C.ushort check issue13423.go expect issue13635.go C.uchar C.schar C.ushort C.uint C.ulong C.longlong C.ulonglong C.complexfloat C.complexdouble +if ! go build issue14669.go; then + exit 1 +fi +if ! CGO_CFLAGS="-O" go build issue14669.go; then + exit 1 +fi + if ! go run ptr.go; then exit 1 fi diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 97ef824c93..451798244f 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1243,12 +1243,20 @@ func (p *Package) gccErrors(stdin []byte) string { // TODO(rsc): require failure args := p.gccCmd() + // Optimization options can confuse the error messages; remove them. + nargs := make([]string, 0, len(args)) + for _, arg := range args { + if !strings.HasPrefix(arg, "-O") { + nargs = append(nargs, arg) + } + } + if *debugGcc { - fmt.Fprintf(os.Stderr, "$ %s <