diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index fe17591183e015ef2a7e94433469fae12869d384..f659d3303eac87b56235b9eb91d000bdb560f276 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 759607e7246c438370d7b7d2624d98b645f3541d..668a2a7b204aa37ca73c1977a957e2f304dbd215 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 41ad6d375fd82d51d393557c6cbb541e81adb63a..18d9236b778cab69615e9636e6139afc5c5d5d18 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 0000000000000000000000000000000000000000..ef5f46942107fe3a068875c69d62b2e9a07a4af3
--- /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 0000000000000000000000000000000000000000..c149ea3c798531fddb61e266df19309d31af8b4c
--- /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 0000000000000000000000000000000000000000..733268c65e751df752b7d6f74bead01a533dd686
--- /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;