aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/inline.adb10
-rw-r--r--gcc/ada/tbuild.adb12
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);