This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug ada/65524] New: gnatbind generates decrementing the unexisting elab-counter into finalize_library
- From: "demoonlit at panathenaia dot halfmoon.jp" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 23 Mar 2015 14:21:16 +0000
- Subject: [Bug ada/65524] New: gnatbind generates decrementing the unexisting elab-counter into finalize_library
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65524
Bug ID: 65524
Summary: gnatbind generates decrementing the unexisting
elab-counter into finalize_library
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ada
Assignee: unassigned at gcc dot gnu.org
Reporter: demoonlit at panathenaia dot halfmoon.jp
I found some cases that gnatbind generates decrementing the unexisting
elaboration counter of each package Exxx.
E142 : Short_Integer; pragma Import (Ada, E142, "system__exn_lli_E");
... some Exxx are declared ...
procedure finalize_library is
begin
...
E132 := E132 - 1; -- * E132 is not declared in above *
...
end finalize_library;
A cause is a package having _finalize_spec/_finalize_body without
_elabs/_elabb.
I still have not been able to make the minimal example, but have made a patch.
In bindgen.adb, Gen_Elab_Externals refers U.Set_Elab_Entity to generate Exxx.
However, Gen_Finalize_Library does not refer it.
--- a/gcc/ada/bindgen.adb
+++ b/gcc/ada/bindgen.adb
@@ -1434,7 +1434,9 @@ package body Bindgen is
-- has a finalizer. In that case, this is where we decrement
-- the elaboration entity.
- if U.Utype = Is_Body and then Uspec.Has_Finalizer then
+ if U.Utype = Is_Body and then Uspec.Has_Finalizer
+ and then Uspec.Set_Elab_Entity
+ then
if not Lib_Final_Built then
Gen_Header;
Lib_Final_Built := True;
@@ -1548,7 +1550,9 @@ package body Bindgen is
WBI (" begin");
- if U.Utype /= Is_Spec then
+ if U.Utype /= Is_Spec
+ and then Uspec.Set_Elab_Entity
+ then
Set_String (" E");
Set_Unit_Number (Unum);
Set_String (" := E");