aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Duff <duff@adacore.com>2023-07-03 12:01:01 -0400
committerMarc Poulhiès <poulhies@adacore.com>2023-07-11 11:24:29 +0200
commit6be7d5e91e47c5432391b03de9f89e7ec6072eda (patch)
tree17ffc8cd2fa67677efc6a3bcfb8354922a5bc4f1
parent8957121b8bf4be7eb7f9de31b810ea01594a670e (diff)
downloadgcc-6be7d5e91e47c5432391b03de9f89e7ec6072eda.zip
gcc-6be7d5e91e47c5432391b03de9f89e7ec6072eda.tar.gz
gcc-6be7d5e91e47c5432391b03de9f89e7ec6072eda.tar.bz2
ada: Avoid renaming_decl in case of constrained array
This patch avoids rewriting "X: S := F(...);" as "X: S renames F(...);". That rewrite is incorrect if S is a constrained array subtype, because it changes the semantics. In the original, the bounds of X are that of S. But constraints are ignored in renamings, so the bounds of X would come from F'Result. This can cause spurious Constraint_Errors in some obscure cases. It causes unnecessary checks to be inserted, and even when such checks pass (more common case), they might be less efficient. gcc/ada/ * exp_ch3.adb (Expand_N_Object_Declaration): Avoid transforming to a renaming in case of constrained array that comes from source.
-rw-r--r--gcc/ada/exp_ch3.adb16
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index daf27fb..db27a5f 100644
--- a/gcc/ada/exp_ch3.adb
+++ b/gcc/ada/exp_ch3.adb
@@ -7275,6 +7275,13 @@ package body Exp_Ch3 is
Rewrite_As_Renaming : Boolean := False;
-- Whether to turn the declaration into a renaming at the end
+ Nominal_Subtype_Is_Constrained_Array : constant Boolean :=
+ Comes_From_Source (Obj_Def)
+ and then Is_Array_Type (Typ) and then Is_Constrained (Typ);
+ -- Used to avoid rewriting as a renaming for constrained arrays,
+ -- which is only a problem for source arrays; others have the
+ -- correct bounds (see below).
+
-- Start of processing for Expand_N_Object_Declaration
begin
@@ -8030,7 +8037,14 @@ package body Exp_Ch3 is
or else (Nkind (Expr_Q) = N_Slice
and then OK_To_Rename_Ref (Prefix (Expr_Q))
- and then not Special_Ret_Obj));
+ and then not Special_Ret_Obj))
+
+ -- If we have "X : S := ...;", and S is a constrained array
+ -- subtype, then we cannot rename, because renamings ignore
+ -- the constraints of S, so that would change the semantics
+ -- (sliding would not occur on the initial value).
+
+ and then not Nominal_Subtype_Is_Constrained_Array;
-- If the type needs finalization and is not inherently limited,
-- then the target is adjusted after the copy and attached to the