[Ada] Implementation of AI12-0152: legality rules for Raise_Expression

gcc/ada/

	* sem_res.adb (Resolve_Raise_Expression): Apply Ada_2020 rules
	concerning the need for parentheses around Raise_Expressions in
	various contexts.
This commit is contained in:
Ed Schonberg 2021-02-18 11:09:36 -05:00 committed by Pierre-Marie de Rodat
parent c50041b99b
commit a2d2310d80

View File

@ -10532,8 +10532,57 @@ package body Sem_Res is
if Typ = Raise_Type then
Error_Msg_N ("cannot find unique type for raise expression", N);
Set_Etype (N, Any_Type);
else
Set_Etype (N, Typ);
-- Apply check for required parentheses in the enclosing
-- context of raise_expressions (RM 11.3 (2)), including default
-- expressions in contexts that can include aspect specifications,
-- and ancestor parts of extension aggregates.
declare
Par : Node_Id := Parent (N);
Parentheses_Found : Boolean := Paren_Count (N) > 0;
begin
while Present (Par)
and then Nkind (Par) in N_Has_Etype
loop
if Paren_Count (Par) > 0 then
Parentheses_Found := True;
end if;
if Nkind (Par) = N_Extension_Aggregate
and then N = Ancestor_Part (Par)
then
exit;
end if;
Par := Parent (Par);
end loop;
if not Parentheses_Found
and then Comes_From_Source (Par)
and then
((Nkind (Par) in N_Modular_Type_Definition
| N_Floating_Point_Definition
| N_Ordinary_Fixed_Point_Definition
| N_Decimal_Fixed_Point_Definition
| N_Extension_Aggregate
| N_Discriminant_Specification
| N_Parameter_Specification
| N_Formal_Object_Declaration)
or else (Nkind (Par) = N_Object_Declaration
and then
Nkind (Parent (Par)) /= N_Extended_Return_Statement))
then
Error_Msg_N
("raise_expression must be parenthesized in this context",
N);
end if;
end;
end if;
end Resolve_Raise_Expression;