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:
parent
90b160f8ec
commit
27c3d986c4
@ -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
|
||||||
|
@ -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: */
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 --
|
||||||
----------------------------
|
----------------------------
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user