compiler: check for floating-point exponent overflow
authorIan Lance Taylor <iant@golang.org>
Wed, 16 Dec 2020 05:52:23 +0000 (21:52 -0800)
committerIan Lance Taylor <iant@golang.org>
Fri, 18 Dec 2020 23:56:20 +0000 (15:56 -0800)
Adjust mksysinfo and mkrsysinfo to strip out floating-point max numbers,
as they can trigger this error.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/278476

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/lex.cc
gcc/testsuite/go.test/test/fixedbugs/issue11326b.go
gcc/testsuite/go.test/test/fixedbugs/issue13471.go
libgo/mkrsysinfo.sh
libgo/mksysinfo.sh

index 6567db1..40242cc 100644 (file)
@@ -1,4 +1,4 @@
-526037336231593939a517b7c0b2892d413adb40
+1317de50147304a226b3ec5c4d81376470c358e5
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index e71b8cd..0baf4e4 100644 (file)
@@ -1316,9 +1316,13 @@ Lex::gather_number()
        }
     }
 
+  mpfr_clear_overflow();
   mpfr_t val;
   int r = mpfr_init_set_str(val, num.c_str(), base, MPFR_RNDN);
   go_assert(r == 0);
+  if (mpfr_overflow_p())
+    go_error_at(this->location(),
+               "floating-point exponent too large to represent");
 
   bool is_imaginary = *p == 'i';
   if (is_imaginary)
index 8aba4d9..b5f933b 100644 (file)
@@ -1,5 +1,9 @@
 // run
 
+// Does not work with gccgo, which uses a smaller (but still permitted)
+// exponent size.
+// +build !gccgo
+
 // Copyright 2015 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.
index 9bfc8c3..9069412 100644 (file)
@@ -9,17 +9,17 @@
 package main
 
 func main() {
-       const _ int64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ int32 = 1e64645699  // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ int16 = 1e6464569   // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ int8 = 1e646456     // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ int = 1e64645       // ERROR "integer too large|floating-point constant truncated to integer"
+       const _ int64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ int32 = 1e64645699  // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ int16 = 1e6464569   // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ int8 = 1e646456     // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ int = 1e64645       // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
 
-       const _ uint64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ uint32 = 1e64645699  // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ uint16 = 1e6464569   // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ uint8 = 1e646456     // ERROR "integer too large|floating-point constant truncated to integer"
-       const _ uint = 1e64645       // ERROR "integer too large|floating-point constant truncated to integer"
+       const _ uint64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ uint32 = 1e64645699  // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ uint16 = 1e6464569   // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ uint8 = 1e646456     // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
+       const _ uint = 1e64645       // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
 
-       const _ rune = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer"
+       const _ rune = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large"
 }
index c28f0e5..e016ca4 100755 (executable)
@@ -26,6 +26,7 @@ grep -v '^// ' gen-sysinfo.go | \
   grep -v '^type _*locale[_ ]' | \
   grep -v 'in6_addr' | \
   grep -v 'sockaddr_in6' | \
+  egrep -v '^const _*FLT(64|128)_(NORM_)?MAX' | \
   sed -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1timeval\2/g' \
       -e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1timespec\2/g' \
       -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1timespec\2/g' \
index b32a026..24d4ce2 100755 (executable)
@@ -38,6 +38,7 @@ grep -v '^// ' gen-sysinfo.go | \
   grep -v '^type _*locale[_ ]' | \
   grep -v 'in6_addr' | \
   grep -v 'sockaddr_in6' | \
+  egrep -v '^const _*FLT(64|128)_(NORM_)?MAX' | \
   sed -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \
       -e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \
       -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \