+2019-07-08 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch9.adb (Expand_N_Timed_Entry_Call): Do not insert twice
+ the assignment statement that computes the delay value, to
+ prevent improper tree sharing when the value is a type
+ conversion and Float_Overflow checks are enabled.
+
2019-07-08 Hristian Kirtchev <kirtchev@adacore.com>
* bindo.adb: Update the section on terminology to include new
if Unprotected then
Set_Protected_Formal (Formal, Defining_Identifier (New_Param));
+ Set_Ekind (Defining_Identifier (New_Param), Ekind (Formal));
end if;
Append (New_Param, New_Plist);
Make_Defining_Identifier (Eloc,
New_External_Name (Chars (Ename), 'A', Num_Accept));
- -- Link the acceptor to the original receiving entry
+ -- Link the acceptor to the original receiving entry.
Set_Ekind (PB_Ent, E_Procedure);
Set_Receiving_Entry (PB_Ent, Eent);
Object_Definition => New_Occurrence_Of (Standard_Integer, Loc),
Expression => D_Disc));
- -- Do the assignment at this stage only because the evaluation of the
- -- expression must not occur earlier (see ACVC C97302A).
-
- Append_To (Stmts,
- Make_Assignment_Statement (Loc,
- Name => New_Occurrence_Of (D, Loc),
- Expression => D_Conv));
-
-- Parameter block processing
-- Manually create the parameter block for dispatching calls. In the
-- to Build_Simple_Entry_Call.
if Is_Disp_Select then
+ -- Compute the delay at this stage because the evaluation of
+ -- its expression must not occur earlier (see ACVC C97302A).
+
+ Append_To (Stmts,
+ Make_Assignment_Statement (Loc,
+ Name => New_Occurrence_Of (D, Loc),
+ Expression => D_Conv));
-- Tagged kind processing, generate:
-- K : Ada.Tags.Tagged_Kind :=
Next (Stmt);
end loop;
- -- Do the assignment at this stage only because the evaluation
- -- of the expression must not occur earlier (see ACVC C97302A).
+ -- Compute the delay at this stage because the evaluation of
+ -- its expression must not occur earlier (see ACVC C97302A).
Insert_Before (Stmt,
Make_Assignment_Statement (Loc,
-- Ditto for a package declaration or a full type declaration, etc.
- elsif Nkind (N) = N_Package_Declaration
+ elsif
+ (Nkind (N) = N_Package_Declaration and then N /= Specification (N))
or else Nkind (N) in N_Declaration
or else Nkind (N) in N_Renaming_Declaration
then
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-gnateF" }
+
+PACKAGE BODY Entry1 IS
+
+ PROTECTED TYPE key_buffer IS
+
+ PROCEDURE clear;
+
+ ENTRY incr;
+ ENTRY put (val : IN Natural);
+ ENTRY get (val : OUT Natural);
+
+ PRIVATE
+
+ -- Stores Key states (key state controller)
+ -- purpose: exclusive access
+ max_len : Natural := 10;
+
+ cnt : Natural := 0;
+
+ END key_buffer;
+
+ PROTECTED BODY key_buffer IS
+
+ PROCEDURE clear IS
+ BEGIN
+ cnt := 0;
+ END clear;
+
+ ENTRY incr WHEN cnt < max_len IS
+ BEGIN
+ cnt := cnt + 1;
+ END;
+
+ ENTRY put (val : IN Natural) WHEN cnt < max_len IS
+ BEGIN
+ cnt := val;
+ END put;
+
+ ENTRY get (val : OUT Natural) WHEN cnt > 0 IS
+ BEGIN
+ val := cnt;
+ END get;
+
+ END key_buffer;
+
+ my_buffer : key_buffer;
+
+ FUNCTION pt2 (t : IN Float) RETURN Natural IS
+ c : Natural;
+ t2 : duration := duration (t);
+ BEGIN
+ SELECT
+ my_buffer.get (c);
+ RETURN c;
+ OR
+ DELAY t2;
+ RETURN 0;
+ END SELECT;
+ END pt2;
+
+ FUNCTION pt (t : IN Float) RETURN Natural IS
+ c : Natural;
+ BEGIN
+ SELECT
+ my_buffer.get (c);
+ RETURN c;
+ OR
+ DELAY Duration (t);
+ RETURN 0;
+ END SELECT;
+ END pt;
+
+END Entry1;