[Ada] Internal error on inlined renaming of subprogram instance

Message ID 20181009150919.GA123299@adacore.com
State New
Headers show
Series
  • [Ada] Internal error on inlined renaming of subprogram instance
Related show

Commit Message

Pierre-Marie de Rodat Oct. 9, 2018, 3:09 p.m.
This fixes a recent regression introduced in the compiler for the
inlined renaming of a subprogram instantiated in a package body.  It was
wrongly clearing the Is_Public flag on the entity associated with the
body.

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

2018-10-09  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* sem_ch7.adb (Has_Referencer): Add comment for the
	N_Freeze_Entity case.  Do not rely on
	Has_Referencer_Of_Non_Subprograms to clear the Is_Public flag on
	subprogram entities.

gcc/testsuite/

	* gnat.dg/inline14.adb, gnat.dg/inline14_pkg.adb,
	gnat.dg/inline14_pkg.ads: New testcase.

Patch

--- gcc/ada/sem_ch7.adb
+++ gcc/ada/sem_ch7.adb
@@ -441,7 +441,13 @@  package body Sem_Ch7 is
                      Discard : Boolean;
                      pragma Unreferenced (Discard);
                   begin
-                     --  Inspect the actions to find references to subprograms
+                     --  Inspect the actions to find references to subprograms.
+                     --  We assume that the actions do not contain other kinds
+                     --  of references and, therefore, we do not stop the scan
+                     --  or set Has_Referencer_Of_Non_Subprograms here. Doing
+                     --  it would pessimize common cases for which the actions
+                     --  contain the declaration of an init procedure, since
+                     --  such a procedure is automatically marked inline.
 
                      Discard :=
                        Has_Referencer (Actions (Decl),
@@ -470,7 +476,8 @@  package body Sem_Ch7 is
                     and then not Is_Exported (Decl_Id)
                     and then No (Interface_Name (Decl_Id))
                     and then
-                      (not Has_Referencer_Of_Non_Subprograms
+                      ((Nkind (Decl) /= N_Subprogram_Declaration
+                         and then not Has_Referencer_Of_Non_Subprograms)
                         or else (Nkind (Decl) = N_Subprogram_Declaration
                                   and then not Subprogram_Table.Get (Decl_Id)))
                   then

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/inline14.adb
@@ -0,0 +1,9 @@ 
+--  { dg-do compile }
+--  { dg-options "-O -gnatn" }
+
+with Inline14_Pkg; use Inline14_Pkg;
+
+procedure Inline14 is
+begin
+  Proc;
+end;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/inline14_pkg.adb
@@ -0,0 +1,16 @@ 
+package body Inline14_Pkg is
+
+  I : Integer;
+
+  generic procedure Inner;
+
+  procedure Inner is
+  begin
+    I := 0;
+  end;
+
+  procedure My_Inner is new Inner;
+
+  procedure Proc renames My_Inner;
+
+end Inline14_Pkg;

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/inline14_pkg.ads
@@ -0,0 +1,6 @@ 
+package Inline14_Pkg is
+
+  procedure Proc;
+  pragma Inline (Proc);
+
+end Inline14_Pkg;