]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: fix Xcode 5 incompatibility for #defined expressions
authorRuss Cox <rsc@golang.org>
Tue, 15 Oct 2013 18:34:46 +0000 (14:34 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 15 Oct 2013 18:34:46 +0000 (14:34 -0400)
Ensure that clang always exits with a non-zero status by
giving it something that it always warns about (the statement "1;").

Fixes #6128.

R=golang-dev, iant, minux.ma
CC=golang-dev
https://golang.org/cl/14702043

misc/cgo/test/issue6128.go [new file with mode: 0644]
src/cmd/cgo/gcc.go

diff --git a/misc/cgo/test/issue6128.go b/misc/cgo/test/issue6128.go
new file mode 100644 (file)
index 0000000..4afba24
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2013 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.
+
+package cgotest
+
+// Test handling of #defined names in clang.
+// golang.org/issue/6128.
+
+/*
+// NOTE: Must use hex, or else a shortcut for decimals
+// in cgo avoids trying to pass this to clang.
+#define X 0x1
+*/
+import "C"
+
+func test6128() {
+       // nothing to run, just make sure this compiles.
+       _ = C.X
+}
index 1cd938ba2c0a8d1d337e8f3c894099633b2ededd..40e9c70a17d55e30a05ee1b2da73a38040f80846 100644 (file)
@@ -304,6 +304,19 @@ func (p *Package) guessKinds(f *File) []*Name {
        b.WriteString(builtinProlog)
        b.WriteString(f.Preamble)
        b.WriteString("void __cgo__f__(void) {\n")
+
+       // For a #defined expression, clang silences the warning about "unused expression".
+       // http://llvm.org/viewvc/llvm-project?view=revision&revision=172696
+       // Silencing the warning is not a big deal, because our default assumption is that
+       // (in the absence of other evidence) names are expressions.
+       // However, if all the C names we are investigating are #defined expressions,
+       // clang will print no warnings at all and then exit successfully.
+       // We want clang to print warnings, so seed the code with a function
+       // that is guaranteed to provoke a warning (that we will ignore).
+       // This way, if clang becomes even more broken, we'll find out.
+       // See golang.org/issue/6128.
+       fmt.Fprintf(&b, "1;\n")
+
        b.WriteString("#line 1 \"cgo-test\"\n")
        for i, n := range toSniff {
                fmt.Fprintf(&b, "%s; /* #%d */\nenum { _cgo_enum_%d = %s }; /* #%d */\n", n.C, i, i, n.C, i)