Be prepared for more aggregates in gigi

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.
This commit is contained in:
Eric Botcazou 2020-05-12 22:34:50 +02:00
parent 90b160f8ec
commit 27c3d986c4
5 changed files with 34 additions and 7 deletions

View 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> 2020-05-12 Eric Botcazou <ebotcazou@adacore.com>
PR ada/95035 PR ada/95035

View File

@ -253,9 +253,9 @@ extern Boolean No_Exception_Handlers_Set (void);
/* sem_aggr: */ /* 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: */ /* sem_aux: */

View File

@ -7887,7 +7887,7 @@ gnat_to_gnu (Node_Id gnat_node)
const bool use_memset_p const bool use_memset_p
= regular_array_type_p = regular_array_type_p
&& Nkind (gnat_inner) == N_Aggregate && 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 we use memset, we need to find the innermost expression. */
if (use_memset_p) if (use_memset_p)
@ -7897,7 +7897,7 @@ gnat_to_gnu (Node_Id gnat_node)
gnat_temp gnat_temp
= Expression (First (Component_Associations (gnat_temp))); = Expression (First (Component_Associations (gnat_temp)));
} while (Nkind (gnat_temp) == N_Aggregate } while (Nkind (gnat_temp) == N_Aggregate
&& Is_Others_Aggregate (gnat_temp)); && Is_Single_Aggregate (gnat_temp));
gnu_rhs = gnat_to_gnu (gnat_temp); gnu_rhs = gnat_to_gnu (gnat_temp);
} }
else else

View File

@ -832,13 +832,26 @@ package body Sem_Aggr is
------------------------- -------------------------
function Is_Others_Aggregate (Aggr : Node_Id) return Boolean is function Is_Others_Aggregate (Aggr : Node_Id) return Boolean is
Assoc : constant List_Id := Component_Associations (Aggr);
begin begin
return No (Expressions (Aggr)) return No (Expressions (Aggr))
and then and then Nkind (First (Choice_List (First (Assoc)))) = N_Others_Choice;
Nkind (First (Choice_List (First (Component_Associations (Aggr))))) =
N_Others_Choice;
end Is_Others_Aggregate; 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 -- -- Is_Top_Level_Aggregate --
---------------------------- ----------------------------

View File

@ -37,6 +37,9 @@ package Sem_Aggr is
function Is_Others_Aggregate (Aggr : Node_Id) return Boolean; function Is_Others_Aggregate (Aggr : Node_Id) return Boolean;
-- Returns True is aggregate Aggr consists of a single OTHERS choice -- 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 -- WARNING: There is a matching C declaration of this subprogram in fe.h
end Sem_Aggr; end Sem_Aggr;