Commit 022ed178 by Arnaud Charlet

[multiple changes]

2014-07-31  Ed Schonberg  <schonberg@adacore.com>

	* exp_ch9.adb (Expand_N_Protected_Type_Declaration): New
	predicate Discriminated_Size, to distinguish between private
	components that depend on discriminants from those whose size
	depends on some other non-static expression.

2014-07-31  Nicolas Setton  <setton@adacore.com>

	* g-exptty.adb (Close): Fix binding to Waitpid: use the
	tty version.

From-SVN: r213341
parent 936ddf92
2014-07-31 Ed Schonberg <schonberg@adacore.com> 2014-07-31 Ed Schonberg <schonberg@adacore.com>
* exp_ch9.adb (Expand_N_Protected_Type_Declaration): New
predicate Discriminated_Size, to distinguish between private
components that depend on discriminants from those whose size
depends on some other non-static expression.
2014-07-31 Nicolas Setton <setton@adacore.com>
* g-exptty.adb (Close): Fix binding to Waitpid: use the
tty version.
2014-07-31 Ed Schonberg <schonberg@adacore.com>
* sem_ch3.adb (Make_Index): Reject properly the use of 'Length * sem_ch3.adb (Make_Index): Reject properly the use of 'Length
in a discrete range, when 'range was probably intended. in a discrete range, when 'range was probably intended.
......
...@@ -8877,6 +8877,12 @@ package body Exp_Ch9 is ...@@ -8877,6 +8877,12 @@ package body Exp_Ch9 is
-- to the internal body, for possible inlining later on. The source -- to the internal body, for possible inlining later on. The source
-- operation is invisible to the back-end and is never actually called. -- operation is invisible to the back-end and is never actually called.
function Discriminated_Size (Comp : Entity_Id) return Boolean;
-- If a component size is not static then a warning will be emitted
-- in Ravenscar or other restricted contexts. When a component is non-
-- static because of a discriminant constraint we can specialize the
-- warning by mentioning discriminants explicitly.
procedure Expand_Entry_Declaration (Comp : Entity_Id); procedure Expand_Entry_Declaration (Comp : Entity_Id);
-- Create the subprograms for the barrier and for the body, and append -- Create the subprograms for the barrier and for the body, and append
-- then to Entry_Bodies_Array. -- then to Entry_Bodies_Array.
...@@ -8904,9 +8910,65 @@ package body Exp_Ch9 is ...@@ -8904,9 +8910,65 @@ package body Exp_Ch9 is
end if; end if;
end Check_Inlining; end Check_Inlining;
--------------------------------- ------------------------
-- Check_Static_Component_Size -- -- Discriminated_Size --
--------------------------------- ------------------------
function Discriminated_Size (Comp : Entity_Id) return Boolean
is
Typ : constant Entity_Id := Etype (Comp);
Index : Node_Id;
function Non_Static_Bound (Bound : Node_Id) return Boolean;
-- Check whether the bound of an index is non-static and does
-- denote a discriminant, in which case any protected object of
-- the type will have a non-static size.
----------------------
-- Non_Static_Bound --
----------------------
function Non_Static_Bound (Bound : Node_Id) return Boolean is
begin
if Is_Static_Expression (Bound) then
return False;
elsif Is_Entity_Name (Bound)
and then Present (Discriminal_Link (Entity (Bound)))
then
return False;
else
return True;
end if;
end Non_Static_Bound;
begin
if not Is_Array_Type (Typ) then
return False;
end if;
if Ekind (Typ) = E_Array_Subtype then
Index := First_Index (Typ);
while Present (Index) loop
if Non_Static_Bound (Low_Bound (Index))
or else Non_Static_Bound (High_Bound (Index))
then
return False;
end if;
Next_Index (Index);
end loop;
return True;
end if;
return False;
end Discriminated_Size;
---------------------------
-- Static_Component_Size --
---------------------------
function Static_Component_Size (Comp : Entity_Id) return Boolean is function Static_Component_Size (Comp : Entity_Id) return Boolean is
Typ : constant Entity_Id := Etype (Comp); Typ : constant Entity_Id := Etype (Comp);
...@@ -9100,11 +9162,26 @@ package body Exp_Ch9 is ...@@ -9100,11 +9162,26 @@ package body Exp_Ch9 is
Check_Restriction (No_Implicit_Heap_Allocations, Priv); Check_Restriction (No_Implicit_Heap_Allocations, Priv);
elsif Restriction_Active (No_Implicit_Heap_Allocations) then elsif Restriction_Active (No_Implicit_Heap_Allocations) then
Error_Msg_N ("component has non-static size??", Priv); if not Discriminated_Size (Defining_Identifier (Priv))
Error_Msg_NE then
("\creation of protected object of type& will violate"
& " restriction No_Implicit_Heap_Allocations??", -- Any object of the type will be non-static.
Priv, Prot_Typ);
Error_Msg_N ("component has non-static size??", Priv);
Error_Msg_NE
("\creation of protected object of type& will"
& " violate restriction "
& "No_Implicit_Heap_Allocations??", Priv, Prot_Typ);
else
-- Object will be non-static if discriminants are.
Error_Msg_NE
("creation of protected object of type& with "
& "non-static discriminants will violate"
& " restriction No_Implicit_Heap_Allocations??",
Priv, Prot_Typ);
end if;
end if; end if;
end if; end if;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 2000-2011, AdaCore -- -- Copyright (C) 2000-2014, AdaCore --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -50,7 +50,7 @@ package body GNAT.Expect.TTY is ...@@ -50,7 +50,7 @@ package body GNAT.Expect.TTY is
pragma Import (C, Terminate_Process, "__gnat_terminate_process"); pragma Import (C, Terminate_Process, "__gnat_terminate_process");
function Waitpid (Process : System.Address) return Integer; function Waitpid (Process : System.Address) return Integer;
pragma Import (C, Waitpid, "__gnat_waitpid"); pragma Import (C, Waitpid, "__gnat_tty_waitpid");
-- Wait for a specific process id, and return its exit code -- Wait for a specific process id, and return its exit code
procedure Free_Process (Process : System.Address); procedure Free_Process (Process : System.Address);
...@@ -66,6 +66,18 @@ package body GNAT.Expect.TTY is ...@@ -66,6 +66,18 @@ package body GNAT.Expect.TTY is
Status := -1; Status := -1;
else else
-- Send a Ctrl-C to the process first. This way, if the
-- launched process is a "sh" or "cmd", the child processes
-- will get terminated as well. Otherwise, terminating the
-- main process brutally will leave the children running.
--
-- Note: special characters are sent to the terminal to generate
-- the signal, so this needs to be done while the file descriptors
-- are still open.
Interrupt (Descriptor);
delay (0.05);
if Descriptor.Input_Fd /= Invalid_FD then if Descriptor.Input_Fd /= Invalid_FD then
Close (Descriptor.Input_Fd); Close (Descriptor.Input_Fd);
end if; end if;
...@@ -80,14 +92,6 @@ package body GNAT.Expect.TTY is ...@@ -80,14 +92,6 @@ package body GNAT.Expect.TTY is
Close (Descriptor.Output_Fd); Close (Descriptor.Output_Fd);
end if; end if;
-- Send a Ctrl-C to the process first. This way, if the
-- launched process is a "sh" or "cmd", the child processes
-- will get terminated as well. Otherwise, terminating the
-- main process brutally will leave the children running.
Interrupt (Descriptor);
delay 0.05;
Terminate_Process (Descriptor.Process); Terminate_Process (Descriptor.Process);
Status := Waitpid (Descriptor.Process); Status := Waitpid (Descriptor.Process);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment