[Ada] Remove extra validity check in case statement

gcc/ada/

	* exp_ch5.adb (Expand_N_Case_Statement): Do not generate
	validity check when possible.
This commit is contained in:
Arnaud Charlet 2020-07-13 08:14:20 -04:00 committed by Pierre-Marie de Rodat
parent f3f1debe1b
commit bc60bb5eb9
1 changed files with 29 additions and 1 deletions

View File

@ -3115,7 +3115,35 @@ package body Exp_Ch5 is
if Validity_Check_Default
and then not Predicates_Ignored (Etype (Expr))
then
Ensure_Valid (Expr);
-- Recognize the simple case where Expr is an object reference
-- and the case statement is directly preceded by an
-- "if Obj'Valid then": in this case, do not emit another validity
-- check.
declare
Check_Validity : Boolean := True;
Attr : Node_Id;
begin
if Nkind (Expr) = N_Identifier
and then Nkind (Parent (N)) = N_If_Statement
and then Nkind (Original_Node (Condition (Parent (N))))
= N_Attribute_Reference
and then No (Prev (N))
then
Attr := Original_Node (Condition (Parent (N)));
if Attribute_Name (Attr) = Name_Valid
and then Nkind (Prefix (Attr)) = N_Identifier
and then Entity (Prefix (Attr)) = Entity (Expr)
then
Check_Validity := False;
end if;
end if;
if Check_Validity then
Ensure_Valid (Expr);
end if;
end;
end if;
-- If there is only a single alternative, just replace it with the