From b9364a56d107083858267a52f162391d8cabb2f7 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 9 May 2020 22:36:11 +0200 Subject: [PATCH] Accept qualified aggregates in memset path Aggregates can be surrounded by a qualified expression and this prepares the support code in gigi for accepting them. * gcc-interface/trans.c (gnat_to_gnu) : Deal with qualified "others" aggregates in the memset case. --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/trans.c | 28 ++++++++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 20662be25c7..6aec0eeede1 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2020-05-09 Eric Botcazou + + * gcc-interface/trans.c (gnat_to_gnu) : Deal + with qualified "others" aggregates in the memset case. + 2020-05-09 Eric Botcazou * gcc-interface/decl.c (gnat_to_gnu_param): Also back-annotate the diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 20529e157e0..5de04abb97f 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -7813,25 +7813,29 @@ gnat_to_gnu (Node_Id gnat_node) else { const Node_Id gnat_expr = Expression (gnat_node); + const Node_Id gnat_inner + = Nkind (gnat_expr) == N_Qualified_Expression + ? Expression (gnat_expr) + : gnat_expr; const Entity_Id gnat_type = Underlying_Type (Etype (Name (gnat_node))); const bool regular_array_type_p - = (Is_Array_Type (gnat_type) && !Is_Bit_Packed_Array (gnat_type)); + = Is_Array_Type (gnat_type) && !Is_Bit_Packed_Array (gnat_type); const bool use_memset_p - = (regular_array_type_p - && Nkind (gnat_expr) == N_Aggregate - && Is_Others_Aggregate (gnat_expr)); + = regular_array_type_p + && Nkind (gnat_inner) == N_Aggregate + && Is_Others_Aggregate (gnat_inner); - /* If we'll use memset, we need to find the inner expression. */ + /* If we use memset, we need to find the innermost expression. */ if (use_memset_p) { - Node_Id gnat_inner - = Expression (First (Component_Associations (gnat_expr))); - while (Nkind (gnat_inner) == N_Aggregate - && Is_Others_Aggregate (gnat_inner)) - gnat_inner - = Expression (First (Component_Associations (gnat_inner))); - gnu_rhs = gnat_to_gnu (gnat_inner); + gnat_temp = gnat_inner; + do { + gnat_temp + = Expression (First (Component_Associations (gnat_temp))); + } while (Nkind (gnat_temp) == N_Aggregate + && Is_Others_Aggregate (gnat_temp)); + gnu_rhs = gnat_to_gnu (gnat_temp); } else gnu_rhs = maybe_unconstrained_array (gnat_to_gnu (gnat_expr)); -- 2.30.2