diff --git a/gcc/ada/exp_prag.adb b/gcc/ada/exp_prag.adb --- a/gcc/ada/exp_prag.adb +++ b/gcc/ada/exp_prag.adb @@ -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, diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -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