From: Eric Botcazou <ebotca...@adacore.com> It avoids to recreate an actual subtype for an explicit dereference.
gcc/ada/ * sem_util.adb (Get_Actual_Subtype): For an explicit dereference, return the Actual_Designated_Subtype if it is present. (Get_Actual_Subtype_If_Available): Likewise. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/sem_util.adb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 8bce0229867..ad74de6b6f6 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -10017,6 +10017,14 @@ package body Sem_Util is then return Actual_Subtype (Entity (N)); + -- Similarly, if we have an explicit dereference, then we get the + -- actual subtype from the node itself if one has been built. + + elsif Nkind (N) = N_Explicit_Dereference + and then Present (Actual_Designated_Subtype (N)) + then + return Actual_Designated_Subtype (N); + -- Actual subtype of unchecked union is always itself. We never need -- the "real" actual subtype. If we did, we couldn't get it anyway -- because the discriminant is not available. The restrictions on @@ -10130,6 +10138,14 @@ package body Sem_Util is then return Actual_Subtype (Entity (N)); + -- Similarly, if we have an explicit dereference, then we get the + -- actual subtype from the node itself if one has been built. + + elsif Nkind (N) = N_Explicit_Dereference + and then Present (Actual_Designated_Subtype (N)) + then + return Actual_Designated_Subtype (N); + -- Otherwise the Etype of N is returned unchanged else -- 2.40.0