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