diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2023-11-16 19:45:41 +0100 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-11-30 11:12:46 +0100 |
commit | 2a50a4d4bca09c1c1b255f3ce6c06be57f62889b (patch) | |
tree | a6926631809b75fd4fd794ff395f7928424cc5c8 | |
parent | ab0efa304ffd7139105139c90de63ca0651ef274 (diff) | |
download | gcc-2a50a4d4bca09c1c1b255f3ce6c06be57f62889b.zip gcc-2a50a4d4bca09c1c1b255f3ce6c06be57f62889b.tar.gz gcc-2a50a4d4bca09c1c1b255f3ce6c06be57f62889b.tar.bz2 |
ada: Fix wrong finalization for qualified aggregate of limited type in allocator
This happens with -gnata when the limited type has controlled components
and a predicate, because the predicate check generated for the aggregate
causes the creation of a temporary that is used as the expression of the
allocator. Now this combination is illegal for a limited type, so the
compiler does not generate the deep adjustment that would be necessary
for the access value, which ultimately results in a wrong finalization.
gcc/ada/
* checks.adb (Apply_Predicate_Check): Also deal specifically with
an expression that is a qualified aggregate in an allocator.
-rw-r--r-- | gcc/ada/checks.adb | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 6525982..84a21b2 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -2851,6 +2851,27 @@ package body Checks is (Typ, Duplicate_Subexpr (Name (Par)))); return; + -- Similarly, if the expression is a qualified aggregate in an + -- allocator, apply the check to the dereference of the access + -- value, rather than create a temporary. This is necessary for + -- inherently limited types, for which the temporary is illegal. + + elsif Nkind (Par) = N_Allocator then + declare + Deref : constant Node_Id := + Make_Explicit_Dereference (Sloc (N), + Prefix => Duplicate_Subexpr (Par)); + + begin + -- This is required by Predicate_Check_In_Scope ??? + + Preserve_Comes_From_Source (Deref, N); + + Insert_Action_After (Parent (Par), + Make_Predicate_Check (Typ, Deref)); + return; + end; + -- Similarly, if the expression is an aggregate in an object -- declaration, apply it to the object after the declaration. |