diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2013-05-26 10:02:33 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2013-05-26 10:02:33 +0000 |
commit | 7cc15171bee9d4a62d4618741e85bb0342525ca2 (patch) | |
tree | a6319d47db8c250fc694c234b661ad297e69d96d /gcc/ada/gcc-interface/trans.c | |
parent | 74746d494b37773e55d43130ed51bba67a337efe (diff) | |
download | gcc-7cc15171bee9d4a62d4618741e85bb0342525ca2.zip gcc-7cc15171bee9d4a62d4618741e85bb0342525ca2.tar.gz gcc-7cc15171bee9d4a62d4618741e85bb0342525ca2.tar.bz2 |
trans.c (Attribute_to_gnu): Add kludge to avoid generating an overflow for -1.
* gcc-interface/trans.c (Attribute_to_gnu) <Attr_Last_Bit>: Add kludge
to avoid generating an overflow for -1.
From-SVN: r199339
Diffstat (limited to 'gcc/ada/gcc-interface/trans.c')
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 13767e9..4b71568 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -2080,14 +2080,19 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) gnu_result = bitsize_int (bitpos % BITS_PER_UNIT); gnu_result = size_binop (PLUS_EXPR, gnu_result, TYPE_SIZE (TREE_TYPE (gnu_prefix))); - gnu_result = size_binop (MINUS_EXPR, gnu_result, - bitsize_one_node); + /* ??? Avoid a large unsigned result that will overflow when + converted to the signed universal_integer. */ + if (integer_zerop (gnu_result)) + gnu_result = integer_minus_one_node; + else + gnu_result + = size_binop (MINUS_EXPR, gnu_result, bitsize_one_node); break; case Attr_Bit_Position: gnu_result = gnu_field_bitpos; break; - } + } /* If this has a PLACEHOLDER_EXPR, qualify it by the object we are handling. */ |