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 <[email protected]>
* sem_res.adb (Resolve_Entry_Call): Check whether a protected
operation is subject to a pragma Eliminate.
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);