This patch fixes a bug in the compiler whereby a conditional expression
used as an actual for an anonymous access formal when the condition is
known at compile time.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* exp_ch6.adb (Expand_Call_Helper): Properly handle the case
where the condition of a conditional expression has been
optimized out when calculating the value of an extra
accessibility parameter.
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
@@ -4014,20 +4014,23 @@ package body Exp_Ch6 is
-- Find the relevant statement in the actions
Cond := First (Actions (Branch));
- loop
+ while Present (Cond) loop
exit when Nkind (Cond) in
N_Case_Statement | N_If_Statement;
Next (Cond);
-
- if No (Cond) then
- raise Program_Error;
- end if;
end loop;
+ -- The conditional expression may have been
+ -- optimized away, so examine the actions in
+ -- the branch.
+
+ if No (Cond) then
+ Expand_Branch (Last (Actions (Branch)));
+
-- Iterate through if expression branches
- if Nkind (Cond) = N_If_Statement then
+ elsif Nkind (Cond) = N_If_Statement then
Expand_Branch (Last (Then_Statements (Cond)));
Expand_Branch (Last (Else_Statements (Cond)));