contracts.adb (Analyze_Contracts): For a type declaration, analyze an iterable aspect...
authorEd Schonberg <schonberg@adacore.com>
Wed, 12 Oct 2016 10:38:17 +0000 (10:38 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 12 Oct 2016 10:38:17 +0000 (12:38 +0200)
2016-10-12  Ed Schonberg  <schonberg@adacore.com>

* contracts.adb (Analyze_Contracts): For a type declaration, analyze
an iterable aspect when present.

From-SVN: r241028

gcc/ada/ChangeLog
gcc/ada/contracts.adb

index 350fc3ef5fad509bda06eb74b90985e9f7bd7813..ad188a70e1bb02c26bd3c0c23855d48cc87d4261 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * contracts.adb (Analyze_Contracts): For a type declaration, analyze
+       an iterable aspect when present.
+
 2016-10-12  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_ch12.adb (Check_Formal_Package_Instance): Handle properly
index c85b650d66b19584bd1bfbacb3bb0fd5fa43fb8c..e26b28d832c8b8e0ff6ea2408449c9b29df68463 100644 (file)
@@ -40,6 +40,7 @@ with Sem_Aux;  use Sem_Aux;
 with Sem_Ch6;  use Sem_Ch6;
 with Sem_Ch8;  use Sem_Ch8;
 with Sem_Ch12; use Sem_Ch12;
+with Sem_Ch13; use Sem_Ch13;
 with Sem_Disp; use Sem_Disp;
 with Sem_Prag; use Sem_Prag;
 with Sem_Util; use Sem_Util;
@@ -408,6 +409,22 @@ package body Contracts is
                                N_Task_Type_Declaration)
          then
             Analyze_Task_Contract (Defining_Entity (Decl));
+
+         --  For type declarations, we need to do the pre-analysis of
+         --  Iterable aspect specifications.
+         --  Other type aspects need to be resolved here???
+
+         elsif Nkind (Decl) = N_Private_Type_Declaration
+           and then Present (Aspect_Specifications (Decl))
+         then
+            declare
+               E  : constant Entity_Id := Defining_Identifier (Decl);
+               It : constant Node_Id   := Find_Aspect (E, Aspect_Iterable);
+            begin
+               if Present (It) then
+                  Validate_Iterable_Aspect (E, It);
+               end if;
+            end;
          end if;
 
          Next (Decl);