diff options
-rw-r--r-- | gcc/ada/inline.adb | 10 | ||||
-rw-r--r-- | gcc/ada/tbuild.adb | 12 |
2 files changed, 17 insertions, 5 deletions
diff --git a/gcc/ada/inline.adb b/gcc/ada/inline.adb index f5c5426..850145e 100644 --- a/gcc/ada/inline.adb +++ b/gcc/ada/inline.adb @@ -3165,7 +3165,9 @@ package body Inline is elsif Base_Type (Etype (F)) = Base_Type (Etype (A)) and then Etype (F) /= Base_Type (Etype (F)) - and then Is_Constrained (Etype (F)) + and then (Is_Constrained (Etype (F)) + or else + Is_Fixed_Lower_Bound_Array_Subtype (Etype (F))) then Temp_Typ := Etype (F); @@ -3234,7 +3236,11 @@ package body Inline is -- GNATprove. elsif Etype (F) /= Etype (A) - and then (not GNATprove_Mode or else Is_Constrained (Etype (F))) + and then + (not GNATprove_Mode + or else (Is_Constrained (Etype (F)) + or else + Is_Fixed_Lower_Bound_Array_Subtype (Etype (F)))) then New_A := Unchecked_Convert_To (Etype (F), Relocate_Node (A)); Temp_Typ := Etype (F); diff --git a/gcc/ada/tbuild.adb b/gcc/ada/tbuild.adb index 51fa43c..b538911 100644 --- a/gcc/ada/tbuild.adb +++ b/gcc/ada/tbuild.adb @@ -918,11 +918,17 @@ package body Tbuild is Result : Node_Id; begin - -- If the expression is already of the correct type, then nothing - -- to do, except for relocating the node + -- If the expression is already of the correct type, then nothing to do, + -- except for relocating the node. If Typ is an array type with fixed + -- lower bound, the expression might be of a subtype that does not + -- have this lower bound (on a slice), hence the conversion needs to + -- be preserved for sliding. if Present (Etype (Expr)) - and then (Base_Type (Etype (Expr)) = Typ or else Etype (Expr) = Typ) + and then + ((Base_Type (Etype (Expr)) = Typ + and then not Is_Fixed_Lower_Bound_Array_Subtype (Typ)) + or else Etype (Expr) = Typ) then return Relocate_Node (Expr); |