gnatmake -c -u -P/home/voax/gps-prj/ada-2005/bugs/assert_failure.gpr bugs_test.adb -d gcc -c -gnat05 -I- -gnatA /home/voax/gps-prj/ada-2005/bugs/bugs_test.adb +===========================GNAT BUG DETECTED==============================+ | 4.1.0 20060106 (prerelease) (i686-pc-linux-gnu) Assert_Failure einfo.adb:507| | Error detected at bugs_test.adb:23:9 | | Please submit a bug report; see http://gcc.gnu.org/bugs.html. | | Use a subject line meaningful to you and us to track the bug. | | Include the entire contents of this bug box in the report. | | Include the exact gcc or gnatmake command that you entered. | | Also include sources listed below in gnatchop format | | (concatenated together with no headers between files). | +==========================================================================+ Please include these source files with error report Note that list may not be accurate in some cases, so please double check that the problem can still be reproduced with the set of files listed. /home/voax/gps-prj/ada-2005/bugs/bugs_test.adb /home/voax/gps-prj/ada-2005/bugs/implementing_interface.ads /home/voax/gps-prj/ada-2005/bugs/abstract_interface.ads compilation abandoned gnatmake: "/home/voax/gps-prj/ada-2005/bugs/bugs_test.adb" compilation error process exited with status 4
Here are the source files shown above package Abstract_Interface is type Base is interface; -- type Task_Base is task interface; type Mutex is task interface; procedure Wait (Object : in out Mutex) is abstract; procedure Signal (Object : in out Mutex) is abstract; -- type Protected_Base is protected interface; type Buffer is protected interface; procedure Put (Object : in out Buffer; Data : in Integer) is abstract; procedure Get (Object : in out Buffer; Data : out Integer) is abstract; -- type Synchronized_Base is synchronized interface; type Event is synchronized interface; procedure Wait (Object : in out Event) is abstract; procedure Signal (Object : in out Event) is abstract; end Abstract_Interface; with Abstract_Interface; package Implementing_Interface is type Storage_Type is array (Integer range <>) of Integer; task Gary_Left is new Abstract_Interface.Mutex with entry Wait; entry Signal; entry Shutdown; end Gary_Left; task Gary_Right is new Abstract_Interface.Mutex with entry Wait; entry Signal; entry Shutdown; end Gary_Right; protected type Anh_Left is new Abstract_Interface.Buffer with Procedure Put (Data : in Integer); entry Get (Data : out Integer); private Data_Storage : Storage_Type (1 .. 10); Size : Integer := 0; In_Index : Positive := 1; Out_Index : Positive := 1; end Anh_Left; protected type Anh_Right is new Abstract_Interface.Buffer with Procedure Put (Data : in Integer); entry Get (Data : out Integer); private Data_Storage : Storage_Type (1 .. 10); Size : Integer := 0; In_Index : Positive := 1; Out_Index : Positive := 1; end Anh_Right; task type Brian_Left is new Abstract_Interface.Event with entry Wait; entry Signal; end Brian_Left; task type Brian_Right is new Abstract_Interface.Event with entry Wait; entry Signal; end Brian_Right; use Abstract_Interface; procedure Serialized_Code (Obj : in out Mutex'Class); procedure Consumer (Obj : in out Buffer'Class); procedure Producer (Obj : in out Buffer'Class; Data : in Integer); procedure Serialized_Code (Obj : in out Event'Class); end Implementing_Interface; with Ada.Text_Io; package body Implementing_Interface is use Ada; use Text_Io; task body Gary_Left is begin Put_Line ("Task Gary_Left start executes"); loop select accept Wait do Put_Line ("task Gary_Left Wait for some one"); end Wait; or accept Signal do Put_Line ("task Gary_Left Notifies some one"); end Signal; or accept Shutdown; exit; end select; end loop; Put_Line ("task Gary_Left says goodbye"); end Gary_Left; task body Gary_Right is begin Put_Line ("Task Gary_Right start executes"); loop select accept Wait do Put_Line ("Wait for some one"); end Wait; accept Signal do Put_Line ("Notify some one"); end Signal; else select accept Shutdown; exit; or delay 1.0; end select; end select; end loop; Put_Line ("Task Gary_Right terminates"); end Gary_Right; protected body Anh_Left is Procedure Put (Data : in Integer) is begin Put_Line ("Put data in buffer"); Data_Storage (In_Index) := Data; In_Index := In_Index mod Data_Storage'Length + 1; Size := Size + 1; end Put; entry Get (Data : out Integer) when Size > 0 is begin Put_Line ("Extract data"); Data := Data_Storage (Out_Index); Out_Index := Out_Index mod Data_Storage'Length + 1; Size := Size - 1; end Get; end Anh_Left; protected body Anh_Right is Procedure Put (Data : in Integer) is begin Put_Line ("Put data in buffer"); Data_Storage (In_Index) := Data; In_Index := In_Index mod Data_Storage'Length + 1; Size := Size + 1; end Put; entry Get (Data : out Integer) when Size > 0 is begin Put_Line ("Extract data"); Data := Data_Storage (Out_Index); Out_Index := Out_Index mod Data_Storage'Length + 1; Size := Size - 1; end Get; end Anh_Right; task body Brian_Left is begin loop accept Wait do Put_Line ("Wait for some one"); end Wait; accept Signal do Put_Line ("Notify some one"); end Signal; end loop; end Brian_Left; task body Brian_Right is begin loop accept Wait do Put_Line ("Wait for some one"); end Wait; accept Signal do Put_Line ("Notify some one"); end Signal; end loop; end Brian_Right; procedure Serialized_Code (Obj : in out Mutex'Class) is begin Obj.Wait; Put_Line ("Modifying data while protected by Mutex"); Obj.Signal; end Serialized_Code; procedure Consumer (Obj : in out Buffer'Class) is Data : Integer := -1; begin Obj.Get (Data); Put_Line ("Data is extracted"); end Consumer; procedure Producer (Obj : in out Buffer'Class; Data : in Integer) is begin Obj.Put (Data); Put_Line ("Data is put in the buffer"); end Producer; procedure Serialized_Code (Obj : in out Event'Class) is begin Obj.Wait; Put_Line ("Consume event notification by Event"); Obj.Signal; end Serialized_Code; end Implementing_Interface; with Gnat.OS_Lib; with Ada.Exceptions; with Ada.Text_Io; with Implementing_Interface; procedure Bugs_Test is use Ada; use Text_Io; begin Put_Line ("Minimum codes used to demonstrate the Assert_Failure"); --$$$ Causing Assert_Failure (einfo.adb:507) in gnatgcc-4.1.0 and gccgnat-4.2.0 declare use Implementing_Interface; begin Serialized_Code (Gary_Left); -- Error occurs here Gary_Left.Shutdown; delay 2.0; Serialized_Code (Gary_Right); Gary_Right.Shutdown; end; -- Terminate all child tasks if they are still around Gnat.OS_Lib.OS_Exit(0); exception when Error : others => Put_Line ("Show stopper ==> " & Exceptions.Exception_Information (Error)); -- Terminate all child tasks if they still exist Gnat.OS_Lib.OS_Exit(0); end Bugs_Test; project Assert_Failure is for Main use ("bugs_test.adb"); package Pretty_Printer is for Default_Switches ("ada") use ("-A4"); end Pretty_Printer; package Compiler is for Default_Switches ("ada") use ("-gnat05"); end Compiler; end Assert_Failure; -- Summary: Assert Failure with Bug Box Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: ada AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: anhvofrcaus at gmail dot com GCC build triplet: 4.1.0 20060106 (prerelease) (i686-pc-linux-gnu) GCC host triplet: Red Hat Linux 9.0 on i686 GCC target triplet: i686 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25838