[Ada] Fix position of subprogram body generated for static predicate
authorEd Schonberg <schonberg@adacore.com>
Fri, 5 Jul 2019 07:03:20 +0000 (07:03 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 5 Jul 2019 07:03:20 +0000 (07:03 +0000)
2019-07-05  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch13.adb (Build_Predicate_Functions): If a subtype that
carries a static predicate aspect is frozen immediately after
its declaration, ensure that the generated function body created
for predicate checking is inserted after the corresponding
subprogram declaration, which is created at the point the
declaration is elaborated.

From-SVN: r273122

gcc/ada/ChangeLog
gcc/ada/sem_ch13.adb

index 6da90f23352eaac93cafffe5ef32659b65b74a31..c5dcd03907911a889eea8ff7081aebfed523b0e2 100644 (file)
@@ -1,3 +1,12 @@
+2019-07-05  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch13.adb (Build_Predicate_Functions): If a subtype that
+       carries a static predicate aspect is frozen immediately after
+       its declaration, ensure that the generated function body created
+       for predicate checking is inserted after the corresponding
+       subprogram declaration, which is created at the point the
+       declaration is elaborated.
+
 2019-07-05  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * exp_ch7.adb (Cleanup_Record): Use the underlying type when
index b18f74ba548f2314c8f308fab0132b290e455d05..4c743666b234df5d62c565924b19420210b19c0d 100644 (file)
@@ -8902,9 +8902,15 @@ package body Sem_Ch13 is
                         Expression => Expr))));
 
             --  The declaration has been analyzed when created, and placed
-            --  after type declaration. Insert body itself after freeze node.
+            --  after type declaration. Insert body itself after freeze node,
+            --  unless subprogram declaration is already there, in which case
+            --  body better be placed afterwards.
 
-            Insert_After_And_Analyze (N, FBody);
+            if FDecl = Next (N) then
+               Insert_After_And_Analyze (FDecl, FBody);
+            else
+               Insert_After_And_Analyze (N, FBody);
+            end if;
 
             --  The defining identifier of a quantified expression carries the
             --  scope in which the type appears, but when unnesting we need