diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-10-10 03:51:11 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-10-10 03:51:11 +0000 |
commit | d6394e2bbc175f53f60e71fccc5a9be4542ce68e (patch) | |
tree | 5df145f25fbc3fe02363eec28c63aadb42997c48 /gcc/go | |
parent | 3d317d48a799c2561349f4aba97adf576d97b0db (diff) | |
download | gcc-d6394e2bbc175f53f60e71fccc5a9be4542ce68e.zip gcc-d6394e2bbc175f53f60e71fccc5a9be4542ce68e.tar.gz gcc-d6394e2bbc175f53f60e71fccc5a9be4542ce68e.tar.bz2 |
compiler: Fix test for constant argument too large for make.
From-SVN: r203338
Diffstat (limited to 'gcc/go')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 8b53331..0647a50 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -7542,7 +7542,7 @@ Builtin_call_expression::check_int_value(Expression* e, bool is_length) 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 @@ Builtin_call_expression::check_int_value(Expression* e, bool is_length) 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) |