This is a small regression present on the mainline and 7 branch: the call to a 
protected function returning a composite type with Volatile_Full_Access aspect 
or pragma yields a segfault at run time.

Tested on x86-64/Linux, applied on the mainline and 7 branch.


2018-03-10  Eric Botcazou  <ebotca...@adacore.com>

        * gcc-interface/trans.c (node_has_volatile_full_access) <N_Identifier>:
        Consider only entities for objects.


2018-03-10  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/prot3.adb: New test.
        * gnat.dg/prot3_pkg.ad[sb]: New helper.

-- 
Eric Botcazou
Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 258411)
+++ gcc-interface/trans.c	(working copy)
@@ -4082,6 +4082,8 @@ node_has_volatile_full_access (Node_Id g
     case N_Identifier:
     case N_Expanded_Name:
       gnat_entity = Entity (gnat_node);
+      if (!Is_Object (gnat_entity))
+	break;
       return Is_Volatile_Full_Access (gnat_entity)
 	     || Is_Volatile_Full_Access (Etype (gnat_entity));
 
package body Prot3_Pkg is
   
   protected body Prot is
      function Fn (J : Short_Integer) return Rec
      is
      begin
	 return (V1 => J * J,
		 V2 => J);
      end;
      
      procedure Foo (J : Short_Integer) is
      begin
	 Val := Fn (J);
      end;
   end Prot;
   
end Prot3_Pkg;
package Prot3_Pkg is
   
   type Rec is record
      V1 : Short_Integer;
      V2 : Short_Integer;
   end record with Volatile_Full_Access;
   
   protected type Prot is
      procedure Foo (J : Short_Integer);
   private
      Val : Rec;
   end Prot;
   
   P : Prot;
   
end Prot3_Pkg;
--  { dg-do run }

with Prot3_Pkg; use Prot3_Pkg;

procedure Prot3 is
begin
   P.Foo (4);
end;

Reply via email to