I'm working on a small project to create an abstraction over directories and archives. I've managed to write some code that seems simple enough (using tagged limited types) and even though the code appears to be valid, it seems to either trigger bugs in the runtime (causing crashes on execution) or fails to compile:
Both Debian GCC 4.3, GNAT GPL 2009 and FreeBSD GCC 4.4 fail with the following: pfseudo-archiver-directory.adb:24:41: wrong type for return_subtype_indication pfseudo-archiver-directory.adb:46:35: wrong type for return_subtype_indication GCC SVN (r154285) fails to build with a strange error: arc_dir_003.adb:25:32: "_master" conflicts with declaration at line 21 The output of -gnatG shows this error to be apparently incorrect: error := false; B_1 : declare _master : constant integer := system__soft_links__current_master.all; A6bM : integer renames _master; type A6b is access all pfseudo__archiver__Tarchive_tC; R7b : A6b := pfseudo__archiver__directory. The code is available here: http://git.coreland.ath.cx/gitweb.cgi?p=pfseudo/.git;a=summary $ git clone http://git.coreland.ath.cx/pfseudo/.git Configure and build with: $ echo 'gcc' > conf-adacomp $ echo 'gnatbind' > conf-adabind $ echo 'gnatlink' > conf-adalink $ make $ make tests Here's another case from a prototype that causes a crash on GCC 4.4 but, ironically, gives every impression of compiling and running on earlier versions (4.3, GPL 2009): with Ada.Streams.Stream_IO; with Ada.Finalization; package Archiver is type Archiver_t is tagged limited private; type Archive_t is tagged limited private; function Open_Archive (Archiver : in Archiver_t; Path : in String) return Archive_t'Class; function Stream (Archive : in Archive_t) return Ada.Streams.Stream_IO.Stream_Access; private package Stream_IO renames Ada.Streams.Stream_IO; type Archiver_t is tagged limited null record; type Archive_t is new Ada.Finalization.Limited_Controlled with record Name : access String; File : Stream_IO.File_Type; end record; end Archiver; package body Archiver is function Open_Archive (Archiver : in Archiver_t; Path : in String) return Archive_t'Class is pragma Unreferenced (Archiver); begin -- This line causes a segmentation fault. return A : Archive_t'Class := Archive_t'(Ada.Finalization.Limited_Controlled with others => <>) do A.Name := new String'(Path); Stream_IO.Open (Name => A.Name.all, File => A.File, Mode => Stream_IO.In_File); end return; end Open_Archive; function Stream (Archive : in Archive_t) return Ada.Streams.Stream_IO.Stream_Access is begin return Stream_IO.Stream (Archive.File); end Stream; end Archiver; with Ada.Text_IO; with Ada.Streams.Stream_IO; with Archiver; procedure Main is A : Archiver.Archiver_t; S : constant Ada.Streams.Stream_IO.Stream_Access := Archiver.Stream (Archiver.Open_Archive (A, "file.zip")); X : Integer; begin X := Integer'Input (S); Ada.Text_IO.Put_Line (Integer'Image (X)); end Main; -- Summary: GNAT appears to misbehave with limited tagged types and possibly finalization Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: ada AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: gcc at coreland dot ath dot cx GCC host triplet: x86_64-portbld-freebsd7.2, i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42140