diff options
author | Marc Poulhiès <poulhies@adacore.com> | 2022-06-30 13:35:10 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2022-07-13 10:01:15 +0000 |
commit | 7a03001cd2dadbe845f109382e4c0dc2dbb50820 (patch) | |
tree | eeaccc1856354ecb8769dd3cfb9681d085329572 /gcc | |
parent | 94425248c769d45b5932079321311392e4d8e952 (diff) | |
download | gcc-7a03001cd2dadbe845f109382e4c0dc2dbb50820.zip gcc-7a03001cd2dadbe845f109382e4c0dc2dbb50820.tar.gz gcc-7a03001cd2dadbe845f109382e4c0dc2dbb50820.tar.bz2 |
[Ada] Fix if expression returning slice
The compiler incorrectly assumed the prefix for a slice returned in one
branch of an if expression has its bounds known at compile time and would
crash when this is not true.
gcc/ada/
* exp_ch4.adb (Expand_N_If_Expression): Test for compile time
known bounds when handling slices.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/exp_ch4.adb | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 911bdf3..18fb88f 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -6174,7 +6174,13 @@ package body Exp_Ch4 is Slice_Bnd : Node_Id) return Node_Id is begin - if Nkind (Elsex) = N_Slice then + -- We need to use the special processing for slices only if + -- they do not have compile-time known bounds; if they do, they + -- can be treated like any other expressions. + + if Nkind (Elsex) = N_Slice + and then not Compile_Time_Known_Bounds (Etype (Elsex)) + then if Compile_Time_Known_Value (Slice_Bnd) and then Expr_Value (Slice_Bnd) = Then_Bnd then @@ -6230,7 +6236,11 @@ package body Exp_Ch4 is begin Get_First_Index_Bounds (Etype (Thenx), Then_Lo, Then_Hi); - if Nkind (Elsex) = N_Slice then + -- See the rationale in Build_New_Bound + + if Nkind (Elsex) = N_Slice + and then not Compile_Time_Known_Bounds (Etype (Elsex)) + then Slice_Lo := Low_Bound (Discrete_Range (Elsex)); Slice_Hi := High_Bound (Discrete_Range (Elsex)); Get_First_Index_Bounds @@ -6289,7 +6299,11 @@ package body Exp_Ch4 is Set_Suppress_Assignment_Checks (Last (Then_List)); - if Nkind (Elsex) = N_Slice then + -- See the rationale in Build_New_Bound + + if Nkind (Elsex) = N_Slice + and then not Compile_Time_Known_Bounds (Etype (Elsex)) + then Else_List := New_List ( Make_Assignment_Statement (Loc, Name => |