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 6567db167a25c424da097a8322e36f8c834b6bfa..40242cc6a3f3037f990588fe7ad20ede9e6f432f 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 e71b8cddf652c85686dcc0cfca1acc7c926f0a80..0baf4e4e24b0b0213c085b2bc9b5a4292ca36895 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 8aba4d91215ffdf1dc8cdd25a692b564d8b13021..b5f933bfea1153c37c28ee3b4c5f897f18b36f06 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 9bfc8c3d2cffd62c7cc9d1da6c96754759c45425..9069412ffa6234d14fa96fe75230ea27f783d82a 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 c28f0e5f1f695009b3d6ce2d8b529bedc0eaa539..e016ca4dc597ee7c72d245d549b59177469de254 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 b32a0266b719f5856cc35961cfcffd36883d8938..24d4ce2df6bdbef105c3193d93f83e2cdc9c12f6 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' \