From de6cad7c5c435279a851b6546d7cb6cd3001d96c Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Wed, 5 Dec 2012 11:47:30 +0100 Subject: [PATCH] [multiple changes] 2012-12-05 Ed Schonberg * par-ch6.adb (P_Return_Object_Declaration): Do not check for legality of Aliased keyword. * sem_ch6.adb (Analyze_Function_Return): The keyword aliased is legal in an extended return statement only if the return type is immutably limited. 2012-12-05 Javier Miranda * exp_disp.adb (Expand_Interface_Thunk): Simplify management of controlling formals. Required to avoid problems with primitives of internally generated base types associated with constrained tagged types. From-SVN: r194201 --- gcc/ada/ChangeLog | 15 +++++++++++++++ gcc/ada/exp_disp.adb | 7 ++----- gcc/ada/par-ch6.adb | 9 ++------- gcc/ada/sem_ch6.adb | 17 ++++++++++++++++- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 0443c11260f..b7da722bfc0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,18 @@ +2012-12-05 Ed Schonberg + + * par-ch6.adb (P_Return_Object_Declaration): Do not check for + legality of Aliased keyword. + * sem_ch6.adb (Analyze_Function_Return): The keyword aliased is + legal in an extended return statement only if the return type + is immutably limited. + +2012-12-05 Javier Miranda + + * exp_disp.adb (Expand_Interface_Thunk): Simplify + management of controlling formals. Required to avoid problems + with primitives of internally generated base types associated + with constrained tagged types. + 2012-12-05 Ed Schonberg * sem_eval.adb: Remove spurious warnings. diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb index c3cd9c037b2..8706b9e6456 100644 --- a/gcc/ada/exp_disp.adb +++ b/gcc/ada/exp_disp.adb @@ -1635,7 +1635,6 @@ package body Exp_Disp is Formals : constant List_Id := New_List; Target : constant Entity_Id := Ultimate_Alias (Prim); - Controlling_Typ : Entity_Id; Decl_1 : Node_Id; Decl_2 : Node_Id; Expr : Node_Id; @@ -1713,8 +1712,6 @@ package body Exp_Disp is Next_Formal (Formal); end loop; - Controlling_Typ := Find_Dispatching_Type (Target); - Target_Formal := First_Formal (Target); Formal := First (Formals); while Present (Formal) loop @@ -1741,7 +1738,7 @@ package body Exp_Disp is if Ekind (Target_Formal) = E_In_Parameter and then Ekind (Etype (Target_Formal)) = E_Anonymous_Access_Type - and then Ftyp = Controlling_Typ + and then Is_Controlling_Formal (Target_Formal) then -- Generate: -- type T is access all <> @@ -1799,7 +1796,7 @@ package body Exp_Disp is (Defining_Identifier (Decl_2), New_Reference_To (Defining_Identifier (Decl_1), Loc))); - elsif Ftyp = Controlling_Typ then + elsif Is_Controlling_Formal (Target_Formal) then -- Generate: -- S1 : Storage_Offset := Storage_Offset!(Formal'Address) diff --git a/gcc/ada/par-ch6.adb b/gcc/ada/par-ch6.adb index c0fc7734e72..6ad3467a5d2 100644 --- a/gcc/ada/par-ch6.adb +++ b/gcc/ada/par-ch6.adb @@ -1721,13 +1721,8 @@ package body Ch6 is Scan; -- past ALIASED Set_Aliased_Present (Decl_Node); - if Ada_Version < Ada_2012 then - Error_Msg_SC -- CODEFIX - ("ALIASED not allowed in extended return in Ada 2012?"); - else - Error_Msg_SC -- CODEFIX - ("ALIASED not allowed in extended return"); - end if; + -- The restrictions on the use of aliased in an extended return + -- are semantic, not syntactic. if Token = Tok_Constant then Scan; -- past CONSTANT diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 22feaebedc4..cfa709cd9d2 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -787,6 +787,7 @@ package body Sem_Ch6 is Analyze_And_Resolve (Expr, R_Type); Check_Limited_Return (Expr); + end if; -- RETURN only allowed in SPARK as the last statement in function @@ -806,8 +807,9 @@ package body Sem_Ch6 is -- Analyze parts specific to extended_return_statement: declare - Obj_Decl : constant Node_Id := + Obj_Decl : constant Node_Id := Last (Return_Object_Declarations (N)); + Has_Aliased : constant Boolean := Aliased_Present (Obj_Decl); HSS : constant Node_Id := Handled_Statement_Sequence (N); @@ -842,6 +844,19 @@ package body Sem_Ch6 is Set_Referenced (Defining_Identifier (Obj_Decl)); Check_References (Stm_Entity); + + -- Check RM 6.5 (5.9/3) + + if Has_Aliased then + if Ada_Version < Ada_2012 then + Error_Msg_N ("aliased only allowed for limited" + & " return objects in Ada 2012?", N); + + elsif not Is_Immutably_Limited_Type (R_Type) then + Error_Msg_N ("aliased only allowed for limited" + & " return objects", N); + end if; + end if; end; end if; -- 2.30.2