This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Go patch committed: Fix test for make argument too large
- From: Ian Lance Taylor <iant at google dot com>
- To: gcc-patches at gcc dot gnu dot org, gofrontend-dev at googlegroups dot com
- Date: Wed, 09 Oct 2013 20:51:12 -0700
- Subject: Go patch committed: Fix test for make argument too large
- Authentication-results: sourceware.org; auth=none
This patch to the Go frontend fixes the test for whether a constant
argument to the builtin function make is too large. Bootstrapped and
ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Will commit to 4.8 when the branch opens.
Ian
diff -r 5aa7a9d25a56 go/expressions.cc
--- a/go/expressions.cc Wed Oct 09 20:27:42 2013 -0700
+++ b/go/expressions.cc Wed Oct 09 20:49:57 2013 -0700
@@ -7542,7 +7542,7 @@
switch (nc.to_unsigned_long(&v))
{
case Numeric_constant::NC_UL_VALID:
- return true;
+ break;
case Numeric_constant::NC_UL_NOTINT:
error_at(e->location(), "non-integer %s argument to make",
is_length ? "len" : "cap");
@@ -7554,8 +7554,23 @@
case Numeric_constant::NC_UL_BIG:
// We don't want to give a compile-time error for a 64-bit
// value on a 32-bit target.
- return true;
- }
+ break;
+ }
+
+ mpz_t val;
+ if (!nc.to_int(&val))
+ go_unreachable();
+ int bits = mpz_sizeinbase(val, 2);
+ mpz_clear(val);
+ Type* int_type = Type::lookup_integer_type("int");
+ if (bits >= int_type->integer_type()->bits())
+ {
+ error_at(e->location(), "%s argument too large for make",
+ is_length ? "len" : "cap");
+ return false;
+ }
+
+ return true;
}
if (e->type()->integer_type() != NULL)