aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2024-08-16 16:03:30 +0200
committerMarc Poulhiès <dkm@gcc.gnu.org>2024-08-29 15:06:28 +0200
commitd506247921d11b8013e99f5729385a9dd300b575 (patch)
tree90f5d3db8a6e61eef390356151eab9595c2ab806 /gcc
parenta50584b8a63b57913d0f213b51403953f799c962 (diff)
downloadgcc-d506247921d11b8013e99f5729385a9dd300b575.zip
gcc-d506247921d11b8013e99f5729385a9dd300b575.tar.gz
gcc-d506247921d11b8013e99f5729385a9dd300b575.tar.bz2
ada: Fix internal error on concatenation of discriminant-dependent component
This only occurs with optimization enabled, but the expanded code is always wrong because it reuses the formal parameter of an initialization procedure associated with a discriminant (a discriminal in GNAT parlance) outside of the initialization procedure. gcc/ada/ * checks.adb (Selected_Length_Checks.Get_E_Length): For a component of a record with discriminants and if the expression is a selected component, try to build an actual subtype from its prefix instead of from the discriminal.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/checks.adb10
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index 2fb750c..5d7f4cc 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -9861,7 +9861,15 @@ package body Checks is
if Ekind (Scope (E)) = E_Record_Type
and then Has_Discriminants (Scope (E))
then
- N := Build_Discriminal_Subtype_Of_Component (E);
+ -- If the expression is a selected component, in other words,
+ -- has a prefix, then build an actual subtype from the prefix.
+ -- Otherwise, build an actual subtype from the discriminal.
+
+ if Nkind (Expr) = N_Selected_Component then
+ N := Build_Actual_Subtype_Of_Component (E, Expr);
+ else
+ N := Build_Discriminal_Subtype_Of_Component (E);
+ end if;
if Present (N) then
Insert_Action (Expr, N);