[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Fri, 17 Oct 2014 09:11:14 +0000 (11:11 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 17 Oct 2014 09:11:14 +0000 (11:11 +0200)
2014-10-17  Ed Schonberg  <schonberg@adacore.com>

* exp_ch3.adb (Build_Component_Invariant_Call): Retrieve Invariant
subprogram from base type.
* sem_ch7.adb (Analyze_Package_Specification): Build invariant
subprogram for private type, not any of its subtypes.
* sem_ch13.adb (Build_Invariant_Procedure_Declaration): Set type
of procedure entity, because a call to it may be generated in
a client unit before the corresponding subprogram declaration
is analyzed.

2014-10-17  Vincent Celier  <celier@adacore.com>

* prj-nmsc.adb (Get_Directories): Do not create directories
when a project is abstract.

2014-10-17  Ed Schonberg  <schonberg@adacore.com>

* sem_ch5.adb (Analyze_Iterator_Specification): If the domain
of iteration is given by an expression that is not an array type,
verify that its type implements an iterator iterface.

From-SVN: r216380

gcc/ada/ChangeLog
gcc/ada/exp_ch3.adb
gcc/ada/prj-nmsc.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_ch5.adb
gcc/ada/sem_ch7.adb

index 7ae4ea2a0b9293352e511446f9c1e1f026ea746e..63cf230a00152095cc58f45cc181d24629cd14d0 100644 (file)
@@ -1,3 +1,25 @@
+2014-10-17  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_ch3.adb (Build_Component_Invariant_Call): Retrieve Invariant
+       subprogram from base type.
+       * sem_ch7.adb (Analyze_Package_Specification): Build invariant
+       subprogram for private type, not any of its subtypes.
+       * sem_ch13.adb (Build_Invariant_Procedure_Declaration): Set type
+       of procedure entity, because a call to it may be generated in
+       a client unit before the corresponding subprogram declaration
+       is analyzed.
+
+2014-10-17  Vincent Celier  <celier@adacore.com>
+
+       * prj-nmsc.adb (Get_Directories): Do not create directories
+       when a project is abstract.
+
+2014-10-17  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch5.adb (Analyze_Iterator_Specification): If the domain
+       of iteration is given by an expression that is not an array type,
+       verify that its type implements an iterator iterface.
+
 2014-10-17  Robert Dewar  <dewar@adacore.com>
 
        * sem_attr.adb (Eval_Attribute): Ensure that attribute
index 837e58fd47159f16dc806c554beaaea635b481a3..dd6d34e00267c92fa872e2fa69d8cf5b539002e3 100644 (file)
@@ -3720,10 +3720,12 @@ package body Exp_Ch3 is
             end if;
          end if;
 
+         --  The aspect is type-specific, so retrieve it from the base type.
+
          Call :=
            Make_Procedure_Call_Statement (Loc,
              Name                   =>
-               New_Occurrence_Of (Invariant_Procedure (Typ), Loc),
+               New_Occurrence_Of (Invariant_Procedure (Base_Type (Typ)), Loc),
              Parameter_Associations => New_List (Sel_Comp));
 
          if Is_Access_Type (Etype (Comp)) then
index 93b5963b644b6a11f6c699a5e952d1153da309e8..0e0117af7b40cc1e7d52d9b43bfbdbb6e578ce12 100644 (file)
@@ -5498,13 +5498,15 @@ package body Prj.Nmsc is
       Dir_Exists : Boolean;
 
       No_Sources : constant Boolean :=
-                     ((not Source_Files.Default
+                     Project.Qualifier = Abstract_Project
+                       or else
+                     (((not Source_Files.Default
                         and then Source_Files.Values = Nil_String)
                        or else (not Source_Dirs.Default
                                  and then Source_Dirs.Values = Nil_String)
                        or else (not Languages.Default
                                  and then Languages.Values = Nil_String))
-                     and then Project.Extends = No_Project;
+                     and then Project.Extends = No_Project);
 
    --  Start of processing for Get_Directories
 
index b486a68fab6b716c2b7142e325530f64b8b77352..71442ae7263493ccda2929c9a15b924f018cd485 100644 (file)
@@ -3903,6 +3903,7 @@ package body Sem_Ch13 is
 
          if Ctrl = Ent
            or else Ctrl = Class_Wide_Type (Ent)
+
            or else
              (Ekind (Ctrl) = E_Anonymous_Access_Type
                and then
@@ -7393,6 +7394,7 @@ package body Sem_Ch13 is
           Chars => New_External_Name (Chars (Typ), "Invariant"));
       Set_Has_Invariants (Typ);
       Set_Ekind (SId, E_Procedure);
+      Set_Etype (SId, Standard_Void_Type);
       Set_Is_Invariant_Procedure (SId);
       Set_Invariant_Procedure (Typ, SId);
 
index 22d11b01e653d180577e0cc6cfb2f068e739f497..c8d27f1384be6078a860da86a0877e1ce7e82958 100644 (file)
@@ -1838,6 +1838,17 @@ package body Sem_Ch5 is
 
             else
                Typ := Etype (Iter_Name);
+
+               --  Verify that the expression produces an iterator.
+
+               if not Of_Present (N) and then not Is_Iterator (Typ)
+                 and then not Is_Array_Type (Typ)
+                 and then No (Find_Aspect (Typ, Aspect_Iterable))
+               then
+                  Error_Msg_N
+                    ("expect object that implements iterator interface",
+                        Iter_Name);
+               end if;
             end if;
 
             --  Protect against malformed iterator
index 2d96314fc35c75139ec8157b642ec56462a0b162..bfbf85893d95f5236d347bb43cd36f14678d1075 100644 (file)
@@ -1384,7 +1384,11 @@ package body Sem_Ch7 is
             end if;
 
             if Has_Invariants (E) then
-               Build_Invariant_Procedure (E, N);
+               if Ekind (E) = E_Private_Subtype then
+                  null;
+               else
+                  Build_Invariant_Procedure (E, N);
+               end if;
             end if;
          end if;