From: Samuel Tardieu Date: Wed, 9 Apr 2008 14:21:18 +0000 (+0000) Subject: re PR ada/28305 (GNAT bug when inlining instance of a generic subprogram) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ce4e59c46ba3989a420afca61ddcf9550e02ab7f;p=gcc.git 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 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fe17591183e..f659d3303ea 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2008-04-09 Samuel Tardieu + + 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 * 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 759607e7246..668a2a7b204 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 41ad6d375fd..18d9236b778 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-04-09 Samuel Tardieu + + 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 * 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 00000000000..ef5f4694210 --- /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 00000000000..c149ea3c798 --- /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 00000000000..733268c65e7 --- /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;