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 triggers a crash during compilation.
Tested on x86_64-pc-linux-gnu, committed on trunk
gcc/ada/
* exp_ch6.adb (Expand_Branch): Properly anticipate expansion of
conditional expressions producing object declarations in
addition to assignment statements, and rename formal.
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
@@ -3961,42 +3961,47 @@ package body Exp_Ch6 is
procedure Insert_Level_Assign (Branch : Node_Id) is
- procedure Expand_Branch (Assn : Node_Id);
+ procedure Expand_Branch (Res_Assn : Node_Id);
-- Perform expansion or iterate further within
- -- nested conditionals.
+ -- nested conditionals given the object
+ -- declaration or assignment to result object
+ -- created during expansion which represents
+ -- a branch of the conditional expression.
-------------------
-- Expand_Branch --
-------------------
- procedure Expand_Branch (Assn : Node_Id) is
+ procedure Expand_Branch (Res_Assn : Node_Id) is
begin
- pragma Assert (Nkind (Assn) =
- N_Assignment_Statement);
+ pragma Assert (Nkind (Res_Assn) in
+ N_Assignment_Statement |
+ N_Object_Declaration);
-- There are more nested conditional
-- expressions so we must go deeper.
- if Nkind (Expression (Assn)) =
+ if Nkind (Expression (Res_Assn)) =
N_Expression_With_Actions
and then
Nkind
- (Original_Node (Expression (Assn))) in
- N_Case_Expression | N_If_Expression
+ (Original_Node (Expression (Res_Assn)))
+ in N_Case_Expression | N_If_Expression
then
- Insert_Level_Assign (Expression (Assn));
+ Insert_Level_Assign
+ (Expression (Res_Assn));
-- Add the level assignment
else
- Insert_Before_And_Analyze (Assn,
+ Insert_Before_And_Analyze (Res_Assn,
Make_Assignment_Statement (Loc,
Name =>
New_Occurrence_Of
(Lvl, Loc),
Expression =>
Dynamic_Accessibility_Level
- (Expression (Assn))));
+ (Expression (Res_Assn))));
end if;
end Expand_Branch;