diff mbox series

[Ada] Be prepared for more aggregates in gigi

Message ID 3796486.fGCPiDdZM2@polaris
State New
Headers show
Series [Ada] Be prepared for more aggregates in gigi | expand

Commit Message

Eric Botcazou May 12, 2020, 8:36 p.m. UTC
This makes sure that gigi is prepared to handle more aggregates in the special 
memset code path.

Tested on x86-64/Linux, applied on the mainline.


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.
diff mbox series

Patch

diff --git a/gcc/ada/fe.h b/gcc/ada/fe.h
index 6b3f300301c..99613282213 100644
--- a/gcc/ada/fe.h
+++ b/gcc/ada/fe.h
@@ -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:  */
 
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index cddeae3081a..b7a4cadb7e6 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -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
diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb
index e41fcdb6cc0..5a26cf9c7fd 100644
--- a/gcc/ada/sem_aggr.adb
+++ b/gcc/ada/sem_aggr.adb
@@ -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 --
    ----------------------------
diff --git a/gcc/ada/sem_aggr.ads b/gcc/ada/sem_aggr.ads
index 1d4f3489d78..13519a25742 100644
--- a/gcc/ada/sem_aggr.ads
+++ b/gcc/ada/sem_aggr.ads
@@ -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;