From ce4e59c46ba3989a420afca61ddcf9550e02ab7f Mon Sep 17 00:00:00 2001
From: Samuel Tardieu <sam@rfc1149.net>
Date: Wed, 9 Apr 2008 14:21:18 +0000
Subject: [PATCH] re PR ada/28305 (GNAT bug when inlining instance of a generic
 subprogram)

    gcc/ada/
	PR ada/28305
	* sem_ch6.adb (Build_Body_To_Inline): Do not save and restore
	environment if generic instance is a top-level one.

    gcc/testsuite/
	PR ada/28305
	* gnat.dg/specs/fe_inlining.ads, gnat.dg/specs/fe_inlining_helper.ads,
	gnat.dg/specs/fe_inlining_helper.adb: New test.

From-SVN: r134142
---
 gcc/ada/ChangeLog                                  |  6 ++++++
 gcc/ada/sem_ch6.adb                                | 10 ++++++++--
 gcc/testsuite/ChangeLog                            |  6 ++++++
 gcc/testsuite/gnat.dg/specs/fe_inlining.ads        |  4 ++++
 gcc/testsuite/gnat.dg/specs/fe_inlining_helper.adb |  4 ++++
 gcc/testsuite/gnat.dg/specs/fe_inlining_helper.ads |  3 +++
 6 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gnat.dg/specs/fe_inlining.ads
 create mode 100644 gcc/testsuite/gnat.dg/specs/fe_inlining_helper.adb
 create mode 100644 gcc/testsuite/gnat.dg/specs/fe_inlining_helper.ads

diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index fe17591183e0..f659d3303eac 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-09  Samuel Tardieu  <sam@rfc1149.net>
+
+	PR ada/28305
+	* sem_ch6.adb (Build_Body_To_Inline): Do not save and restore
+	environment if generic instance is a top-level one.
+
 2008-04-09  Doug Rupp  <rupp@adacore.com>
 
 	* decl.c (validate_size): Set minimum size for fat pointers same as
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 759607e7246c..668a2a7b204a 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -2929,7 +2929,11 @@ package body Sem_Ch6 is
       --  Within an instance, the body to inline must be treated as a nested
       --  generic, so that the proper global references are preserved.
 
-      if In_Instance then
+      --  Note that we do not do this at the library level, because it is not
+      --  needed, and furthermore this causes trouble if front end inlining
+      --  is activated (-gnatN).
+
+      if In_Instance and then Scope (Current_Scope) /= Standard_Standard then
          Save_Env (Scope (Current_Scope), Scope (Current_Scope));
          Original_Body := Copy_Generic_Node (N, Empty, True);
       else
@@ -2977,7 +2981,9 @@ package body Sem_Ch6 is
 
       Expander_Mode_Restore;
 
-      if In_Instance then
+      --  Restore environment if previously saved
+
+      if In_Instance and then Scope (Current_Scope) /= Standard_Standard then
          Restore_Env;
       end if;
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 41ad6d375fd8..18d9236b778c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-09  Samuel Tardieu  <sam@rfc1149.net>
+
+	PR ada/28305
+	* gnat.dg/specs/fe_inlining.ads, gnat.dg/specs/fe_inlining_helper.ads,
+	gnat.dg/specs/fe_inlining_helper.adb: New test.
+
 2008-04-09  Kai Tietz  <kai.tietz@onevision.com>
 
 	* gcc.dg/torture/fp-int-convert.h: Use TImode type for 
diff --git a/gcc/testsuite/gnat.dg/specs/fe_inlining.ads b/gcc/testsuite/gnat.dg/specs/fe_inlining.ads
new file mode 100644
index 000000000000..ef5f46942107
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/fe_inlining.ads
@@ -0,0 +1,4 @@
+-- { dg-do compile }
+-- { dg-options "-O -gnatN" }
+with FE_Inlining_Helper;
+procedure FE_Inlining is new FE_Inlining_Helper;
diff --git a/gcc/testsuite/gnat.dg/specs/fe_inlining_helper.adb b/gcc/testsuite/gnat.dg/specs/fe_inlining_helper.adb
new file mode 100644
index 000000000000..c149ea3c7985
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/fe_inlining_helper.adb
@@ -0,0 +1,4 @@
+procedure FE_Inlining_Helper is
+begin
+   null;
+end FE_Inlining_Helper;
diff --git a/gcc/testsuite/gnat.dg/specs/fe_inlining_helper.ads b/gcc/testsuite/gnat.dg/specs/fe_inlining_helper.ads
new file mode 100644
index 000000000000..733268c65e75
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/fe_inlining_helper.ads
@@ -0,0 +1,3 @@
+-- { dg-excess-errors "no code generated" }
+generic
+procedure FE_Inlining_Helper;
-- 
GitLab