[Ada] Crash on illegal left-hand side in assignment of renamed variable
authorEd Schonberg <schonberg@adacore.com>
Mon, 12 Aug 2019 09:01:43 +0000 (09:01 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 12 Aug 2019 09:01:43 +0000 (09:01 +0000)
This patch fixes a crash on an assignment where the left-hand side is a
renaming of a function call that does not involve ceiling priorities.
This avoids a compiler crash in some cases, and prevents a useless
retrieval and compilation of run-time packages.

2019-08-12  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_util.adb (Is_Expaned_Priority_Attribute): Check whether
call comes from a rewritten attribute before comparing name with
Get_Ceiling run-time subprogram.

gcc/testsuite/

* gnat.dg/renaming15.adb: New testcase.

From-SVN: r274305

gcc/ada/ChangeLog
gcc/ada/sem_util.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/renaming15.adb [new file with mode: 0644]

index 64f4c6bb9ac2f5d544efec9edbc8101f77ea736d..74ceb50653c9ad6d8a066cc6b929484b46fab931 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_util.adb (Is_Expaned_Priority_Attribute): Check whether
+       call comes from a rewritten attribute before comparing name with
+       Get_Ceiling run-time subprogram.
+
 2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        * exp_util.ads (Component_May_Be_Bit_Aligned): Small comment
index 42085c7402dcd10ac5728d8fdff1564b7937ff2e..54ac0a416152f487cc3e7b89003332ae0c028916 100644 (file)
@@ -14669,6 +14669,7 @@ package body Sem_Util is
       return
         Nkind (E) = N_Function_Call
           and then not Configurable_Run_Time_Mode
+          and then Nkind (Original_Node (E)) = N_Attribute_Reference
           and then (Entity (Name (E)) = RTE (RE_Get_Ceiling)
                      or else Entity (Name (E)) = RTE (RO_PE_Get_Ceiling));
    end Is_Expanded_Priority_Attribute;
index ee65d1b47894c93fa6f429f66a4b5aadf1eb0873..9c1bd07b3f9eb8aa657a4fd5d1f60a61782b082c 100644 (file)
@@ -1,3 +1,7 @@
+2019-08-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/renaming15.adb: New testcase.
+
 2019-08-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/slice10.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/renaming15.adb b/gcc/testsuite/gnat.dg/renaming15.adb
new file mode 100644 (file)
index 0000000..a0b13cd
--- /dev/null
@@ -0,0 +1,32 @@
+--  { dg-do compile }
+
+with Ada.Containers.Hashed_Maps;
+with Ada.Text_IO;
+
+procedure Renaming15 is
+   use Ada.Containers;
+
+   subtype String_T is String (1 .. 3);
+
+   function Hash (Aircraft_Id : Integer) return Hash_Type is
+       (Hash_Type (Aircraft_Id) * (2 ** 31 - 1));
+   function Equal (Left, Right : Integer) return Boolean is (Left = Right);
+   package Radar_Map is new Hashed_Maps (Integer, String_T, Hash, Equal);
+
+   Radars : Radar_Map.Map;
+
+   procedure Change_Elem_Value is
+   begin
+      for C in Radars.Iterate loop
+         declare
+            E : String_T renames Radar_Map.Element (C);
+         begin
+            E := "Xyz";  --  { dg-error "left hand side of assignment must be a variable" }
+            Ada.Text_IO.Put_Line (E);
+         end;
+      end loop;
+   end Change_Elem_Value;
+begin
+   Radars.Include (1, "jjj");
+   Change_Elem_Value;
+end Renaming15;