From 7d6fb253c105bc78929749d990a5200c9a52dbbf Mon Sep 17 00:00:00 2001 From: charlet Date: Mon, 20 Oct 2014 14:13:02 +0000 Subject: [PATCH] 2014-10-20 Ed Schonberg * sem_ch13.adb: Improve error recovery on illegal aspect. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@216472 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 4 ++++ gcc/ada/sem_ch13.adb | 44 ++++++++++++++++++++++++++++---------------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index a304daaeb5b..f22d38bbd96 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,7 @@ +2014-10-20 Ed Schonberg + + * sem_ch13.adb: Improve error recovery on illegal aspect. + 2014-10-20 Arnaud Charlet * set_targ.adb (Write_Target_Dependent_Values, Write_Line): diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index c8cfd031b36..8b716f47584 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -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 -- 2.11.4.GIT