Instance bodies nested within generic bodies are always built, so that semantic
checks can be performed on them. Finalization actions on entities within these
instances must not be generated because expansion will have been disabled at
various points and because finalizers are only relevant in executable code.
Previously finalization actions were excluded in the context of a generic
suprogram, but not a generic package body.

No short example available.

Tested on x86_64-pc-linux-gnu, committed on trunk

2011-08-29  Ed Schonberg  <schonb...@adacore.com>

        * inline.adb (Add_Scopes_To_Clean): Exclude any entity within a generic
        unit.

Index: inline.adb
===================================================================
--- inline.adb  (revision 178155)
+++ inline.adb  (working copy)
@@ -496,8 +496,10 @@
          return;
       end if;
 
-      --  If the instance appears within a generic subprogram there is nothing
-      --  to finalize either.
+      --  If the instance is within a generic unit, no finalization code
+      --  can be generated. Note that at this point all bodies have been
+      --  analyzed, and the scope stack itself is not present, and the flag
+      --  Inside_A_Generic is not set.
 
       declare
          S : Entity_Id;
@@ -505,7 +507,7 @@
       begin
          S := Scope (Inst);
          while Present (S) and then S /= Standard_Standard loop
-            if Is_Generic_Subprogram (S) then
+            if Is_Generic_Unit (S) then
                return;
             end if;
 

Reply via email to