From 1bb2e1d96eb23d2289765cd0fd9ef10b7a3b7ea3 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Mon, 8 Jul 2019 08:13:48 +0000 Subject: [Ada] Crash on timed entry call with a delay given by a type conversion This patch fixes a compiler crash in the compiler on a timed entry call whose delay expression is a type conversion, when FLoat_Overflow checks are enabled. 2019-07-08 Ed Schonberg gcc/ada/ * 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. gcc/testsuite/ * gnat.dg/entry1.adb, gnat.dg/entry1.ads: New testcase. From-SVN: r273210 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/exp_ch9.adb | 25 +++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) (limited to 'gcc/ada') diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e6eac08..1650732 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2019-07-08 Ed Schonberg + + * 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 * bindo.adb: Update the section on terminology to include new diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb index 03f133f..e742ec3 100644 --- a/gcc/ada/exp_ch9.adb +++ b/gcc/ada/exp_ch9.adb @@ -3887,6 +3887,7 @@ package body Exp_Ch9 is 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); @@ -10711,7 +10712,7 @@ package body Exp_Ch9 is 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); @@ -12658,14 +12659,6 @@ package body Exp_Ch9 is 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 @@ -12673,6 +12666,13 @@ package body Exp_Ch9 is -- 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 := @@ -12855,8 +12855,8 @@ package body Exp_Ch9 is 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, @@ -14882,7 +14882,8 @@ package body Exp_Ch9 is -- 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 -- cgit v1.1