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;