@@ -285,7 +285,7 @@ package body Exp_Prag is
-- expression is not usually the best choice here, because it points to
-- the location of the topmost tree node, which may be an operator in
-- the middle of the source text of the expression. For example, it gets
- -- located on the last AND keyword in a chain of boolean expressiond
+ -- located on the last AND keyword in a chain of boolean expressions
-- AND'ed together. It is best to put the message on the first character
-- of the condition, which is the effect of the First_Node call here.
-- This source location is used to build the default exception message,
@@ -4572,11 +4572,15 @@ package body Sem_Ch3 is
null;
-- Do not generate a predicate check if the initialization expression
- -- is a type conversion because the conversion has been subjected to
- -- the same check. This is a small optimization which avoid redundant
+ -- is a type conversion whose target subtype statically matches the
+ -- object's subtype because the conversion has been subjected to the
+ -- same check. This is a small optimization which avoids redundant
-- checks.
- elsif Present (E) and then Nkind (E) = N_Type_Conversion then
+ elsif Present (E)
+ and then Nkind (E) in N_Type_Conversion
+ and then Subtypes_Statically_Match (Etype (Subtype_Mark (E)), T)
+ then
null;
else