diff options
author | Yannick Moy <moy@adacore.com> | 2024-05-23 14:39:19 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2024-06-20 10:50:56 +0200 |
commit | 3c6dcd1d018da645316e3969748d70a1efd66dd2 (patch) | |
tree | d2fcea15ee2f0ea490af13eca8c62556e14832de /gcc/ada/inline.adb | |
parent | c5d7daa37938984b931ae0825e9d3d72c748ab5a (diff) | |
download | gcc-3c6dcd1d018da645316e3969748d70a1efd66dd2.zip gcc-3c6dcd1d018da645316e3969748d70a1efd66dd2.tar.gz gcc-3c6dcd1d018da645316e3969748d70a1efd66dd2.tar.bz2 |
ada: Fix inlining of fixed-lower-bound array for GNATprove
Inlining in GNATprove may fail on a call to a subprogram with a formal
of an array type with fixed lower bound (a GNAT extension), because the
appropriate conversion is not used. Fix it.
Also fix the function that inserts an unchecked conversion, in cases where
it could skip sliding due to the target type having fixed lower bound.
gcc/ada/
* inline.adb (Establish_Actual_Mapping_For_Inlined_Call): In the
case of formal with a fixed lower bounds, insert appropriate
conversion like in the case of a constrained type.
* tbuild.adb (Unchecked_Convert_To): Do not skip the conversion
when it may involve sliding due to a type with fixed lower bound.
Diffstat (limited to 'gcc/ada/inline.adb')
-rw-r--r-- | gcc/ada/inline.adb | 10 |
1 files changed, 8 insertions, 2 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); |