summaryrefslogtreecommitdiff
path: root/misc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2018-06-26 14:40:51 -0700
committerIan Lance Taylor <iant@golang.org>2018-06-29 23:22:48 +0000
commitda769814b83c4eb65681dbe682d07d4b902b554a (patch)
treea327d64178f1f0782ced67e2ec7dcb4809287b08 /misc
parent1b12a2ca21776ced3e9d34e14bb442254e250c14 (diff)
downloadgo-git-da769814b83c4eb65681dbe682d07d4b902b554a.tar.gz
cmd/cgo: handle GCC 8 change in errors about constant initializers
Before GCC 8 C code like const unsigned long long int neg = (const unsigned long long) -1; void f(void) { static const double x = (neg); } would get an error "initializer element is not constant". In GCC 8 and later it does not. Because a value like neg, above, can not be used as a general integer constant, this causes cgo to conclude that it is a floating point constant. The way that cgo handles floating point values then causes it to get the wrong value for it: 18446744073709551615 rather than -1. These are of course the same value when converted to int64, but Go does not permit that kind of conversion for an out-of-range constant. This CL side-steps the problem by treating floating point constants with integer type as they would up being treated before GCC 8: as variables rather than constants. Fixes #26066 Change-Id: I6f2f9ac2fa8a4b8218481b474f0b539758eb3b79 Reviewed-on: https://go-review.googlesource.com/121035 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'misc')
-rw-r--r--misc/cgo/test/cgo_test.go1
-rw-r--r--misc/cgo/test/issue26066.go19
2 files changed, 20 insertions, 0 deletions
diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go
index 4c7f676e0b..ba2a89ef82 100644
--- a/misc/cgo/test/cgo_test.go
+++ b/misc/cgo/test/cgo_test.go
@@ -90,6 +90,7 @@ func Test22906(t *testing.T) { test22906(t) }
func Test24206(t *testing.T) { test24206(t) }
func Test25143(t *testing.T) { test25143(t) }
func Test23356(t *testing.T) { test23356(t) }
+func Test26066(t *testing.T) { test26066(t) }
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
func BenchmarkGoString(b *testing.B) { benchGoString(b) }
diff --git a/misc/cgo/test/issue26066.go b/misc/cgo/test/issue26066.go
new file mode 100644
index 0000000000..21028e7479
--- /dev/null
+++ b/misc/cgo/test/issue26066.go
@@ -0,0 +1,19 @@
+// Copyright 2018 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.
+
+// Wrong type of constant with GCC 8 and newer.
+
+package cgotest
+
+// const unsigned long long int issue26066 = (const unsigned long long) -1;
+import "C"
+
+import "testing"
+
+func test26066(t *testing.T) {
+ var i = int64(C.issue26066)
+ if i != -1 {
+ t.Errorf("got %d, want -1", i)
+ }
+}