Be prepared for more aggregates in gigi
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 12 May 2020 20:34:50 +0000 (22:34 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 12 May 2020 20:35:55 +0000 (22:35 +0200)
This makes sure that gigi is prepared to handle more aggregates in the
special memset code path.

* sem_aggr.ads (Is_Single_Aggregate): New function.
* sem_aggr.adb (Is_Others_Aggregate): Use local variable.
(Is_Single_Aggregate): New function to recognize an aggregate with
a single association containing a single choice.
* fe.h (Is_Others_Aggregate): Delete.
(Is_Single_Aggregate): New declaration.
* gcc-interface/trans.c (gnat_to_gnu) <N_Assignment_Statement>: Call
Is_Single_Aggregate instead of Is_Others_Aggregate.

gcc/ada/ChangeLog
gcc/ada/fe.h
gcc/ada/gcc-interface/trans.c
gcc/ada/sem_aggr.adb
gcc/ada/sem_aggr.ads

index 3502eb83d5e2c65575bee478ad118b0cfbb31825..0068265649ba6224fb0e66b604349bf44c6e12bf 100644 (file)
@@ -1,3 +1,14 @@
+2020-05-12  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * sem_aggr.ads (Is_Single_Aggregate): New function.
+       * sem_aggr.adb (Is_Others_Aggregate): Use local variable.
+       (Is_Single_Aggregate): New function to recognize an aggregate with
+       a single association containing a single choice.
+       * fe.h (Is_Others_Aggregate): Delete.
+       (Is_Single_Aggregate): New declaration.
+       * gcc-interface/trans.c (gnat_to_gnu) <N_Assignment_Statement>: Call
+       Is_Single_Aggregate instead of Is_Others_Aggregate.
+
 2020-05-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR ada/95035
index 6b3f300301c031526dbdd5b55a910e6d936db834..99613282213856b8754805830f3cdc51d6801a4a 100644 (file)
@@ -253,9 +253,9 @@ extern Boolean No_Exception_Handlers_Set    (void);
 
 /* sem_aggr:  */
 
-#define Is_Others_Aggregate    sem_aggr__is_others_aggregate
+#define Is_Single_Aggregate    sem_aggr__is_single_aggregate
 
-extern Boolean Is_Others_Aggregate     (Node_Id);
+extern Boolean Is_Single_Aggregate     (Node_Id);
 
 /* sem_aux:  */
 
index cddeae3081af0e049c1711f1c5a0d819025f9aef..b7a4cadb7e62191629477386712282247139c020 100644 (file)
@@ -7887,7 +7887,7 @@ gnat_to_gnu (Node_Id gnat_node)
          const bool use_memset_p
            = regular_array_type_p
              && Nkind (gnat_inner) == N_Aggregate
-             && Is_Others_Aggregate (gnat_inner);
+             && Is_Single_Aggregate (gnat_inner);
 
          /* If we use memset, we need to find the innermost expression.  */
          if (use_memset_p)
@@ -7897,7 +7897,7 @@ gnat_to_gnu (Node_Id gnat_node)
                gnat_temp
                  = Expression (First (Component_Associations (gnat_temp)));
              } while (Nkind (gnat_temp) == N_Aggregate
-                      && Is_Others_Aggregate (gnat_temp));
+                      && Is_Single_Aggregate (gnat_temp));
              gnu_rhs = gnat_to_gnu (gnat_temp);
            }
          else
index e41fcdb6cc0e33b582ab34d94140423b07930d85..5a26cf9c7fd294b52de97403e9c9e4f0edd7853b 100644 (file)
@@ -832,13 +832,26 @@ package body Sem_Aggr is
    -------------------------
 
    function Is_Others_Aggregate (Aggr : Node_Id) return Boolean is
+      Assoc : constant List_Id := Component_Associations (Aggr);
+
    begin
       return No (Expressions (Aggr))
-        and then
-          Nkind (First (Choice_List (First (Component_Associations (Aggr))))) =
-            N_Others_Choice;
+        and then Nkind (First (Choice_List (First (Assoc)))) = N_Others_Choice;
    end Is_Others_Aggregate;
 
+   -------------------------
+   -- Is_Single_Aggregate --
+   -------------------------
+
+   function Is_Single_Aggregate (Aggr : Node_Id) return Boolean is
+      Assoc : constant List_Id := Component_Associations (Aggr);
+
+   begin
+      return No (Expressions (Aggr))
+        and then No (Next (First (Assoc)))
+        and then No (Next (First (Choice_List (First (Assoc)))));
+   end Is_Single_Aggregate;
+
    ----------------------------
    -- Is_Top_Level_Aggregate --
    ----------------------------
index 1d4f3489d78d86e06ea40c5c14da42626a67fb71..13519a25742619c641bf36d9d1bfb80a9f18db58 100644 (file)
@@ -37,6 +37,9 @@ package Sem_Aggr is
    function Is_Others_Aggregate (Aggr : Node_Id) return Boolean;
    --  Returns True is aggregate Aggr consists of a single OTHERS choice
 
+   function Is_Single_Aggregate (Aggr : Node_Id) return Boolean;
+   --  Returns True is aggregate Aggr consists of a single choice
+
    --  WARNING: There is a matching C declaration of this subprogram in fe.h
 
 end Sem_Aggr;