[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:
parent
c50041b99b
commit
a2d2310d80
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user