sem_ch13.adb: Improve error recovery on illegal aspect.
authorEd Schonberg <schonberg@adacore.com>
Mon, 20 Oct 2014 14:13:02 +0000 (14:13 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 20 Oct 2014 14:13:02 +0000 (16:13 +0200)
2014-10-20  Ed Schonberg  <schonberg@adacore.com>

* sem_ch13.adb: Improve error recovery on illegal aspect.

From-SVN: r216472

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

index a304daaeb5ba40584ece6e0c9094253ca5726a77..f22d38bbd96376c39d1f41693bf2c34c4f678dfd 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-20  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch13.adb: Improve error recovery on illegal aspect.
+
 2014-10-20  Arnaud Charlet  <charlet@adacore.com>
 
        * set_targ.adb (Write_Target_Dependent_Values, Write_Line):
index c8cfd031b36e0b63d71f68be44efada0cf5a1099..8b716f47584b9f6fa6bb5b36968c80bcc6dfdc21 100644 (file)
@@ -1119,33 +1119,39 @@ package body Sem_Ch13 is
                case A_Id is
 
                   --  For aspects whose expression is an optional Boolean, make
-                  --  the corresponding pragma at the freezing point.
+                  --  the corresponding pragma at the freeze point.
 
-               when Boolean_Aspects      |
-                    Library_Unit_Aspects =>
-                  Make_Pragma_From_Boolean_Aspect (ASN);
+                  when Boolean_Aspects      |
+                       Library_Unit_Aspects =>
+                     Make_Pragma_From_Boolean_Aspect (ASN);
 
                   --  Special handling for aspects that don't correspond to
                   --  pragmas/attributes.
 
-               when Aspect_Default_Value           |
-                    Aspect_Default_Component_Value =>
-                  Analyze_Aspect_Default_Value (ASN);
+                  when Aspect_Default_Value           |
+                       Aspect_Default_Component_Value =>
+                     Analyze_Aspect_Default_Value (ASN);
 
                   --  Ditto for iterator aspects, because the corresponding
                   --  attributes may not have been analyzed yet.
 
-               when Aspect_Constant_Indexing |
-                    Aspect_Variable_Indexing |
-                    Aspect_Default_Iterator  |
-                    Aspect_Iterator_Element  =>
-                  Analyze (Expression (ASN));
+                  when Aspect_Constant_Indexing |
+                       Aspect_Variable_Indexing |
+                       Aspect_Default_Iterator  |
+                       Aspect_Iterator_Element  =>
+                     Analyze (Expression (ASN));
 
-               when Aspect_Iterable =>
-                  Validate_Iterable_Aspect (E, ASN);
+                     if Etype (Expression (ASN)) = Any_Type then
+                        Error_Msg_NE
+                          ("\aspect must be fully defined before & is frozen",
+                           ASN, E);
+                     end if;
 
-               when others =>
-                  null;
+                  when Aspect_Iterable =>
+                     Validate_Iterable_Aspect (E, ASN);
+
+                  when others =>
+                     null;
                end case;
 
                Ritem := Aspect_Rep_Item (ASN);
@@ -3901,6 +3907,9 @@ package body Sem_Ch13 is
             Ctrl := Etype (First_Formal (Subp));
          end if;
 
+         --  Type of formal may be the class-wide type, an access to such,
+         --  or an incomplete view.
+
          if Ctrl = Ent
            or else Ctrl = Class_Wide_Type (Ent)
            or else
@@ -3908,6 +3917,9 @@ package body Sem_Ch13 is
                and then (Designated_Type (Ctrl) = Ent
                            or else
                          Designated_Type (Ctrl) = Class_Wide_Type (Ent)))
+           or else
+             (Ekind (Ctrl) = E_Incomplete_Type
+               and then Full_View (Ctrl) = Ent)
          then
             null;
          else