[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.

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
This commit is contained in:
Ed Schonberg 2019-08-12 09:01:43 +00:00 committed by Pierre-Marie de Rodat
parent fba9fcae32
commit 8e4ca4fcff
4 changed files with 43 additions and 0 deletions

View 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

View 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;

View 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.

View File

@ -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;