diff options
author | Viljar Indus <indus@adacore.com> | 2023-06-21 16:22:37 +0300 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-07-06 13:36:10 +0200 |
commit | 15e2d19ff46527d56407eaea64161943efc3e2b7 (patch) | |
tree | 86718cc3ace5e2c76197a0448a4bcd8ffd8c28ce /gcc | |
parent | d4fea89d289d45aa6811b9e1fa6d40ba9f28dd60 (diff) | |
download | gcc-15e2d19ff46527d56407eaea64161943efc3e2b7.zip gcc-15e2d19ff46527d56407eaea64161943efc3e2b7.tar.gz gcc-15e2d19ff46527d56407eaea64161943efc3e2b7.tar.bz2 |
ada: Evaluate static expressions in Range attributes
Gigi assumes that the value of range expressions is an integer literal.
Force evaluation of such expressions since static non-literal expressions
are not always evaluated to a literal form by gnat.
gcc/ada/
* sem_attr.adb (analyze_attribute.check_array_type): Replace valid
indexes with their staticly evaluated values.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/sem_attr.adb | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index 7a47abd..e00addd 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -2013,10 +2013,20 @@ package body Sem_Attr is Flag_Non_Static_Expr ("expression for dimension must be static!", E1); Error_Attr; - - elsif Expr_Value (E1) > D or else Expr_Value (E1) < 1 then - Error_Attr ("invalid dimension number for array type", E1); end if; + + declare + Value : constant Uint := Expr_Value (E1); + begin + + if Value > D or else Value < 1 then + Error_Attr ("invalid dimension number for array type", E1); + end if; + + -- Replace the static value to simplify the tree for gigi + Fold_Uint (E1, Value, True); + end; + end if; if (Style_Check and Style_Check_Array_Attribute_Index) |