diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2023-04-11 12:15:22 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-05-30 09:12:15 +0200 |
commit | 3590b8e7850cc77324c0116718d3587401142d1c (patch) | |
tree | 298178bec811c612ad28180c2e493edc63fb5746 | |
parent | 7302efc23eb80f9a40954ac7e316889cd848ca12 (diff) | |
download | gcc-3590b8e7850cc77324c0116718d3587401142d1c.zip gcc-3590b8e7850cc77324c0116718d3587401142d1c.tar.gz gcc-3590b8e7850cc77324c0116718d3587401142d1c.tar.bz2 |
ada: Fix visibility error with DIC or Type_Invariant aspect on generic type
The compiler fails to capture global references during the analysis of the
aspect on the generic type because it analyzes a copy of the expression.
gcc/ada/
* exp_util.adb (Build_DIC_Procedure_Body.Add_Own_DIC): When inside
a generic unit, preanalyze the expression directly.
(Build_Invariant_Procedure_Body.Add_Own_Invariants): Likewise.
-rw-r--r-- | gcc/ada/exp_util.adb | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index 2582524..4c48445 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -1853,7 +1853,15 @@ package body Exp_Util is begin pragma Assert (Present (DIC_Expr)); - Expr := New_Copy_Tree (DIC_Expr); + + -- We need to preanalyze the expression itself inside a generic to + -- be able to capture global references present in it. + + if Inside_A_Generic then + Expr := DIC_Expr; + else + Expr := New_Copy_Tree (DIC_Expr); + end if; -- Perform the following substitution: @@ -3111,7 +3119,14 @@ package body Exp_Util is return; end if; - Expr := New_Copy_Tree (Prag_Expr); + -- We need to preanalyze the expression itself inside a generic + -- to be able to capture global references present in it. + + if Inside_A_Generic then + Expr := Prag_Expr; + else + Expr := New_Copy_Tree (Prag_Expr); + end if; -- Substitute all references to type T with references to the -- _object formal parameter. |