From: Eric Botcazou Date: Tue, 11 Apr 2023 10:15:22 +0000 (+0200) Subject: ada: Fix visibility error with DIC or Type_Invariant aspect on generic type X-Git-Tag: basepoints/gcc-15~8766 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3590b8e7850cc77324c0116718d3587401142d1c;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index 2582524b1dd8..4c4844594d2f 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.