[Ada] Hang on conditional expression as actual

Message ID 20200707092736.GA41627@adacore.com
State New
Headers show
Series
  • [Ada] Hang on conditional expression as actual
Related show

Commit Message

Pierre-Marie de Rodat July 7, 2020, 9:27 a.m.
This patch fixes the compiler whereby conditional expressions used as
actuals for anonymous access type in subprogram calls may result in an
infinite loop when one of the branches of said conditional expression
expands to an N_Expression_With_Actions

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* exp_ch6.adb (Expand_Branch): Verify the original node is a
	conditional expression before recursing further.
	(Insert_Level_Assign): Transform assertion into an explicit
	raise.

Patch

diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -3947,6 +3947,11 @@  package body Exp_Ch6 is
 
                                  if Nkind (Expression (Assn)) =
                                       N_Expression_With_Actions
+                                   and then
+                                     Nkind_In
+                                       (Original_Node (Expression (Assn)),
+                                         N_Case_Expression,
+                                         N_If_Expression)
                                  then
                                     Insert_Level_Assign (Expression (Assn));
 
@@ -3983,7 +3988,10 @@  package body Exp_Ch6 is
                                                            N_If_Statement);
 
                                  Next (Cond);
-                                 pragma Assert (Present (Cond));
+
+                                 if No (Cond) then
+                                    raise Program_Error;
+                                 end if;
                               end loop;
 
                               --  Iterate through if expression branches