Recognize code of the form:
if X'Valid then
case X is
[...]
and suppress the redundant validity check on X done as part of the case
statement.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* exp_ch5.adb (Expand_N_Case_Statement): Do not generate
validity check when possible.
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb
--- a/gcc/ada/exp_ch5.adb
+++ b/gcc/ada/exp_ch5.adb
@@ -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