aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Dismukes <dismukes@adacore.com>2021-10-25 20:45:50 -0400
committerPierre-Marie de Rodat <derodat@adacore.com>2021-11-09 09:44:47 +0000
commit64cb8ebef32c44ab7cab6021942df0b3d08a5fe5 (patch)
tree9d2964c66c9ca8c9bce47a45d929985e9bbfa23d
parent1275c4031a7d3b55e127cab53f31362469f8c89b (diff)
downloadgcc-64cb8ebef32c44ab7cab6021942df0b3d08a5fe5.zip
gcc-64cb8ebef32c44ab7cab6021942df0b3d08a5fe5.tar.gz
gcc-64cb8ebef32c44ab7cab6021942df0b3d08a5fe5.tar.bz2
[Ada] Errors on globals in expressions of predicate aspects in generic bodies
gcc/ada/ * sem_ch13.adb (Freeze_Entity_Checks): Analyze the expression of a pragma Predicate associated with an aspect at the freeze point of the type, to ensure that references to globals get saved when the aspect occurs within a generic body. Also, add Aspect_Static_Predicate to the choices of the membership test of the enclosing guard.
-rw-r--r--gcc/ada/sem_ch13.adb29
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 6059cee..be9b84e 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -13162,6 +13162,7 @@ package body Sem_Ch13 is
if Get_Aspect_Id (Ritem) in Aspect_CPU
| Aspect_Dynamic_Predicate
| Aspect_Predicate
+ | Aspect_Static_Predicate
| Aspect_Priority
then
-- Retrieve the visibility to components and discriminants
@@ -13169,6 +13170,34 @@ package body Sem_Ch13 is
Push_Type (E);
Check_Aspect_At_Freeze_Point (Ritem);
+
+ -- In the case of predicate aspects, there will be
+ -- a corresponding Predicate pragma associated with
+ -- the aspect, and the expression of the pragma also
+ -- needs to be analyzed at this point, to ensure that
+ -- Save_Global_References will capture global refs in
+ -- expressions that occur in generic bodies, for proper
+ -- later resolution of the pragma in instantiations.
+
+ if Is_Type (E)
+ and then Inside_A_Generic
+ and then Has_Predicates (E)
+ and then Present (Aspect_Rep_Item (Ritem))
+ then
+ declare
+ Pragma_Args : constant List_Id :=
+ Pragma_Argument_Associations
+ (Aspect_Rep_Item (Ritem));
+ Pragma_Expr : constant Node_Id :=
+ Expression (Next (First (Pragma_Args)));
+ begin
+ if Present (Pragma_Expr) then
+ Analyze_And_Resolve
+ (Pragma_Expr, Standard_Boolean);
+ end if;
+ end;
+ end if;
+
Pop_Type (E);
else