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;

Reply via email to