mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: fix Xcode 5 incompatibility for #defined expressions
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
This commit is contained in:
parent
74f639176d
commit
043ace1213
2 changed files with 33 additions and 0 deletions
20
misc/cgo/test/issue6128.go
Normal file
20
misc/cgo/test/issue6128.go
Normal file
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -304,6 +304,19 @@ func (p *Package) guessKinds(f *File) []*Name {
|
||||||
b.WriteString(builtinProlog)
|
b.WriteString(builtinProlog)
|
||||||
b.WriteString(f.Preamble)
|
b.WriteString(f.Preamble)
|
||||||
b.WriteString("void __cgo__f__(void) {\n")
|
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")
|
b.WriteString("#line 1 \"cgo-test\"\n")
|
||||||
for i, n := range toSniff {
|
for i, n := range toSniff {
|
||||||
fmt.Fprintf(&b, "%s; /* #%d */\nenum { _cgo_enum_%d = %s }; /* #%d */\n", n.C, i, i, n.C, i)
|
fmt.Fprintf(&b, "%s; /* #%d */\nenum { _cgo_enum_%d = %s }; /* #%d */\n", n.C, i, i, n.C, i)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue