From cbf64a8037904b0b4bba99e16e5913ba225e7180 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 25 Jan 2023 15:55:34 +0100 Subject: [PATCH] ada: Follow-up improvement to implementation of storage models 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. --- 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