]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Compiler crash or errors on if_expression in container aggregate
authorGary Dismukes <dismukes@adacore.com>
Mon, 12 Feb 2024 20:18:36 +0000 (20:18 +0000)
committerMarc Poulhiès <poulhies@adacore.com>
Tue, 14 May 2024 08:19:55 +0000 (10:19 +0200)
The compiler may either crash or incorrectly report errors when
a component association in a container aggregate is an if_expression
with an elsif part whose dependent expression is a call to a function
returning a result that requires finalization. The compiler complains
that a private type is expected, but a package or procedure name was
found. This is due to the compiler improperly associating expanded
calls to Finalize_Object with the aggregate, rather than the enclosing
object declaration being initialized by the aggregate, which can result
in the Finalize_Object procedure call being passed as an actual to
the Add_Unnamed operation of the container type and leading to a type
mismatch and the confusing error message. This is fixed by adjusting
the code that locates the proper context for insertion of Finalize_Object
calls to locate the enclosing declaration or statement rather than
stopping at the aggregate.

gcc/ada/

* exp_util.adb (Find_Hook_Context): Exclude N_*Aggregate Nkinds
of Parent (Par) from the early return in the second loop of the
In_Cond_Expr case, to prevent returning an aggregate from this
function rather than the enclosing declaration or statement.

gcc/ada/exp_util.adb

index 4b1c5322f621b532c98be8672d202e9f8d4b4629..d9623e2ea40a123a1ffdc0961750185617128598 100644 (file)
@@ -6412,7 +6412,9 @@ package body Exp_Util is
               and then Nkind (Parent (Par)) not in N_Function_Call
                                                  | N_Procedure_Call_Statement
                                                  | N_Entry_Call_Statement
-
+                                                 | N_Aggregate
+                                                 | N_Delta_Aggregate
+                                                 | N_Extension_Aggregate
             then
                return Par;