[Bug go/86289] New: Cgo integer constant overflow for 64 bits (unsigned) int
stephen.kim at oracle dot com
gcc-bugzilla@gcc.gnu.org
Sat Jun 23 07:19:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86289
Bug ID: 86289
Summary: Cgo integer constant overflow for 64 bits (unsigned)
int
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: go
Assignee: ian at airs dot com
Reporter: stephen.kim at oracle dot com
CC: cmang at google dot com
Target Milestone: ---
I think the bug report is not the best format for this issue but that's the
only I have. Let me start with the bug. The bug seems a regression that I have
found in building docker with gccgo for aarch64. Here is, however, the reduced
test case:
$ cat ~/ce.go
package main
import "fmt"
/*
const unsigned long long int neg = (const unsigned long long) -1;
*/
import "C"
func main() {
var i int64
i = int64(C.neg)
fmt.Println(C.neg)
fmt.Println(i)
}
$ go build -x ~/ce.go
(omitted some logs)
../../../ce.go:14:6: error: integer constant overflow
i = int64(C.neg)
^
The problem is, cgo invokes gcc as just "gcc." Gcc 8.x started to accept the
following C code:
const unsigned long long int neg = (const unsigned long long) -1;
#line 1 "not-num-const"
void __cgo_f_1_4(void) { static const double __cgo_undefined__4 = (neg); }
The code above is generated by cgo; cgo tries to understand "neg" by generating
the code and giving it to gcc. Gcc 7.3 said "That's a compile error." while gcc
8.x and 9.0 silently accept it.
Once the code is accepted by, say, gcc 9, cgo type-casts the value as double.
It is very clear that a 64 bit double cannot accommodate all 64 bits integer
values. -1 is one of the corner cases.
As "neg" is "not-int-const," if gcc says it does not fall into "not-num-const,"
cgo thinks "neg" is an fconst. That is destined to be type-casted to a double:
#line 1 "cgo-generated-wrapper"
#line 1 "cgo-dwarf-inference"
__typeof__(neg) *__cgo__0;
long long __cgodebug_ints[] = {
0,
1
};
double __cgodebug_floats[] = {
neg,
1
};
Cgo generates the code above to get some debugging information gcc generated,
and use the value there to initialize C.neg in the Go code.
I believe that is not correct.
Firstly, this bug would be a regression as gcc 7.3 did say the following is a
compile error:
const unsigned long long int neg = (const unsigned long long) -1;
#line 1 "not-num-const"
void __cgo_f_1_4(void) { static const double __cgo_undefined__4 = (neg); }
Then, should the bug be filed against gcc?
However, I am also wondering. Even if everything were fine, I still think that
my "neg" variable perhaps should not fall into "not-int-const." It should be
int-const.
Personally, regarding my work with my employer, I have worked on this issue. I
would like to proceed to provide a fix for the issue if someone confirms I am
on the right track.
Thank you!
More information about the Gcc-bugs
mailing list