[Ada] Crash on use of Loop_Entry, Result, and Old as actuals
authorJustin Squirek <squirek@adacore.com>
Thu, 12 Dec 2019 10:01:55 +0000 (10:01 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 12 Dec 2019 10:01:55 +0000 (10:01 +0000)
2019-12-12  Justin Squirek  <squirek@adacore.com>

gcc/ada/

* exp_ch6.adb (Expand_Call_Helper): Added null case for
'Loop_Entry, 'Old, and 'Result when calculating whether to
create extra accessibility parameters.
* sem_util.adb (Dynamic_Accessibility_Level): Added null case
for 'Loop_Entry, 'Old, and 'Result when  calculating
accessibility level based on access-valued attributes.  Also
added special handling for uses of 'Loop_Entry when used in its
indexed component form.

From-SVN: r279280

gcc/ada/ChangeLog
gcc/ada/exp_ch6.adb
gcc/ada/sem_util.adb

index c57674e367b7c15d2d74fd6d8929c1c235809a20..73434302329d9e873b99c5549ad17bcdc34d60ff 100644 (file)
@@ -1,3 +1,14 @@
+2019-12-12  Justin Squirek  <squirek@adacore.com>
+
+       * exp_ch6.adb (Expand_Call_Helper): Added null case for
+       'Loop_Entry, 'Old, and 'Result when calculating whether to
+       create extra accessibility parameters.
+       * sem_util.adb (Dynamic_Accessibility_Level): Added null case
+       for 'Loop_Entry, 'Old, and 'Result when  calculating
+       accessibility level based on access-valued attributes.  Also
+       added special handling for uses of 'Loop_Entry when used in its
+       indexed component form.
+
 2019-12-12  Arnaud Charlet  <charlet@adacore.com>
 
        * raise-gcc.c: Remove references to VMS
index b31132281bf82e3c6736b8d302f329d38d79d0e1..3d6ef4847030f4ee89d810e3654291c722c544ad 100644 (file)
@@ -3389,6 +3389,15 @@ package body Exp_Ch6 is
                case Nkind (Prev_Orig) is
                   when N_Attribute_Reference =>
                      case Get_Attribute_Id (Attribute_Name (Prev_Orig)) is
+                        --  Ignore 'Result, 'Loop_Entry, and 'Old as they can
+                        --  be used to identify access objects and do not have
+                        --  an effect on accessibility level.
+
+                        when Attribute_Loop_Entry
+                           | Attribute_Old
+                           | Attribute_Result
+                        =>
+                           null;
 
                         --  For X'Access, pass on the level of the prefix X
 
index 4de41d3e6dd935dbb0096160e4c37a4e5ac57963..c7dabdd6cfa300707b48850c686e444d8d5bd138 100644 (file)
@@ -6488,7 +6488,7 @@ package body Sem_Util is
 
       --  Local variables
 
-      Expr : constant Node_Id := Original_Node (N);
+      Expr : Node_Id := Original_Node (N);
       --  Expr references the original node because at this stage N may be the
       --  reference to a variable internally created by the frontend to remove
       --  side effects of an expression.
@@ -6516,6 +6516,21 @@ package body Sem_Util is
       --  Unimplemented: Ptr.all'Access, where Ptr has Extra_Accessibility ???
 
       case Nkind (Expr) is
+         --  It may be possible that we have an access object denoted by an
+         --  attribute reference for 'Loop_Entry which may, in turn, have an
+         --  indexed component representing a loop identifier.
+
+         --  In this case we must climb up the indexed component and set expr
+         --  to the attribute reference so the rest of the machinery can
+         --  operate as expected.
+
+         when N_Indexed_Component =>
+            if Nkind (Prefix (Expr)) = N_Attribute_Reference
+              and then Get_Attribute_Id (Attribute_Name (Prefix (Expr)))
+                         = Attribute_Loop_Entry
+            then
+               Expr := Prefix (Expr);
+            end if;
 
          --  For access discriminant, the level of the enclosing object
 
@@ -6530,6 +6545,13 @@ package body Sem_Util is
          when N_Attribute_Reference =>
             case Get_Attribute_Id (Attribute_Name (Expr)) is
 
+               --  Ignore 'Loop_Entry, 'Result, and 'Old as they can be used to
+               --  identify access objects and do not have an effect on
+               --  accessibility level.
+
+               when Attribute_Loop_Entry | Attribute_Old | Attribute_Result =>
+                  null;
+
                --  For X'Access, the level of the prefix X
 
                when Attribute_Access =>