This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Crash on illegal left-hand side in assignment of renamed variable


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.

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

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.
--- gcc/ada/sem_util.adb
+++ gcc/ada/sem_util.adb
@@ -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;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/renaming15.adb
@@ -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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]