diff mbox series

[Ada] Compiler crash on call to eliminated protected operation.

Message ID 20170906092306.GA27907@adacore.com
State New
Headers show
Series [Ada] Compiler crash on call to eliminated protected operation. | expand

Commit Message

Arnaud Charlet Sept. 6, 2017, 9:23 a.m. UTC
This patch fixes an omission in the handling of pragma Eliminate when applied
to a protected operation. The pragma was properly  processed, but a call to
an eliminated protected operation was not flagged as an error, and the code
generator aborted on a call to an undefined operation.

Compiling:

  gcc -c -gnatec=gnat.adc data.adb

must yield:

   data.adb:12:14: cannot reference subprogram "Some_Protected_Data"
       eliminated at Global_Pragmas.adc:4
   data.adb:20:21: cannot reference subprogram "Some_Protected_Data"
       eliminated at Global_Pragmas.adc:4

---
--  List of unused entities to be placed in gnat.adc.  --
pragma Eliminate (Data, Some_Protected_Data, Source_Location => "data.ads:12");

---
package Data is

  type Data_Type_T is new Natural;

   function Get_Private_Data return
     Data_Type_T;

private

   protected type Some_Type is

      function Some_Protected_Data return
        Data_Type_T;
   private
      Data : Data_Type_T := 0;
   end Some_Type;

end Data;
---
package body Data is
   protected body Some_Type is
      function Some_Protected_Data return
        Data_Type_T
      is
      begin
         return Data;
      end Some_Protected_Data;

   function Redundant return Data_Type_T is
   begin
      return Some_Protected_Data;
   end;
   end Some_Type;

   My_Data : Some_Type;

   function Get_Private_Data return Data_Type_T is
   begin
      return My_Data.Some_Protected_Data;
   end Get_Private_Data;
end Data;

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

2017-09-06  Ed Schonberg  <schonberg@adacore.com>

	* sem_res.adb (Resolve_Entry_Call): Check whether a protected
	operation is subject to a pragma Eliminate.
diff mbox series

Patch

Index: sem_res.adb
===================================================================
--- sem_res.adb	(revision 251753)
+++ sem_res.adb	(working copy)
@@ -7519,10 +7519,15 @@ 
 
       if Nkind (Entry_Name) = N_Selected_Component then
 
-         --  Simple entry call
+         --  Simple entry or protected operation call
 
          Nam := Entity (Selector_Name (Entry_Name));
          Obj := Prefix (Entry_Name);
+
+         if Is_Subprogram (Nam) then
+            Check_For_Eliminated_Subprogram (Entry_Name, Nam);
+         end if;
+
          Was_Over := Is_Overloaded (Selector_Name (Entry_Name));
 
       else pragma Assert (Nkind (Entry_Name) = N_Indexed_Component);