------- Comment #2 from gcc at coreland dot ath dot cx  2009-11-22 16:41 -------
A couple of people have commented on the anonymous access type
(claiming it causes the crash). Here's a version with it removed
and a gdb backtrace:

Program received signal SIGSEGV, Segmentation fault.
system.finalization_implementation.move_final_list (from=0x800a02040, to=0x0)
at s-finimp.adb:486
486     s-finimp.adb: No such file or directory.
        in s-finimp.adb
(gdb) bt
#0  system.finalization_implementation.move_final_list (from=0x800a02040,
to=0x0) at s-finimp.adb:486
#1  0x0000000000402cfb in archiver.open_archive (archiver=(), path=0x41fe18,
<open_archiveBIPalloc>=4324888, 
    <open_archiveBIPfinallist>=0x0, <open_archiveBIPaccess>=0x7fffffffe6d8) at
archiver.adb:9
#2  0x0000000000402e9f in main () at main.adb:9

Probably advisable to add an assertion in Move_Final_List
to ensure that 'To' is not null.

-- %< archiver.ads

with Ada.Finalization;
with Ada.Streams.Stream_IO;

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
    File : Stream_IO.File_Type;
  end record;

end Archiver;

-- %< archiver.adb

package body Archiver is

  function Open_Archive
    (Archiver : in Archiver_t;
     Path     : in String) return Archive_t'Class
  is
    pragma Unreferenced (Archiver);
  begin
    return A : Archive_t'Class :=
Archive_t'(Ada.Finalization.Limited_Controlled with others => <>) do
      Stream_IO.Open
        (Name => Path,
         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;

-- %< main.adb

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;


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42140

Reply via email to