+2012-12-05 Ed Schonberg <schonberg@adacore.com>
+
+ * 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 <miranda@adacore.com>
+
+ * 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 <schonberg@adacore.com>
* sem_eval.adb: Remove spurious warnings.
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;
Next_Formal (Formal);
end loop;
- Controlling_Typ := Find_Dispatching_Type (Target);
-
Target_Formal := First_Formal (Target);
Formal := First (Formals);
while Present (Formal) loop
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 <<type of the target formal>>
(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)
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
Analyze_And_Resolve (Expr, R_Type);
Check_Limited_Return (Expr);
+
end if;
-- RETURN only allowed in SPARK as the last statement in function
-- 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);
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;