]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[Ada] Fix setting of Has_Predicate flag for aggregate subtypes
authorpmderodat <pmderodat@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Dec 2018 11:11:42 +0000 (11:11 +0000)
committerpmderodat <pmderodat@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Dec 2018 11:11:42 +0000 (11:11 +0000)
This patch enures that the subtype of an aggregate has the Has_Predicate
flag properly set if the array component has a predicate, including the
case the predicate function for the component has not been constructed
yet.

2018-12-11  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_aggr.adb (Array_Aggr_Subtype. Resolve_Aggr_Expr): Indicate
that aggregate subtype has a predicate if the component type has
a predicate; do not rely on exisatence of predicate function for
component, in case component is a type no yet frozen, for which
predicate function has not been created yet.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@267007 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/sem_aggr.adb

index c2305be2ec2113b170822c38a2caf257e0e2e1b4..d9dfb2240d2b5501f7d6c0e9626396ac2d686ce9 100644 (file)
@@ -1,3 +1,11 @@
+2018-12-11  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_aggr.adb (Array_Aggr_Subtype. Resolve_Aggr_Expr): Indicate
+       that aggregate subtype has a predicate if the component type has
+       a predicate; do not rely on exisatence of predicate function for
+       component, in case component is a type no yet frozen, for which
+       predicate function has not been created yet.
+
 2018-12-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * exp_aggr.adb (Packed_Array_Aggregate_Handled): Bail out for
index 5e8705f90af000d51c3a119f2bac37cdf04a11cb..304ff5d29492aa18686b30d5cd399ab5aa43692e 100644 (file)
@@ -611,6 +611,16 @@ package body Sem_Aggr is
       Set_Is_Constrained (Itype, True);
       Set_Is_Internal    (Itype, True);
 
+      if Has_Predicates (Typ) then
+         Set_Has_Predicates (Itype);
+
+         if Present (Predicate_Function (Typ)) then
+            Set_Predicate_Function (Itype, Predicate_Function (Typ));
+         else
+            Set_Predicated_Parent (Itype, Predicated_Parent (Typ));
+         end if;
+      end if;
+
       --  A simple optimization: purely positional aggregates of static
       --  components should be passed to gigi unexpanded whenever possible, and
       --  regardless of the staticness of the bounds themselves. Subsequent
@@ -1627,7 +1637,7 @@ package body Sem_Aggr is
          --  component assignments. If the expression covers several components
          --  the analysis and the predicate check take place later.
 
-         if Present (Predicate_Function (Component_Typ))
+         if Has_Predicates (Component_Typ)
            and then Analyzed (Expr)
          then
             Apply_Predicate_Check (Expr, Component_Typ);
@@ -4194,7 +4204,7 @@ package body Sem_Aggr is
          --  because the aggegate might not be expanded into individual
          --  component assignments.
 
-         if Present (Predicate_Function (Expr_Type))
+         if Has_Predicates (Expr_Type)
            and then Analyzed (Expr)
          then
             Apply_Predicate_Check (Expr, Expr_Type);