From 50bf9f145c75b1fbc372e33610af14a8be328e58 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sun, 26 May 2013 10:06:18 +0000 Subject: [PATCH] trans.c (Attribute_to_gnu): Add kludge to avoid generating an overflow for -1. * gcc-interface/trans.c (Attribute_to_gnu) : Add kludge to avoid generating an overflow for -1. From-SVN: r199341 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/trans.c | 11 ++++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/specs/last_bit.ads | 19 +++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/specs/last_bit.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index af231667fe6d..3da582dd2d6e 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2013-05-26 Eric Botcazou + + * gcc-interface/trans.c (Attribute_to_gnu) : Add kludge + to avoid generating an overflow for -1. + 2013-04-11 Release Manager * GCC 4.7.3 released. diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index aabe9b6bd020..e5f8351242aa 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -1901,14 +1901,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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eda744322b74..e8b54e4fb14b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-05-26 Eric Botcazou + + * gnat.dg/specs/last_bit.ads: New test. + 2013-05-13 Uros Bizjak PR target/57264 diff --git a/gcc/testsuite/gnat.dg/specs/last_bit.ads b/gcc/testsuite/gnat.dg/specs/last_bit.ads new file mode 100644 index 000000000000..ecfc2540a8ae --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/last_bit.ads @@ -0,0 +1,19 @@ +-- { dg-do compile } + +package Last_Bit is + + Max_Components : constant := 100; + type Count_Type is new Natural range 0 .. Max_Components; + subtype Index_Type is Count_Type range 1 .. Count_Type'Last; + + type List_Type is array (Index_Type range <>) of Integer; + + type Record_Type (Count : Count_Type := 0) is record + List : List_Type (1 .. Count); + end record; + + Null_Record : Record_Type (Count => 0); + + List_Last_Bit : Integer := Null_Record.List'Last_Bit; + +end Last_Bit; -- 2.47.2