If we're doing 'First or 'Last on a renamed variable, the backend may
look at either the Etype of the variable or that of what it was
renaming, so check both to see if we need to place it into the
activation record.

Tested on x86_64-pc-linux-gnu, committed on trunk

2020-06-08  Richard Kenner  <ken...@adacore.com>

gcc/ada/

        * exp_unst.adb (Visit_Node): When visiting array attribute
        nodes, in addition to checking the type of Get_Referenced_Object
        of the prefix, also check the actual type of the prefix.
--- gcc/ada/exp_unst.adb
+++ gcc/ada/exp_unst.adb
@@ -1049,22 +1049,27 @@ package body Exp_Unst is
                            --  from the (possibly) uplevel reference. We call
                            --  Get_Referenced_Object to deal with prefixes that
                            --  are object renamings (prefixes that are types
-                           --  can be passed and will simply be returned).
+                           --  can be passed and will simply be returned).  But
+                           --  it's also legal to get the bounds from the type
+                           --  of the prefix, so we have to handle both cases.
 
-                           if Is_Constrained
+                           declare
+                              DT : Boolean := False;
+
+                           begin
+                              if Is_Constrained
                                 (Etype (Get_Referenced_Object (Prefix (N))))
-                           then
-                              declare
-                                 DT : Boolean := False;
-                              begin
+                              then
                                  Check_Static_Type
                                    (Etype (Get_Referenced_Object (Prefix (N))),
-                                    Empty,
-                                    DT);
-                              end;
+                                    Empty, DT);
+                              end if;
 
-                              return OK;
-                           end if;
+                              if Is_Constrained (Etype (Prefix (N))) then
+                                 Check_Static_Type
+                                   (Etype (Prefix (N)), Empty, DT);
+                              end if;
+                           end;
 
                         when others =>
                            null;

Reply via email to