decl.c (gnat_to_gnu_entity): Remove superfluous computation for the max size.
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 27 Oct 2014 10:56:04 +0000 (10:56 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 27 Oct 2014 10:56:04 +0000 (10:56 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Remove
superfluous computation for the max size.
<E_Array_Subtype>: Likewise.  Make sure that the max size calculation
does not overflow at compile time.

From-SVN: r216725

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/entry_queues2.adb [new file with mode: 0644]

index 7c3f5bb7c7d434f22127b00d341bdb39a50bf05b..bb092c81c666db1e9948bffce8308927f2a9c21c 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-27  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Remove
+       superfluous computation for the max size.
+       <E_Array_Subtype>: Likewise.  Make sure that the max size calculation
+       does not overflow at compile time.
+
 2014-10-23  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_eval.adb (Check_Non_Static_Context): Do not set
index b68870d4273da9a1180d706f1c3d7848c626a2c6..97fd3b5a854252341c134fc70079a6f279fd880f 100644 (file)
@@ -2127,11 +2127,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
                tree gnu_max
                  = convert (sizetype, TYPE_MAX_VALUE (gnu_index_type));
                tree gnu_this_max
-                 = size_binop (MAX_EXPR,
-                               size_binop (PLUS_EXPR, size_one_node,
-                                           size_binop (MINUS_EXPR,
-                                                       gnu_max, gnu_min)),
-                               size_zero_node);
+                 = size_binop (PLUS_EXPR, size_one_node,
+                               size_binop (MINUS_EXPR, gnu_max, gnu_min));
 
                if (TREE_CODE (gnu_this_max) == INTEGER_CST
                    && TREE_OVERFLOW (gnu_this_max))
@@ -2464,20 +2461,26 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
                    gnu_max_size = NULL_TREE;
                  else
                    {
-                     tree gnu_this_max
-                       = size_binop (MAX_EXPR,
-                                     size_binop (PLUS_EXPR, size_one_node,
-                                                 size_binop (MINUS_EXPR,
+                     tree gnu_this_max;
+
+                     /* Use int_const_binop if the bounds are constant to
+                        avoid any unwanted overflow.  */
+                     if (TREE_CODE (gnu_base_min) == INTEGER_CST
+                         && TREE_CODE (gnu_base_max) == INTEGER_CST)
+                       gnu_this_max
+                         = int_const_binop (PLUS_EXPR, size_one_node,
+                                            int_const_binop (MINUS_EXPR,
                                                              gnu_base_max,
-                                                             gnu_base_min)),
-                                     size_zero_node);
-
-                     if (TREE_CODE (gnu_this_max) == INTEGER_CST
-                         && TREE_OVERFLOW (gnu_this_max))
-                       gnu_max_size = NULL_TREE;
+                                                             gnu_base_min));
                      else
-                       gnu_max_size
-                         = size_binop (MULT_EXPR, gnu_max_size, gnu_this_max);
+                       gnu_this_max
+                         = size_binop (PLUS_EXPR, size_one_node,
+                                       size_binop (MINUS_EXPR,
+                                                   gnu_base_max,
+                                                   gnu_base_min));
+
+                     gnu_max_size
+                       = size_binop (MULT_EXPR, gnu_max_size, gnu_this_max);
                    }
                }
 
index 788786c068eed6fcc7f0b0e2f2b3fef4f359751a..89d8d8edb886a560547417cefb9f0233a9017325 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-27  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/entry_queues2.adb: New test.
+
 2014-10-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/63641
diff --git a/gcc/testsuite/gnat.dg/entry_queues2.adb b/gcc/testsuite/gnat.dg/entry_queues2.adb
new file mode 100644 (file)
index 0000000..a1445ce
--- /dev/null
@@ -0,0 +1,45 @@
+-- { dg-do compile }
+
+procedure Entry_Queues2 is
+
+    F1 : Integer := 17;
+
+    generic
+        type T is limited private;
+    procedure Check;
+
+    procedure Check is
+    begin
+        declare
+            type Poe is new T;
+        begin
+            declare
+                type Arr is array (1 .. 2) of Poe;
+                X : Arr;
+                pragma Unreferenced (X);
+            begin
+                null;
+            end;
+        end;
+    end;
+
+begin
+
+    declare
+        protected type Poe (D3 : Integer := F1) is
+            entry E (D3 .. F1);    -- F1 evaluated
+        end Poe;
+        protected body Poe is
+            entry E (for I in D3 .. F1) when True is
+            begin
+                null;
+            end E;
+        end Poe;
+
+        procedure Chk is new Check (Poe);
+
+    begin
+        Chk;
+    end;
+
+end;