aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViljar Indus <indus@adacore.com>2023-06-21 16:22:37 +0300
committerMarc Poulhiès <poulhies@adacore.com>2023-07-06 13:36:10 +0200
commit15e2d19ff46527d56407eaea64161943efc3e2b7 (patch)
tree86718cc3ace5e2c76197a0448a4bcd8ffd8c28ce
parentd4fea89d289d45aa6811b9e1fa6d40ba9f28dd60 (diff)
downloadgcc-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.
-rw-r--r--gcc/ada/sem_attr.adb16
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)