aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2018-10-09 15:06:11 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-10-09 15:06:11 +0000
commit0444d0671d2696d9a3eef8ce01fe77f82702c0e3 (patch)
tree9a1cd800843984fb0892e61eb573708d977d4639 /gcc
parentc14bd5028a410a277b2e0ba8ffbfe8ee58e74d00 (diff)
downloadgcc-0444d0671d2696d9a3eef8ce01fe77f82702c0e3.zip
gcc-0444d0671d2696d9a3eef8ce01fe77f82702c0e3.tar.gz
gcc-0444d0671d2696d9a3eef8ce01fe77f82702c0e3.tar.bz2
[Ada] Internal error on inlined renaming of subprogram instance
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. 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. From-SVN: r264975
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/sem_ch7.adb11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/inline14.adb9
-rw-r--r--gcc/testsuite/gnat.dg/inline14_pkg.adb16
-rw-r--r--gcc/testsuite/gnat.dg/inline14_pkg.ads6
6 files changed, 52 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 04b506e..2c0bce6 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,10 @@
+2018-10-09 Eric Botcazou <ebotcazou@adacore.com>
+
+ * 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.
+
2018-10-09 Ed Schonberg <schonberg@adacore.com>
* exp_unst.adb (In_Synchronized_Call): Handle properly private
diff --git a/gcc/ada/sem_ch7.adb b/gcc/ada/sem_ch7.adb
index 8aebb0f..6e9f531 100644
--- a/gcc/ada/sem_ch7.adb
+++ b/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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8f84ace..87368c7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-09 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/inline14.adb, gnat.dg/inline14_pkg.adb,
+ gnat.dg/inline14_pkg.ads: New testcase.
+
2018-10-09 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/warn18.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/inline14.adb b/gcc/testsuite/gnat.dg/inline14.adb
new file mode 100644
index 0000000..5bf9aa6
--- /dev/null
+++ b/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;
diff --git a/gcc/testsuite/gnat.dg/inline14_pkg.adb b/gcc/testsuite/gnat.dg/inline14_pkg.adb
new file mode 100644
index 0000000..0b71928
--- /dev/null
+++ b/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;
diff --git a/gcc/testsuite/gnat.dg/inline14_pkg.ads b/gcc/testsuite/gnat.dg/inline14_pkg.ads
new file mode 100644
index 0000000..d9c6dff
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/inline14_pkg.ads
@@ -0,0 +1,6 @@
+package Inline14_Pkg is
+
+ procedure Proc;
+ pragma Inline (Proc);
+
+end Inline14_Pkg;