diff options
author | Ian Lance Taylor <iant@golang.org> | 2018-06-26 14:40:51 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2018-06-29 23:22:48 +0000 |
commit | da769814b83c4eb65681dbe682d07d4b902b554a (patch) | |
tree | a327d64178f1f0782ced67e2ec7dcb4809287b08 /misc | |
parent | 1b12a2ca21776ced3e9d34e14bb442254e250c14 (diff) | |
download | go-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.go | 1 | ||||
-rw-r--r-- | misc/cgo/test/issue26066.go | 19 |
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) + } +} |