aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorRobert Dewar <dewar@adacore.com>2012-10-02 08:48:27 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2012-10-02 10:48:27 +0200
commit9b16cb57dedec3d7fb690ad7770f2ca9ca85f586 (patch)
tree427db6631f4424c39ebbfe7c953d008cfee86519 /gcc/ada
parentcb42ba5d667142c60c27fadd8efba35e0e18e797 (diff)
downloadgcc-9b16cb57dedec3d7fb690ad7770f2ca9ca85f586.zip
gcc-9b16cb57dedec3d7fb690ad7770f2ca9ca85f586.tar.gz
gcc-9b16cb57dedec3d7fb690ad7770f2ca9ca85f586.tar.bz2
par_sco.adb, [...]: Change name Conditional_Expression to If_Expression.
2012-10-02 Robert Dewar <dewar@adacore.com> * par_sco.adb, sem_ch3.adb, layout.adb, exp_ch7.adb, exp_imgv.adb, exp_util.adb, exp_util.ads, exp_attr.adb, sinfo.adb, sinfo.ads, exp_ch9.adb, style.ads, scos.ads, debug.adb, einfo.ads, scng.adb, checks.adb, checks.ads, sem.adb, par-ch4.adb, sem_util.adb, types.h, sem_res.adb, expander.adb, scans.ads, par.adb, exp_ch2.adb, gnat1drv.adb, stylesw.ads, sem_elab.adb, exp_ch4.adb, exp_ch4.ads, exp_ch6.adb, sem_ch4.adb, sem_ch4.ads, sem_ch6.adb, opt.ads, sem_eval.adb, sem_eval.ads, exp_intr.adb, sprint.adb, sprint.ads, styleg.ads: Change name Conditional_Expression to If_Expression. * gcc-interface/trans.c (gnat_to_gnu): Replace N_Conditional_Expression by N_If_Expression. * gcc-interface/Make-lang.in: Update dependencies. From-SVN: r191967
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog16
-rw-r--r--gcc/ada/checks.adb30
-rw-r--r--gcc/ada/checks.ads2
-rw-r--r--gcc/ada/debug.adb2
-rw-r--r--gcc/ada/einfo.ads2
-rw-r--r--gcc/ada/exp_attr.adb14
-rw-r--r--gcc/ada/exp_ch2.adb2
-rw-r--r--gcc/ada/exp_ch4.adb380
-rw-r--r--gcc/ada/exp_ch4.ads4
-rw-r--r--gcc/ada/exp_ch6.adb17
-rw-r--r--gcc/ada/exp_ch7.adb4
-rw-r--r--gcc/ada/exp_ch9.adb6
-rw-r--r--gcc/ada/exp_imgv.adb18
-rw-r--r--gcc/ada/exp_intr.adb6
-rw-r--r--gcc/ada/exp_util.adb26
-rw-r--r--gcc/ada/exp_util.ads4
-rw-r--r--gcc/ada/expander.adb8
-rw-r--r--gcc/ada/gcc-interface/Make-lang.in227
-rw-r--r--gcc/ada/gcc-interface/trans.c2
-rw-r--r--gcc/ada/gnat1drv.adb2
-rw-r--r--gcc/ada/layout.adb12
-rw-r--r--gcc/ada/opt.ads7
-rw-r--r--gcc/ada/par-ch4.adb70
-rw-r--r--gcc/ada/par.adb18
-rw-r--r--gcc/ada/par_sco.adb13
-rw-r--r--gcc/ada/scans.ads6
-rw-r--r--gcc/ada/scng.adb4
-rw-r--r--gcc/ada/scos.ads2
-rw-r--r--gcc/ada/sem.adb6
-rw-r--r--gcc/ada/sem_ch3.adb26
-rw-r--r--gcc/ada/sem_ch4.adb146
-rw-r--r--gcc/ada/sem_ch4.ads2
-rw-r--r--gcc/ada/sem_ch6.adb8
-rw-r--r--gcc/ada/sem_elab.adb9
-rw-r--r--gcc/ada/sem_eval.adb130
-rw-r--r--gcc/ada/sem_eval.ads4
-rw-r--r--gcc/ada/sem_res.adb190
-rw-r--r--gcc/ada/sem_util.adb8
-rw-r--r--gcc/ada/sinfo.adb20
-rw-r--r--gcc/ada/sinfo.ads53
-rw-r--r--gcc/ada/sprint.adb42
-rw-r--r--gcc/ada/sprint.ads1
-rw-r--r--gcc/ada/style.ads4
-rw-r--r--gcc/ada/styleg.ads4
-rw-r--r--gcc/ada/stylesw.ads4
-rw-r--r--gcc/ada/types.h1
46 files changed, 795 insertions, 767 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index b93836e..8fd7724 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,21 @@
2012-10-02 Robert Dewar <dewar@adacore.com>
+ * par_sco.adb, sem_ch3.adb, layout.adb, exp_ch7.adb, exp_imgv.adb,
+ exp_util.adb, exp_util.ads, exp_attr.adb, sinfo.adb, sinfo.ads,
+ exp_ch9.adb, style.ads, scos.ads, debug.adb, einfo.ads, scng.adb,
+ checks.adb, checks.ads, sem.adb, par-ch4.adb, sem_util.adb, types.h,
+ sem_res.adb, expander.adb, scans.ads, par.adb, exp_ch2.adb,
+ gnat1drv.adb, stylesw.ads, sem_elab.adb, exp_ch4.adb, exp_ch4.ads,
+ exp_ch6.adb, sem_ch4.adb, sem_ch4.ads, sem_ch6.adb,
+ opt.ads, sem_eval.adb, sem_eval.ads, exp_intr.adb, sprint.adb,
+ sprint.ads, styleg.ads: Change name Conditional_Expression to
+ If_Expression.
+ * gcc-interface/trans.c (gnat_to_gnu): Replace
+ N_Conditional_Expression by N_If_Expression.
+ * gcc-interface/Make-lang.in: Update dependencies.
+
+2012-10-02 Robert Dewar <dewar@adacore.com>
+
* exp_ch4.adb (Expand_N_Op_Expon): Use expression with actions
for x ** 4.
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index da20292..a31e87b 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -197,13 +197,14 @@ package body Checks is
-- Used to apply arithmetic overflow checks for all cases except operators
-- on signed arithmetic types in Minimized/Eliminate case (for which we
-- call Apply_Arithmetic_Overflow_Minimized_Eliminated below). N is always
- -- a signed integer arithmetic operator (conditional expression excluded).
+ -- a signed integer arithmetic operator (if and case expressions are not
+ -- included for this case).
procedure Apply_Arithmetic_Overflow_Minimized_Eliminated (Op : Node_Id);
-- Used to apply arithmetic overflow checks for the case where the overflow
-- checking mode is Minimized or Eliminated (and the Do_Overflow_Check flag
-- is known to be set) and we have an signed integer arithmetic op (which
- -- includes the case of conditional expressions).
+ -- includes the case of if and case expressions).
procedure Apply_Division_Check
(N : Node_Id;
@@ -6258,8 +6259,7 @@ package body Checks is
N_Op_Rem | N_Op_Subtract =>
return Is_Signed_Integer_Type (Etype (N));
- when N_Conditional_Expression |
- N_Case_Expression =>
+ when N_If_Expression | N_Case_Expression =>
return Is_Signed_Integer_Type (Etype (N));
when N_Case_Expression_Alternative =>
@@ -6338,11 +6338,11 @@ package body Checks is
return False;
end if;
- -- Similarly, if we are in a conditional expression and not
- -- part of the condition, then we return False, since neither
- -- the THEN or ELSE expressions will always be elaborated.
+ -- Similarly, if we are in an if expression and not part of the
+ -- condition, then we return False, since neither the THEN or
+ -- ELSE dependent expressions will always be elaborated.
- if Nkind (P) = N_Conditional_Expression
+ if Nkind (P) = N_If_Expression
and then N /= First (Expressions (P))
then
return False;
@@ -6350,7 +6350,7 @@ package body Checks is
-- If we are in a case expression, and not part of the
-- expression, then we return False, since a particular
- -- branch may not always be elaborated
+ -- dependent expression may not always be elaborated
if Nkind (P) = N_Case_Expression
and then N /= Expression (P)
@@ -6805,7 +6805,7 @@ package body Checks is
-- Processing for if expression
- elsif Nkind (N) = N_Conditional_Expression then
+ elsif Nkind (N) = N_If_Expression then
declare
Then_DE : constant Node_Id := Next (First (Expressions (N)));
Else_DE : constant Node_Id := Next (Then_DE);
@@ -6840,7 +6840,7 @@ package body Checks is
if Bignum_Operands then
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Remove_Head (Expressions (N)),
Convert_To_Bignum (Then_DE),
@@ -8021,10 +8021,10 @@ package body Checks is
if Is_Array_Type (T_Typ) and then Is_Array_Type (S_Typ) then
if Is_Constrained (T_Typ) then
- -- The checking code to be generated will freeze the
- -- corresponding array type. However, we must freeze the
- -- type now, so that the freeze node does not appear within
- -- the generated conditional expression, but ahead of it.
+ -- The checking code to be generated will freeze the corresponding
+ -- array type. However, we must freeze the type now, so that the
+ -- freeze node does not appear within the generated if expression,
+ -- but ahead of it.
Freeze_Before (Ck_Node, T_Typ);
diff --git a/gcc/ada/checks.ads b/gcc/ada/checks.ads
index 29a65f6..6478eec 100644
--- a/gcc/ada/checks.ads
+++ b/gcc/ada/checks.ads
@@ -138,7 +138,7 @@ package Checks is
-- Handle overflow checking for an arithmetic operator. Also handles the
-- cases of ELIMINATED and MINIMIZED overflow checking mode. If the mode
-- is one of the latter two, then this routine can also be called with
- -- a conditional expression node to make sure that we properly handle
+ -- an if or case expression node to make sure that we properly handle
-- overflow checking for dependent expressions. This routine handles
-- front end vs back end overflow checks (in the front end case it expands
-- the necessary check). Note that divide is handled separately using
diff --git a/gcc/ada/debug.adb b/gcc/ada/debug.adb
index 33f99c6..f6f24f9 100644
--- a/gcc/ada/debug.adb
+++ b/gcc/ada/debug.adb
@@ -129,7 +129,7 @@ package body Debug is
-- d.I SCIL generation mode
-- d.J Disable parallel SCIL generation mode
-- d.K Alfa detection only mode for gnat2why
- -- d.L Depend on back end for limited types in conditional expressions
+ -- d.L Depend on back end for limited types in if and case expressions
-- d.M
-- d.N Add node to all entities
-- d.O Dump internal SCO tables
diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads
index 3da5301..bf36016 100644
--- a/gcc/ada/einfo.ads
+++ b/gcc/ada/einfo.ads
@@ -3681,7 +3681,7 @@ package Einfo is
-- Status_Flag_Or_Transient_Decl (Node15)
-- Present in variables and constants. Applies to objects that require
-- special treatment by the finalization machinery. Such examples are
--- extended return results, conditional expression results and objects
+-- extended return results, if and case expression results and objects
-- inside N_Expression_With_Actions nodes. The attribute contains the
-- entity of a flag which specifies particular behavior over a region
-- of code or the declaration of a "hook" object.
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index 105df46..04930a9 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -3324,13 +3324,13 @@ package body Exp_Attr is
-- Furthermore, (-value - 1) can be expressed as -(value + 1)
-- which we can compute using the integer base type.
- -- Once this is done we analyze the conditional expression without
- -- range checks, because we know everything is in range, and we
- -- want to prevent spurious warnings on either branch.
+ -- Once this is done we analyze the if expression without range
+ -- checks, because we know everything is in range, and we want
+ -- to prevent spurious warnings on either branch.
else
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Ge (Loc,
Left_Opnd => Duplicate_Subexpr (Arg),
@@ -3500,7 +3500,7 @@ package body Exp_Attr is
Right_Opnd => Y_Addr);
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
New_List (
Cond,
@@ -5643,8 +5643,8 @@ package body Exp_Attr is
Analyze_And_Resolve (N, Standard_Boolean);
- -- For record types, we build a big conditional expression, applying
- -- Valid or Valid_Scalars as appropriate to all relevant components.
+ -- For record types, we build a big if expression, applying Valid or
+ -- Valid_Scalars as appropriate to all relevant components.
elsif (Is_Record_Type (Ptyp) or else Has_Discriminants (Ptyp))
and then not No_Scalar_Parts (Ptyp)
diff --git a/gcc/ada/exp_ch2.adb b/gcc/ada/exp_ch2.adb
index d914367..37a5bda 100644
--- a/gcc/ada/exp_ch2.adb
+++ b/gcc/ada/exp_ch2.adb
@@ -177,7 +177,7 @@ package body Exp_Ch2 is
if Nkind (CV) in N_Subexpr then
Val := CV;
- -- Case of Current_Value is a conditional expression reference
+ -- Case of Current_Value is an if expression reference
else
Get_Current_Value_Condition (N, Op, Val);
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index ece60ef..9a07c60 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -3391,7 +3391,7 @@ package body Exp_Ch4 is
Low_Bound := Opnd_Low_Bound (1);
-- OK, we don't know the lower bound, we have to build a horrible
- -- conditional expression node of the form
+ -- if expression node of the form
-- if Cond1'Length /= 0 then
-- Opnd1 low bound
@@ -3422,7 +3422,7 @@ package body Exp_Ch4 is
else
return
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Ne (Loc,
@@ -3476,7 +3476,7 @@ package body Exp_Ch4 is
if Result_May_Be_Null then
Low_Bound :=
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd => New_Copy (Aggr_Length (NN)),
@@ -3485,7 +3485,7 @@ package body Exp_Ch4 is
Low_Bound));
High_Bound :=
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd => New_Copy (Aggr_Length (NN)),
@@ -4630,8 +4630,8 @@ package body Exp_Ch4 is
end;
-- We set the allocator as analyzed so that when we analyze
- -- the conditional expression node, we do not get an unwanted
- -- recursive expansion of the allocator expression.
+ -- the if expression node, we do not get an unwanted recursive
+ -- expansion of the allocator expression.
Set_Analyzed (N, True);
Nod := Relocate_Node (N);
@@ -4918,21 +4918,188 @@ package body Exp_Ch4 is
Analyze_And_Resolve (N, Typ);
end Expand_N_Case_Expression;
- -------------------------------------
- -- Expand_N_Conditional_Expression --
- -------------------------------------
+ -----------------------------------
+ -- Expand_N_Explicit_Dereference --
+ -----------------------------------
+
+ procedure Expand_N_Explicit_Dereference (N : Node_Id) is
+ begin
+ -- Insert explicit dereference call for the checked storage pool case
+
+ Insert_Dereference_Action (Prefix (N));
+
+ -- If the type is an Atomic type for which Atomic_Sync is enabled, then
+ -- we set the atomic sync flag.
+
+ if Is_Atomic (Etype (N))
+ and then not Atomic_Synchronization_Disabled (Etype (N))
+ then
+ Activate_Atomic_Synchronization (N);
+ end if;
+ end Expand_N_Explicit_Dereference;
+
+ --------------------------------------
+ -- Expand_N_Expression_With_Actions --
+ --------------------------------------
+
+ procedure Expand_N_Expression_With_Actions (N : Node_Id) is
+
+ procedure Process_Transient_Object (Decl : Node_Id);
+ -- Given the declaration of a controlled transient declared inside the
+ -- Actions list of an Expression_With_Actions, generate all necessary
+ -- types and hooks in order to properly finalize the transient. This
+ -- mechanism works in conjunction with Build_Finalizer.
+
+ ------------------------------
+ -- Process_Transient_Object --
+ ------------------------------
+
+ procedure Process_Transient_Object (Decl : Node_Id) is
+
+ function Find_Insertion_Node return Node_Id;
+ -- Complex conditions in if statements may be converted into nested
+ -- EWAs. In this case, any generated code must be inserted before the
+ -- if statement to ensure proper visibility of the hook objects. This
+ -- routine returns the top most short circuit operator or the parent
+ -- of the EWA if no nesting was detected.
+
+ -------------------------
+ -- Find_Insertion_Node --
+ -------------------------
+
+ function Find_Insertion_Node return Node_Id is
+ Par : Node_Id;
+
+ begin
+ -- Climb up the branches of a complex condition
+
+ Par := N;
+ while Nkind_In (Parent (Par), N_And_Then, N_Op_Not, N_Or_Else) loop
+ Par := Parent (Par);
+ end loop;
+
+ return Par;
+ end Find_Insertion_Node;
+
+ -- Local variables
+
+ Ins_Node : constant Node_Id := Find_Insertion_Node;
+ Loc : constant Source_Ptr := Sloc (Decl);
+ Obj_Id : constant Entity_Id := Defining_Identifier (Decl);
+ Obj_Typ : constant Entity_Id := Etype (Obj_Id);
+ Desig_Typ : Entity_Id;
+ Expr : Node_Id;
+ Ptr_Decl : Node_Id;
+ Ptr_Id : Entity_Id;
+ Temp_Decl : Node_Id;
+ Temp_Id : Node_Id;
+
+ -- Start of processing for Process_Transient_Object
+
+ begin
+ -- Step 1: Create the access type which provides a reference to the
+ -- transient object.
+
+ if Is_Access_Type (Obj_Typ) then
+ Desig_Typ := Directly_Designated_Type (Obj_Typ);
+ else
+ Desig_Typ := Obj_Typ;
+ end if;
+
+ -- Generate:
+ -- Ann : access [all] <Desig_Typ>;
+
+ Ptr_Id := Make_Temporary (Loc, 'A');
+
+ Ptr_Decl :=
+ Make_Full_Type_Declaration (Loc,
+ Defining_Identifier => Ptr_Id,
+ Type_Definition =>
+ Make_Access_To_Object_Definition (Loc,
+ All_Present =>
+ Ekind (Obj_Typ) = E_General_Access_Type,
+ Subtype_Indication => New_Reference_To (Desig_Typ, Loc)));
+
+ Insert_Action (Ins_Node, Ptr_Decl);
+ Analyze (Ptr_Decl);
+
+ -- Step 2: Create a temporary which acts as a hook to the transient
+ -- object. Generate:
+
+ -- Temp : Ptr_Id := null;
+
+ Temp_Id := Make_Temporary (Loc, 'T');
+
+ Temp_Decl :=
+ Make_Object_Declaration (Loc,
+ Defining_Identifier => Temp_Id,
+ Object_Definition => New_Reference_To (Ptr_Id, Loc));
+
+ Insert_Action (Ins_Node, Temp_Decl);
+ Analyze (Temp_Decl);
+
+ -- Mark this temporary as created for the purposes of exporting the
+ -- transient declaration out of the Actions list. This signals the
+ -- machinery in Build_Finalizer to recognize this special case.
+
+ Set_Status_Flag_Or_Transient_Decl (Temp_Id, Decl);
+
+ -- Step 3: Hook the transient object to the temporary
+
+ if Is_Access_Type (Obj_Typ) then
+ Expr := Convert_To (Ptr_Id, New_Reference_To (Obj_Id, Loc));
+ else
+ Expr :=
+ Make_Attribute_Reference (Loc,
+ Prefix => New_Reference_To (Obj_Id, Loc),
+ Attribute_Name => Name_Unrestricted_Access);
+ end if;
+
+ -- Generate:
+ -- Temp := Ptr_Id (Obj_Id);
+ -- <or>
+ -- Temp := Obj_Id'Unrestricted_Access;
+
+ Insert_After_And_Analyze (Decl,
+ Make_Assignment_Statement (Loc,
+ Name => New_Reference_To (Temp_Id, Loc),
+ Expression => Expr));
+ end Process_Transient_Object;
+
+ -- Local variables
+
+ Decl : Node_Id;
+
+ -- Start of processing for Expand_N_Expression_With_Actions
+
+ begin
+ Decl := First (Actions (N));
+ while Present (Decl) loop
+ if Nkind (Decl) = N_Object_Declaration
+ and then Is_Finalizable_Transient (Decl, N)
+ then
+ Process_Transient_Object (Decl);
+ end if;
+
+ Next (Decl);
+ end loop;
+ end Expand_N_Expression_With_Actions;
+
+ ----------------------------
+ -- Expand_N_If_Expression --
+ ----------------------------
-- Deal with limited types and condition actions
- procedure Expand_N_Conditional_Expression (N : Node_Id) is
+ procedure Expand_N_If_Expression (N : Node_Id) is
function Create_Alternative
(Loc : Source_Ptr;
Temp_Id : Entity_Id;
Flag_Id : Entity_Id;
Expr : Node_Id) return List_Id;
- -- Build the statements of a "then" or "else" conditional expression
- -- alternative. Temp_Id is the conditional expression result, Flag_Id
- -- is a finalization flag created to service expression Expr.
+ -- Build the statements of a "then" or "else" dependent expression
+ -- alternative. Temp_Id is the if expression result, Flag_Id is a
+ -- finalization flag created to service expression Expr.
function Is_Controlled_Function_Call (Expr : Node_Id) return Boolean;
-- Determine if expression Expr is a rewritten controlled function call
@@ -5004,9 +5171,9 @@ package body Exp_Ch4 is
begin
-- Fold at compile time if condition known. We have already folded
- -- static conditional expressions, but it is possible to fold any
- -- case in which the condition is known at compile time, even though
- -- the result is non-static.
+ -- static if expressions, but it is possible to fold any case in which
+ -- the condition is known at compile time, even though the result is
+ -- non-static.
-- Note that we don't do the fold of such cases in Sem_Elab because
-- it can cause infinite loops with the expander adding a conditional
@@ -5043,7 +5210,7 @@ package body Exp_Ch4 is
end if;
-- Note that the result is never static (legitimate cases of static
- -- conditional expressions were folded in Sem_Eval).
+ -- if expressions were folded in Sem_Eval).
Set_Is_Static_Expression (N, False);
return;
@@ -5067,7 +5234,7 @@ package body Exp_Ch4 is
-- Cnn := else-expr'Unrestricted_Access;
-- end if;
- -- and replace the conditional expression by a reference to Cnn.all.
+ -- and replace the if expression by a reference to Cnn.all.
-- This special case can be skipped if the back end handles limited
-- types properly and ensures that no incorrect copies are made.
@@ -5082,7 +5249,7 @@ package body Exp_Ch4 is
begin
Flag_Id := Empty;
- -- At least one of the conditional expression alternatives uses a
+ -- At least one of the if expression dependent expressions uses a
-- controlled function to provide the result. Create a status flag
-- to signal the finalization machinery that Cnn needs special
-- handling.
@@ -5182,7 +5349,7 @@ package body Exp_Ch4 is
-- Cnn := else-expr
-- end if;
- -- and replace the conditional expression by a reference to Cnn
+ -- and replace the if expression by a reference to Cnn
else
Cnn := Make_Temporary (Loc, 'C', N);
@@ -5258,174 +5425,7 @@ package body Exp_Ch4 is
Insert_Action (N, New_If);
Rewrite (N, New_N);
Analyze_And_Resolve (N, Typ);
- end Expand_N_Conditional_Expression;
-
- -----------------------------------
- -- Expand_N_Explicit_Dereference --
- -----------------------------------
-
- procedure Expand_N_Explicit_Dereference (N : Node_Id) is
- begin
- -- Insert explicit dereference call for the checked storage pool case
-
- Insert_Dereference_Action (Prefix (N));
-
- -- If the type is an Atomic type for which Atomic_Sync is enabled, then
- -- we set the atomic sync flag.
-
- if Is_Atomic (Etype (N))
- and then not Atomic_Synchronization_Disabled (Etype (N))
- then
- Activate_Atomic_Synchronization (N);
- end if;
- end Expand_N_Explicit_Dereference;
-
- --------------------------------------
- -- Expand_N_Expression_With_Actions --
- --------------------------------------
-
- procedure Expand_N_Expression_With_Actions (N : Node_Id) is
-
- procedure Process_Transient_Object (Decl : Node_Id);
- -- Given the declaration of a controlled transient declared inside the
- -- Actions list of an Expression_With_Actions, generate all necessary
- -- types and hooks in order to properly finalize the transient. This
- -- mechanism works in conjunction with Build_Finalizer.
-
- ------------------------------
- -- Process_Transient_Object --
- ------------------------------
-
- procedure Process_Transient_Object (Decl : Node_Id) is
-
- function Find_Insertion_Node return Node_Id;
- -- Complex conditions in if statements may be converted into nested
- -- EWAs. In this case, any generated code must be inserted before the
- -- if statement to ensure proper visibility of the hook objects. This
- -- routine returns the top most short circuit operator or the parent
- -- of the EWA if no nesting was detected.
-
- -------------------------
- -- Find_Insertion_Node --
- -------------------------
-
- function Find_Insertion_Node return Node_Id is
- Par : Node_Id;
-
- begin
- -- Climb up the branches of a complex condition
-
- Par := N;
- while Nkind_In (Parent (Par), N_And_Then, N_Op_Not, N_Or_Else) loop
- Par := Parent (Par);
- end loop;
-
- return Par;
- end Find_Insertion_Node;
-
- -- Local variables
-
- Ins_Node : constant Node_Id := Find_Insertion_Node;
- Loc : constant Source_Ptr := Sloc (Decl);
- Obj_Id : constant Entity_Id := Defining_Identifier (Decl);
- Obj_Typ : constant Entity_Id := Etype (Obj_Id);
- Desig_Typ : Entity_Id;
- Expr : Node_Id;
- Ptr_Decl : Node_Id;
- Ptr_Id : Entity_Id;
- Temp_Decl : Node_Id;
- Temp_Id : Node_Id;
-
- -- Start of processing for Process_Transient_Object
-
- begin
- -- Step 1: Create the access type which provides a reference to the
- -- transient object.
-
- if Is_Access_Type (Obj_Typ) then
- Desig_Typ := Directly_Designated_Type (Obj_Typ);
- else
- Desig_Typ := Obj_Typ;
- end if;
-
- -- Generate:
- -- Ann : access [all] <Desig_Typ>;
-
- Ptr_Id := Make_Temporary (Loc, 'A');
-
- Ptr_Decl :=
- Make_Full_Type_Declaration (Loc,
- Defining_Identifier => Ptr_Id,
- Type_Definition =>
- Make_Access_To_Object_Definition (Loc,
- All_Present =>
- Ekind (Obj_Typ) = E_General_Access_Type,
- Subtype_Indication => New_Reference_To (Desig_Typ, Loc)));
-
- Insert_Action (Ins_Node, Ptr_Decl);
- Analyze (Ptr_Decl);
-
- -- Step 2: Create a temporary which acts as a hook to the transient
- -- object. Generate:
-
- -- Temp : Ptr_Id := null;
-
- Temp_Id := Make_Temporary (Loc, 'T');
-
- Temp_Decl :=
- Make_Object_Declaration (Loc,
- Defining_Identifier => Temp_Id,
- Object_Definition => New_Reference_To (Ptr_Id, Loc));
-
- Insert_Action (Ins_Node, Temp_Decl);
- Analyze (Temp_Decl);
-
- -- Mark this temporary as created for the purposes of exporting the
- -- transient declaration out of the Actions list. This signals the
- -- machinery in Build_Finalizer to recognize this special case.
-
- Set_Status_Flag_Or_Transient_Decl (Temp_Id, Decl);
-
- -- Step 3: Hook the transient object to the temporary
-
- if Is_Access_Type (Obj_Typ) then
- Expr := Convert_To (Ptr_Id, New_Reference_To (Obj_Id, Loc));
- else
- Expr :=
- Make_Attribute_Reference (Loc,
- Prefix => New_Reference_To (Obj_Id, Loc),
- Attribute_Name => Name_Unrestricted_Access);
- end if;
-
- -- Generate:
- -- Temp := Ptr_Id (Obj_Id);
- -- <or>
- -- Temp := Obj_Id'Unrestricted_Access;
-
- Insert_After_And_Analyze (Decl,
- Make_Assignment_Statement (Loc,
- Name => New_Reference_To (Temp_Id, Loc),
- Expression => Expr));
- end Process_Transient_Object;
-
- -- Local variables
-
- Decl : Node_Id;
-
- -- Start of processing for Expand_N_Expression_With_Actions
-
- begin
- Decl := First (Actions (N));
- while Present (Decl) loop
- if Nkind (Decl) = N_Object_Declaration
- and then Is_Finalizable_Transient (Decl, N)
- then
- Process_Transient_Object (Decl);
- end if;
-
- Next (Decl);
- end loop;
- end Expand_N_Expression_With_Actions;
+ end Expand_N_If_Expression;
-----------------
-- Expand_N_In --
@@ -7918,7 +7918,7 @@ package body Exp_Ch4 is
((not LOK) or else (Llo = LLB))
then
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd => Duplicate_Subexpr (Right),
@@ -8552,7 +8552,7 @@ package body Exp_Ch4 is
if Lneg and Rneg then
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd => Duplicate_Subexpr (Right),
diff --git a/gcc/ada/exp_ch4.ads b/gcc/ada/exp_ch4.ads
index 2e9c68b..277a755 100644
--- a/gcc/ada/exp_ch4.ads
+++ b/gcc/ada/exp_ch4.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -32,9 +32,9 @@ package Exp_Ch4 is
procedure Expand_N_Allocator (N : Node_Id);
procedure Expand_N_And_Then (N : Node_Id);
procedure Expand_N_Case_Expression (N : Node_Id);
- procedure Expand_N_Conditional_Expression (N : Node_Id);
procedure Expand_N_Explicit_Dereference (N : Node_Id);
procedure Expand_N_Expression_With_Actions (N : Node_Id);
+ procedure Expand_N_If_Expression (N : Node_Id);
procedure Expand_N_In (N : Node_Id);
procedure Expand_N_Indexed_Component (N : Node_Id);
procedure Expand_N_Not_In (N : Node_Id);
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index 02d504a..85b1c52 100644
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -4049,7 +4049,10 @@ package body Exp_Ch6 is
Context := Parent (N);
while Present (Context) loop
- if Nkind (Context) = N_Conditional_Expression then
+ -- The following could use a comment (and why is N_Case_Expression
+ -- not treated in a similar manner ???
+
+ if Nkind (Context) = N_If_Expression then
exit;
-- Stop the search when reaching any statement because we have
@@ -4092,13 +4095,15 @@ package body Exp_Ch6 is
Remove_Side_Effects (N);
- -- The function call is part of a conditional expression alternative.
- -- The temporary result must live as long as the conditional expression
- -- itself, otherwise it will be finalized too early. Mark the transient
- -- as processed to avoid untimely finalization.
+ -- The function call is part of an if expression dependent expression.
+ -- The temporary result must live as long as the if expression itself,
+ -- otherwise it will be finalized too early. Mark the transient as
+ -- processed to avoid untimely finalization.
+
+ -- Why no special handling for case expressions here ???
if Present (Context)
- and then Nkind (Context) = N_Conditional_Expression
+ and then Nkind (Context) = N_If_Expression
and then Nkind (N) = N_Explicit_Dereference
then
Set_Is_Processed_Transient (Entity (Prefix (N)));
diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb
index 72a98d2..78ad5d2 100644
--- a/gcc/ada/exp_ch7.adb
+++ b/gcc/ada/exp_ch7.adb
@@ -1892,8 +1892,8 @@ package body Exp_Ch7 is
then
Processing_Actions (Has_No_Init => True);
- -- Process intermediate results of conditional expression with
- -- one of the alternatives using a controlled function call.
+ -- Process intermediate results of an if expression with one
+ -- of the alternatives using a controlled function call.
elsif Is_Access_Type (Obj_Typ)
and then Present (Status_Flag_Or_Transient_Decl (Obj_Id))
diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
index 248984d..8a7089e 100644
--- a/gcc/ada/exp_ch9.adb
+++ b/gcc/ada/exp_ch9.adb
@@ -10194,7 +10194,7 @@ package body Exp_Ch9 is
if Present (Condition (Alt)) then
Expr :=
- Make_Conditional_Expression (Eloc, New_List (
+ Make_If_Expression (Eloc, New_List (
Condition (Alt),
Entry_Index_Expression (Eloc, Eent, Index, Scope (Eent)),
New_Reference_To (RTE (RE_Null_Task_Entry), Eloc)));
@@ -10582,7 +10582,7 @@ package body Exp_Ch9 is
-- In the above declaration, null-body is True if the corresponding
-- accept has no body, and false otherwise. The entry is either the
-- entry index expression if there is no guard, or if a guard is
- -- present, then a conditional expression of the form:
+ -- present, then an if expression of the form:
-- (if guard then entry-index else Null_Task_Entry)
@@ -10753,7 +10753,7 @@ package body Exp_Ch9 is
-- Simple_Mode; otherwise use Terminate_Mode.
if Present (Condition (Terminate_Alt)) then
- Select_Mode := Make_Conditional_Expression (Loc,
+ Select_Mode := Make_If_Expression (Loc,
New_List (Condition (Terminate_Alt),
New_Reference_To (RTE (RE_Terminate_Mode), Loc),
New_Reference_To (RTE (RE_Simple_Mode), Loc)));
diff --git a/gcc/ada/exp_imgv.adb b/gcc/ada/exp_imgv.adb
index f2e22f76..5da403b 100644
--- a/gcc/ada/exp_imgv.adb
+++ b/gcc/ada/exp_imgv.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -1063,9 +1063,9 @@ package body Exp_Imgv is
-- for depending on the element type for typI.
-- Finally if Discard_Names is in effect for an enumeration type, then
- -- a special conditional expression is built that yields the space needed
- -- for the decimal representation of the largest pos value in the subtype.
- -- See code below for details.
+ -- a special if expression is built that yields the space needed for the
+ -- decimal representation of the largest pos value in the subtype. See
+ -- code below for details.
procedure Expand_Width_Attribute (N : Node_Id; Attr : Atype := Normal) is
Loc : constant Source_Ptr := Sloc (N);
@@ -1134,7 +1134,7 @@ package body Exp_Imgv is
elsif Is_Real_Type (Rtyp) then
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Gt (Loc,
@@ -1214,8 +1214,8 @@ package body Exp_Imgv is
Prefix => New_Occurrence_Of (Ptyp, Loc),
Attribute_Name => Name_Last))))));
- -- OK, now we need to build the conditional expression. First
- -- get the value of M, the largest possible value needed.
+ -- OK, now we need to build the if expression. First get the
+ -- value of M, the largest possible value needed.
P := UI_To_Int
(Enumeration_Pos (Entity (Type_High_Bound (Rtyp))));
@@ -1238,7 +1238,7 @@ package body Exp_Imgv is
K := K - 1;
Cexpr :=
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Lt (Loc,
Left_Opnd => New_Occurrence_Of (Tnn, Loc),
@@ -1252,7 +1252,7 @@ package body Exp_Imgv is
Rewrite (N,
Convert_To (Typ,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd =>
diff --git a/gcc/ada/exp_intr.adb b/gcc/ada/exp_intr.adb
index dcf6b52..bc43a4b 100644
--- a/gcc/ada/exp_intr.adb
+++ b/gcc/ada/exp_intr.adb
@@ -603,7 +603,7 @@ package body Exp_Intr is
-- end if;
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Lt (Loc,
Left_Opnd => Duplicate_Subexpr (Opnd),
@@ -611,7 +611,7 @@ package body Exp_Intr is
New_Occurrence_Of (Standard_True, Loc),
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Gt (Loc,
Left_Opnd => Duplicate_Subexpr_No_Checks (Opnd),
@@ -1311,7 +1311,7 @@ package body Exp_Intr is
Obj := Make_Explicit_Dereference (Loc, Relocate_Node (Arg));
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (
Make_Op_Eq (Loc,
Left_Opnd => New_Copy_Tree (Arg),
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index f7b9d45..cb397a2 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -3293,11 +3293,11 @@ package body Exp_Util is
return;
end if;
- -- Then or Else operand of conditional expression. Add actions to
- -- Then_Actions or Else_Actions field as appropriate. The actions
- -- will be moved further out when the conditional is expanded.
+ -- Then or Else dependent expression of an if expression. Add
+ -- actions to Then_Actions or Else_Actions field as appropriate.
+ -- The actions will be moved further out when the if is expanded.
- when N_Conditional_Expression =>
+ when N_If_Expression =>
declare
ThenX : constant Node_Id := Next (First (Expressions (P)));
ElseX : constant Node_Id := Next (ThenX);
@@ -3311,9 +3311,9 @@ package body Exp_Util is
null;
-- Actions belong to the then expression, temporarily place
- -- them as Then_Actions of the conditional expr. They will
- -- be moved to the proper place later when the conditional
- -- expression is expanded.
+ -- them as Then_Actions of the if expression. They will be
+ -- moved to the proper place later when the if expression
+ -- is expanded.
elsif N = ThenX then
if Present (Then_Actions (P)) then
@@ -3326,10 +3326,10 @@ package body Exp_Util is
return;
- -- Actions belong to the else expression, temporarily
- -- place them as Else_Actions of the conditional expr.
- -- They will be moved to the proper place later when
- -- the conditional expression is expanded.
+ -- Actions belong to the else expression, temporarily place
+ -- them as Else_Actions of the if expression. They will be
+ -- moved to the proper place later when the if expression
+ -- is expanded.
elsif N = ElseX then
if Present (Else_Actions (P)) then
@@ -7187,8 +7187,8 @@ package body Exp_Util is
then
return True;
- -- Processing for intermediate results of conditional expressions
- -- where one of the alternatives uses a controlled function call.
+ -- Processing for intermediate results of if expressions where
+ -- one of the alternatives uses a controlled function call.
elsif Is_Access_Type (Obj_Typ)
and then Present (Status_Flag_Or_Transient_Decl (Obj_Id))
diff --git a/gcc/ada/exp_util.ads b/gcc/ada/exp_util.ads
index e25d48e..f89a0ac 100644
--- a/gcc/ada/exp_util.ads
+++ b/gcc/ada/exp_util.ads
@@ -72,8 +72,8 @@ package Exp_Util is
-- For actions appearing in the then or else expression of a conditional
-- expression, these actions are similarly placed in the node, using the
-- Then_Actions or Else_Actions field as appropriate. Once again the
- -- expansion of the N_Conditional_Expression node rewrites the node so
- -- that the actions can be normally positioned.
+ -- expansion of the N_If_Expression node rewrites the node so that the
+ -- actions can be positioned normally.
-- Basically what we do is to climb up to the tree looking for the
-- proper insertion point, as described by one of the above cases,
diff --git a/gcc/ada/expander.adb b/gcc/ada/expander.adb
index 8dcc19d..af367d9 100644
--- a/gcc/ada/expander.adb
+++ b/gcc/ada/expander.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -182,9 +182,6 @@ package body Expander is
when N_Conditional_Entry_Call =>
Expand_N_Conditional_Entry_Call (N);
- when N_Conditional_Expression =>
- Expand_N_Conditional_Expression (N);
-
when N_Delay_Relative_Statement =>
Expand_N_Delay_Relative_Statement (N);
@@ -248,6 +245,9 @@ package body Expander is
when N_Identifier =>
Expand_N_Identifier (N);
+ when N_If_Expression =>
+ Expand_N_If_Expression (N);
+
when N_Indexed_Component =>
Expand_N_Indexed_Component (N);
diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in
index e8a5fa5..27c9823 100644
--- a/gcc/ada/gcc-interface/Make-lang.in
+++ b/gcc/ada/gcc-interface/Make-lang.in
@@ -1257,29 +1257,33 @@ ada/checks.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/csets.ads ada/debug.ads ada/einfo.ads ada/einfo.adb ada/elists.ads \
ada/elists.adb ada/err_vars.ads ada/errout.ads ada/erroutc.ads \
ada/eval_fat.ads ada/exp_aggr.ads ada/exp_ch11.ads ada/exp_ch2.ads \
- ada/exp_ch4.ads ada/exp_ch6.ads ada/exp_ch7.ads ada/exp_dist.ads \
- ada/exp_pakd.ads ada/exp_tss.ads ada/exp_util.ads ada/exp_util.adb \
- ada/fname.ads ada/fname-uf.ads ada/freeze.ads ada/get_targ.ads \
- ada/gnat.ads ada/g-hesorg.ads ada/g-htable.ads ada/gnatvsn.ads \
- ada/hostparm.ads ada/inline.ads ada/itypes.ads ada/lib.ads ada/lib.adb \
- ada/lib-list.adb ada/lib-load.ads ada/lib-sort.adb ada/namet.ads \
+ ada/exp_ch4.ads ada/exp_ch6.ads ada/exp_ch7.ads ada/exp_disp.ads \
+ ada/exp_dist.ads ada/exp_pakd.ads ada/exp_tss.ads ada/exp_util.ads \
+ ada/exp_util.adb ada/fname.ads ada/fname-uf.ads ada/freeze.ads \
+ ada/get_targ.ads ada/gnat.ads ada/g-hesorg.ads ada/g-htable.ads \
+ ada/gnatvsn.ads ada/hostparm.ads ada/inline.ads ada/itypes.ads \
+ ada/lib.ads ada/lib.adb ada/lib-list.adb ada/lib-load.ads \
+ ada/lib-sort.adb ada/lib-util.ads ada/lib-xref.ads ada/namet.ads \
ada/nlists.ads ada/nlists.adb ada/nmake.ads ada/nmake.adb ada/opt.ads \
- ada/opt.adb ada/output.ads ada/restrict.ads ada/restrict.adb \
- ada/rident.ads ada/rtsfind.ads ada/rtsfind.adb ada/sem.ads \
- ada/sem_aux.ads ada/sem_cat.ads ada/sem_ch3.ads ada/sem_ch6.ads \
- ada/sem_ch7.ads ada/sem_ch8.ads ada/sem_dist.ads ada/sem_eval.ads \
+ ada/opt.adb ada/output.ads ada/put_alfa.ads ada/restrict.ads \
+ ada/restrict.adb ada/rident.ads ada/rtsfind.ads ada/rtsfind.adb \
+ ada/scans.ads ada/sem.ads ada/sem_attr.ads ada/sem_aux.ads \
+ ada/sem_cat.ads ada/sem_ch3.ads ada/sem_ch6.ads ada/sem_ch7.ads \
+ ada/sem_ch8.ads ada/sem_disp.ads ada/sem_dist.ads ada/sem_eval.ads \
ada/sem_eval.adb ada/sem_prag.ads ada/sem_res.ads ada/sem_type.ads \
- ada/sem_util.ads ada/sem_warn.ads ada/sinfo.ads ada/sinfo.adb \
- ada/sinput.ads ada/snames.ads ada/sprint.ads ada/stand.ads \
- ada/stringt.ads ada/system.ads ada/s-exctab.ads ada/s-htable.ads \
- ada/s-imenne.ads ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads \
- ada/s-rident.ads ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads \
- ada/s-stalib.ads ada/s-stoele.ads ada/s-stoele.adb ada/s-string.ads \
- ada/s-traent.ads ada/s-unstyp.ads ada/s-wchcon.ads ada/table.ads \
- ada/table.adb ada/targparm.ads ada/tbuild.ads ada/tbuild.adb \
- ada/tree_io.ads ada/ttypes.ads ada/types.ads ada/uintp.ads \
- ada/uintp.adb ada/uname.ads ada/unchconv.ads ada/unchdeal.ads \
- ada/urealp.ads ada/urealp.adb ada/validsw.ads ada/widechar.ads
+ ada/sem_util.ads ada/sem_util.adb ada/sem_warn.ads ada/sinfo.ads \
+ ada/sinfo.adb ada/sinput.ads ada/snames.ads ada/sprint.ads \
+ ada/stand.ads ada/stringt.ads ada/style.ads ada/styleg.ads \
+ ada/styleg.adb ada/stylesw.ads ada/system.ads ada/s-exctab.ads \
+ ada/s-htable.ads ada/s-imenne.ads ada/s-memory.ads ada/s-os_lib.ads \
+ ada/s-parame.ads ada/s-rident.ads ada/s-secsta.ads ada/s-soflin.ads \
+ ada/s-stache.ads ada/s-stalib.ads ada/s-stoele.ads ada/s-stoele.adb \
+ ada/s-string.ads ada/s-traent.ads ada/s-unstyp.ads ada/s-wchcon.ads \
+ ada/table.ads ada/table.adb ada/targparm.ads ada/tbuild.ads \
+ ada/tbuild.adb ada/tree_io.ads ada/ttypes.ads ada/types.ads \
+ ada/uintp.ads ada/uintp.adb ada/uname.ads ada/unchconv.ads \
+ ada/unchdeal.ads ada/urealp.ads ada/urealp.adb ada/validsw.ads \
+ ada/widechar.ads
ada/comperr.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/a-uncdea.ads ada/alloc.ads ada/aspects.ads ada/atree.ads \
@@ -2486,22 +2490,23 @@ ada/lib-load.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/atree.adb ada/casing.ads ada/csets.ads ada/debug.ads ada/einfo.ads \
ada/einfo.adb ada/elists.ads ada/err_vars.ads ada/errout.ads \
ada/erroutc.ads ada/fname.ads ada/fname-uf.ads ada/gnat.ads \
- ada/g-hesorg.ads ada/hostparm.ads ada/interfac.ads ada/lib.ads \
- ada/lib.adb ada/lib-list.adb ada/lib-load.ads ada/lib-load.adb \
- ada/lib-sort.adb ada/namet.ads ada/nlists.ads ada/nmake.ads \
- ada/nmake.adb ada/opt.ads ada/osint.ads ada/osint-c.ads ada/output.ads \
- ada/par.ads ada/restrict.ads ada/rident.ads ada/scans.ads ada/scn.ads \
- ada/scng.ads ada/scng.adb ada/sem_aux.ads ada/sinfo.ads ada/sinfo.adb \
- ada/sinput.ads ada/sinput-l.ads ada/snames.ads ada/stand.ads \
- ada/stringt.ads ada/style.ads ada/styleg.ads ada/styleg.adb \
- ada/stylesw.ads ada/system.ads ada/s-crc32.ads ada/s-exctab.ads \
- ada/s-imenne.ads ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads \
- ada/s-rident.ads ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads \
- ada/s-stalib.ads ada/s-stoele.ads ada/s-stoele.adb ada/s-string.ads \
- ada/s-traent.ads ada/s-unstyp.ads ada/s-utf_32.ads ada/s-wchcon.ads \
- ada/table.ads ada/table.adb ada/tbuild.ads ada/tbuild.adb \
- ada/tree_io.ads ada/types.ads ada/uintp.ads ada/uname.ads \
- ada/unchconv.ads ada/unchdeal.ads ada/urealp.ads ada/widechar.ads
+ ada/g-byorma.ads ada/g-hesorg.ads ada/hostparm.ads ada/interfac.ads \
+ ada/lib.ads ada/lib.adb ada/lib-list.adb ada/lib-load.ads \
+ ada/lib-load.adb ada/lib-sort.adb ada/namet.ads ada/nlists.ads \
+ ada/nmake.ads ada/nmake.adb ada/opt.ads ada/osint.ads ada/osint-c.ads \
+ ada/output.ads ada/par.ads ada/restrict.ads ada/rident.ads \
+ ada/scans.ads ada/scn.ads ada/scng.ads ada/scng.adb ada/sem_aux.ads \
+ ada/sinfo.ads ada/sinfo.adb ada/sinput.ads ada/sinput.adb \
+ ada/sinput-l.ads ada/snames.ads ada/stand.ads ada/stringt.ads \
+ ada/style.ads ada/styleg.ads ada/styleg.adb ada/stylesw.ads \
+ ada/system.ads ada/s-crc32.ads ada/s-exctab.ads ada/s-imenne.ads \
+ ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads ada/s-rident.ads \
+ ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads ada/s-stalib.ads \
+ ada/s-stoele.ads ada/s-stoele.adb ada/s-string.ads ada/s-traent.ads \
+ ada/s-unstyp.ads ada/s-utf_32.ads ada/s-wchcon.ads ada/table.ads \
+ ada/table.adb ada/tbuild.ads ada/tbuild.adb ada/tree_io.ads \
+ ada/types.ads ada/uintp.ads ada/uname.ads ada/unchconv.ads \
+ ada/unchdeal.ads ada/urealp.ads ada/widechar.ads
ada/lib-util.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/a-uncdea.ads ada/alloc.ads ada/debug.ads ada/hostparm.ads \
@@ -3116,21 +3121,21 @@ ada/sem_aggr.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/put_alfa.ads ada/restrict.ads ada/rident.ads ada/rtsfind.ads \
ada/scans.ads ada/sem.ads ada/sem_aggr.ads ada/sem_aggr.adb \
ada/sem_attr.ads ada/sem_aux.ads ada/sem_cat.ads ada/sem_ch13.ads \
- ada/sem_ch3.ads ada/sem_ch6.ads ada/sem_ch8.ads ada/sem_disp.ads \
- ada/sem_eval.ads ada/sem_eval.adb ada/sem_prag.ads ada/sem_res.ads \
- ada/sem_type.ads ada/sem_util.ads ada/sem_util.adb ada/sem_warn.ads \
- ada/sinfo.ads ada/sinfo.adb ada/sinput.ads ada/snames.ads \
- ada/sprint.ads ada/stand.ads ada/stringt.ads ada/stringt.adb \
- ada/style.ads ada/styleg.ads ada/styleg.adb ada/stylesw.ads \
- ada/system.ads ada/s-exctab.ads ada/s-htable.ads ada/s-imenne.ads \
- ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads ada/s-rident.ads \
- ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads ada/s-stalib.ads \
- ada/s-stoele.ads ada/s-stoele.adb ada/s-string.ads ada/s-traent.ads \
- ada/s-unstyp.ads ada/s-wchcon.ads ada/table.ads ada/table.adb \
- ada/targparm.ads ada/tbuild.ads ada/tbuild.adb ada/tree_io.ads \
- ada/ttypes.ads ada/types.ads ada/uintp.ads ada/uintp.adb ada/uname.ads \
- ada/unchconv.ads ada/unchdeal.ads ada/urealp.ads ada/validsw.ads \
- ada/widechar.ads
+ ada/sem_ch3.ads ada/sem_ch6.ads ada/sem_ch8.ads ada/sem_dim.ads \
+ ada/sem_disp.ads ada/sem_eval.ads ada/sem_eval.adb ada/sem_prag.ads \
+ ada/sem_res.ads ada/sem_type.ads ada/sem_util.ads ada/sem_util.adb \
+ ada/sem_warn.ads ada/sinfo.ads ada/sinfo.adb ada/sinput.ads \
+ ada/snames.ads ada/sprint.ads ada/stand.ads ada/stringt.ads \
+ ada/stringt.adb ada/style.ads ada/styleg.ads ada/styleg.adb \
+ ada/stylesw.ads ada/system.ads ada/s-exctab.ads ada/s-htable.ads \
+ ada/s-imenne.ads ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads \
+ ada/s-rident.ads ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads \
+ ada/s-stalib.ads ada/s-stoele.ads ada/s-stoele.adb ada/s-string.ads \
+ ada/s-traent.ads ada/s-unstyp.ads ada/s-wchcon.ads ada/table.ads \
+ ada/table.adb ada/targparm.ads ada/tbuild.ads ada/tbuild.adb \
+ ada/tree_io.ads ada/ttypes.ads ada/types.ads ada/uintp.ads \
+ ada/uintp.adb ada/uname.ads ada/unchconv.ads ada/unchdeal.ads \
+ ada/urealp.ads ada/validsw.ads ada/widechar.ads
ada/sem_attr.o : ada/ada.ads ada/a-charac.ads ada/a-chlat1.ads \
ada/a-except.ads ada/a-unccon.ads ada/a-uncdea.ads ada/alloc.ads \
@@ -3611,26 +3616,32 @@ ada/sem_ch9.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/sem_dim.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/a-uncdea.ads ada/alloc.ads ada/aspects.ads ada/atree.ads \
- ada/atree.adb ada/casing.ads ada/csets.ads ada/debug.ads ada/einfo.ads \
- ada/einfo.adb ada/elists.ads ada/err_vars.ads ada/errout.ads \
- ada/erroutc.ads ada/exp_dist.ads ada/exp_tss.ads ada/fname.ads \
- ada/fname-uf.ads ada/gnat.ads ada/g-hesorg.ads ada/g-htable.ads \
- ada/hostparm.ads ada/lib.ads ada/lib.adb ada/lib-list.adb \
- ada/lib-load.ads ada/lib-sort.adb ada/namet.ads ada/nlists.ads \
- ada/nlists.adb ada/nmake.ads ada/nmake.adb ada/opt.ads ada/output.ads \
- ada/restrict.ads ada/rident.ads ada/rtsfind.ads ada/rtsfind.adb \
- ada/sem.ads ada/sem_aux.ads ada/sem_ch7.ads ada/sem_dim.ads \
- ada/sem_dim.adb ada/sem_dist.ads ada/sem_eval.ads ada/sem_res.ads \
- ada/sem_util.ads ada/sinfo.ads ada/sinfo.adb ada/sinput.ads \
- ada/snames.ads ada/stand.ads ada/stringt.ads ada/stringt.adb \
- ada/system.ads ada/s-exctab.ads ada/s-htable.ads ada/s-htable.adb \
- ada/s-imenne.ads ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads \
- ada/s-rident.ads ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads \
- ada/s-stalib.ads ada/s-stoele.ads ada/s-stoele.adb ada/s-strhas.ads \
- ada/s-string.ads ada/s-traent.ads ada/s-unstyp.ads ada/s-wchcon.ads \
- ada/table.ads ada/table.adb ada/tbuild.ads ada/tbuild.adb \
- ada/tree_io.ads ada/types.ads ada/uintp.ads ada/uname.ads \
- ada/unchconv.ads ada/unchdeal.ads ada/urealp.ads ada/widechar.ads
+ ada/atree.adb ada/casing.ads ada/checks.ads ada/csets.ads ada/debug.ads \
+ ada/einfo.ads ada/einfo.adb ada/elists.ads ada/err_vars.ads \
+ ada/errout.ads ada/erroutc.ads ada/exp_ch11.ads ada/exp_disp.ads \
+ ada/exp_dist.ads ada/exp_tss.ads ada/exp_util.ads ada/fname.ads \
+ ada/fname-uf.ads ada/freeze.ads ada/get_targ.ads ada/gnat.ads \
+ ada/g-byorma.ads ada/g-hesorg.ads ada/g-htable.ads ada/hostparm.ads \
+ ada/lib.ads ada/lib.adb ada/lib-list.adb ada/lib-load.ads \
+ ada/lib-sort.adb ada/lib-util.ads ada/lib-xref.ads ada/namet.ads \
+ ada/nlists.ads ada/nlists.adb ada/nmake.ads ada/nmake.adb ada/opt.ads \
+ ada/output.ads ada/put_alfa.ads ada/restrict.ads ada/rident.ads \
+ ada/rtsfind.ads ada/rtsfind.adb ada/scans.ads ada/sem.ads \
+ ada/sem_attr.ads ada/sem_aux.ads ada/sem_ch7.ads ada/sem_ch8.ads \
+ ada/sem_dim.ads ada/sem_dim.adb ada/sem_disp.ads ada/sem_dist.ads \
+ ada/sem_eval.ads ada/sem_res.ads ada/sem_type.ads ada/sem_util.ads \
+ ada/sem_util.adb ada/sinfo.ads ada/sinfo.adb ada/sinput.ads \
+ ada/sinput.adb ada/snames.ads ada/stand.ads ada/stringt.ads \
+ ada/stringt.adb ada/style.ads ada/styleg.ads ada/styleg.adb \
+ ada/stylesw.ads ada/system.ads ada/s-exctab.ads ada/s-htable.ads \
+ ada/s-htable.adb ada/s-imenne.ads ada/s-memory.ads ada/s-os_lib.ads \
+ ada/s-parame.ads ada/s-rident.ads ada/s-secsta.ads ada/s-soflin.ads \
+ ada/s-stache.ads ada/s-stalib.ads ada/s-stoele.ads ada/s-stoele.adb \
+ ada/s-strhas.ads ada/s-string.ads ada/s-traent.ads ada/s-unstyp.ads \
+ ada/s-wchcon.ads ada/table.ads ada/table.adb ada/targparm.ads \
+ ada/tbuild.ads ada/tbuild.adb ada/tree_io.ads ada/ttypes.ads \
+ ada/types.ads ada/uintp.ads ada/uname.ads ada/unchconv.ads \
+ ada/unchdeal.ads ada/urealp.ads ada/widechar.ads
ada/sem_disp.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/a-uncdea.ads ada/alloc.ads ada/aspects.ads ada/atree.ads \
@@ -3685,27 +3696,26 @@ ada/sem_elab.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/err_vars.ads ada/errout.ads ada/erroutc.ads ada/exp_ch11.ads \
ada/exp_disp.ads ada/exp_tss.ads ada/exp_util.ads ada/expander.ads \
ada/fname.ads ada/fname-uf.ads ada/freeze.ads ada/get_targ.ads \
- ada/gnat.ads ada/g-byorma.ads ada/g-hesorg.ads ada/g-htable.ads \
- ada/hostparm.ads ada/lib.ads ada/lib.adb ada/lib-list.adb \
- ada/lib-load.ads ada/lib-sort.adb ada/lib-util.ads ada/lib-xref.ads \
- ada/namet.ads ada/nlists.ads ada/nlists.adb ada/nmake.ads ada/nmake.adb \
- ada/opt.ads ada/output.ads ada/put_alfa.ads ada/restrict.ads \
- ada/restrict.adb ada/rident.ads ada/rtsfind.ads ada/scans.ads \
- ada/sem.ads ada/sem_attr.ads ada/sem_aux.ads ada/sem_cat.ads \
- ada/sem_ch7.ads ada/sem_ch8.ads ada/sem_disp.ads ada/sem_elab.ads \
- ada/sem_elab.adb ada/sem_eval.ads ada/sem_res.ads ada/sem_type.ads \
- ada/sem_util.ads ada/sem_util.adb ada/sinfo.ads ada/sinfo.adb \
- ada/sinput.ads ada/sinput.adb ada/snames.ads ada/stand.ads \
- ada/stringt.ads ada/style.ads ada/styleg.ads ada/styleg.adb \
- ada/stylesw.ads ada/system.ads ada/s-exctab.ads ada/s-htable.ads \
- ada/s-imenne.ads ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads \
- ada/s-rident.ads ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads \
- ada/s-stalib.ads ada/s-stoele.ads ada/s-stoele.adb ada/s-string.ads \
- ada/s-traent.ads ada/s-unstyp.ads ada/s-wchcon.ads ada/table.ads \
- ada/table.adb ada/targparm.ads ada/tbuild.ads ada/tbuild.adb \
- ada/tree_io.ads ada/ttypes.ads ada/types.ads ada/uintp.ads \
- ada/uname.ads ada/unchconv.ads ada/unchdeal.ads ada/urealp.ads \
- ada/widechar.ads
+ ada/gnat.ads ada/g-hesorg.ads ada/g-htable.ads ada/hostparm.ads \
+ ada/lib.ads ada/lib.adb ada/lib-list.adb ada/lib-load.ads \
+ ada/lib-sort.adb ada/lib-util.ads ada/lib-xref.ads ada/namet.ads \
+ ada/nlists.ads ada/nlists.adb ada/nmake.ads ada/nmake.adb ada/opt.ads \
+ ada/output.ads ada/put_alfa.ads ada/restrict.ads ada/restrict.adb \
+ ada/rident.ads ada/rtsfind.ads ada/scans.ads ada/sem.ads \
+ ada/sem_attr.ads ada/sem_aux.ads ada/sem_cat.ads ada/sem_ch7.ads \
+ ada/sem_ch8.ads ada/sem_disp.ads ada/sem_elab.ads ada/sem_elab.adb \
+ ada/sem_eval.ads ada/sem_res.ads ada/sem_type.ads ada/sem_util.ads \
+ ada/sem_util.adb ada/sinfo.ads ada/sinfo.adb ada/sinput.ads \
+ ada/snames.ads ada/stand.ads ada/stringt.ads ada/style.ads \
+ ada/styleg.ads ada/styleg.adb ada/stylesw.ads ada/system.ads \
+ ada/s-exctab.ads ada/s-htable.ads ada/s-imenne.ads ada/s-memory.ads \
+ ada/s-os_lib.ads ada/s-parame.ads ada/s-rident.ads ada/s-secsta.ads \
+ ada/s-soflin.ads ada/s-stache.ads ada/s-stalib.ads ada/s-stoele.ads \
+ ada/s-stoele.adb ada/s-string.ads ada/s-traent.ads ada/s-unstyp.ads \
+ ada/s-wchcon.ads ada/table.ads ada/table.adb ada/targparm.ads \
+ ada/tbuild.ads ada/tbuild.adb ada/tree_io.ads ada/ttypes.ads \
+ ada/types.ads ada/uintp.ads ada/uname.ads ada/unchconv.ads \
+ ada/unchdeal.ads ada/urealp.ads ada/widechar.ads
ada/sem_elim.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/a-uncdea.ads ada/alloc.ads ada/aspects.ads ada/atree.ads \
@@ -4054,22 +4064,23 @@ ada/sinput-d.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/sinput-l.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/a-uncdea.ads ada/alloc.ads ada/aspects.ads ada/atree.ads \
ada/atree.adb ada/casing.ads ada/csets.ads ada/debug.ads ada/einfo.ads \
- ada/err_vars.ads ada/errout.ads ada/erroutc.ads ada/fname.ads \
- ada/gnat.ads ada/g-byorma.ads ada/g-dyntab.ads ada/g-dyntab.adb \
- ada/g-hesorg.ads ada/hostparm.ads ada/interfac.ads ada/lib.ads \
- ada/namet.ads ada/nlists.ads ada/opt.ads ada/osint.ads ada/output.ads \
- ada/prep.ads ada/prepcomp.ads ada/restrict.ads ada/rident.ads \
- ada/scans.ads ada/scn.ads ada/scng.ads ada/scng.adb ada/sinfo.ads \
+ ada/einfo.adb ada/err_vars.ads ada/errout.ads ada/erroutc.ads \
+ ada/exp_tss.ads ada/fname.ads ada/gnat.ads ada/g-byorma.ads \
+ ada/g-dyntab.ads ada/g-dyntab.adb ada/g-hesorg.ads ada/hostparm.ads \
+ ada/interfac.ads ada/lib.ads ada/namet.ads ada/nlists.ads ada/nmake.ads \
+ ada/opt.ads ada/osint.ads ada/output.ads ada/prep.ads ada/prepcomp.ads \
+ ada/restrict.ads ada/rident.ads ada/scans.ads ada/scn.ads ada/scng.ads \
+ ada/scng.adb ada/sem_aux.ads ada/sem_util.ads ada/sinfo.ads \
ada/sinfo.adb ada/sinput.ads ada/sinput.adb ada/sinput-l.ads \
- ada/sinput-l.adb ada/snames.ads ada/stringt.ads ada/style.ads \
- ada/styleg.ads ada/styleg.adb ada/stylesw.ads ada/system.ads \
- ada/s-crc32.ads ada/s-exctab.ads ada/s-imenne.ads ada/s-memory.ads \
- ada/s-os_lib.ads ada/s-parame.ads ada/s-rident.ads ada/s-secsta.ads \
- ada/s-soflin.ads ada/s-stache.ads ada/s-stalib.ads ada/s-stoele.ads \
- ada/s-stoele.adb ada/s-string.ads ada/s-traent.ads ada/s-unstyp.ads \
- ada/s-utf_32.ads ada/s-wchcon.ads ada/table.ads ada/table.adb \
- ada/tree_io.ads ada/types.ads ada/uintp.ads ada/unchconv.ads \
- ada/unchdeal.ads ada/urealp.ads ada/widechar.ads ada/nmake.ads
+ ada/sinput-l.adb ada/snames.ads ada/stand.ads ada/stringt.ads \
+ ada/style.ads ada/styleg.ads ada/styleg.adb ada/stylesw.ads \
+ ada/system.ads ada/s-crc32.ads ada/s-exctab.ads ada/s-imenne.ads \
+ ada/s-memory.ads ada/s-os_lib.ads ada/s-parame.ads ada/s-rident.ads \
+ ada/s-secsta.ads ada/s-soflin.ads ada/s-stache.ads ada/s-stalib.ads \
+ ada/s-stoele.ads ada/s-stoele.adb ada/s-string.ads ada/s-traent.ads \
+ ada/s-unstyp.ads ada/s-utf_32.ads ada/s-wchcon.ads ada/table.ads \
+ ada/table.adb ada/tree_io.ads ada/types.ads ada/uintp.ads \
+ ada/unchconv.ads ada/unchdeal.ads ada/urealp.ads ada/widechar.ads
ada/sinput.o : ada/ada.ads ada/a-except.ads ada/a-unccon.ads \
ada/a-uncdea.ads ada/alloc.ads ada/aspects.ads ada/atree.ads \
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 80ee1f8..c3e833e 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -5977,7 +5977,7 @@ gnat_to_gnu (Node_Id gnat_node)
}
break;
- case N_Conditional_Expression:
+ case N_If_Expression:
{
tree gnu_cond = gnat_to_gnu (First (Expressions (gnat_node)));
tree gnu_true = gnat_to_gnu (Next (First (Expressions (gnat_node))));
diff --git a/gcc/ada/gnat1drv.adb b/gcc/ada/gnat1drv.adb
index 3d99884..d6b1883 100644
--- a/gcc/ada/gnat1drv.adb
+++ b/gcc/ada/gnat1drv.adb
@@ -381,7 +381,7 @@ procedure Gnat1drv is
-- Set switch indicating if back end can handle limited types, and
-- guarantee that no incorrect copies are made (e.g. in the context
- -- of a conditional expression).
+ -- of an if or case expression).
-- Debug flag -gnatd.L decisively sets usage on
diff --git a/gcc/ada/layout.adb b/gcc/ada/layout.adb
index 46f5090..1f44196 100644
--- a/gcc/ada/layout.adb
+++ b/gcc/ada/layout.adb
@@ -1964,11 +1964,11 @@ package body Layout is
pragma Warnings (Off, SO_Ref);
RM_Siz_Expr : Node_Id := Empty;
- -- Expression for the evolving RM_Siz value. This is typically a
- -- conditional expression which involves tests of discriminant values
- -- that are formed as references to the entity V. At the end of
- -- scanning all the components, a suitable function is constructed
- -- in which V is the parameter.
+ -- Expression for the evolving RM_Siz value. This is typically an if
+ -- expression which involves tests of discriminant values that are
+ -- formed as references to the entity V. At the end of scanning all
+ -- the components, a suitable function is constructed in which V is
+ -- the parameter.
-----------------------
-- Local Subprograms --
@@ -2212,7 +2212,7 @@ package body Layout is
end if;
RM_Siz_Expr :=
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions =>
New_List
(Dtest, Bits_To_SU (RM_SizV), RM_Siz_Expr));
diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads
index c90c5eca..184b097 100644
--- a/gcc/ada/opt.ads
+++ b/gcc/ada/opt.ads
@@ -230,11 +230,12 @@ package Opt is
Back_End_Handles_Limited_Types : Boolean;
-- This flag is set true if the back end can properly handle limited or
-- other by reference types, and avoid copies. If this flag is False, then
- -- the front end does special expansion for conditional expressions to make
+ -- the front end does special expansion for if/case expressions to make
-- sure that no copy occurs. If the flag is True, then the expansion for
- -- conditional expressions relies on the back end properly handling things.
+ -- if and case expressions relies on the back end properly handling things.
-- Currently the default is False for all cases (set in gnat1drv). The
- -- default can be modified using -gnatd.L (sets the flag True).
+ -- default can be modified using -gnatd.L (sets the flag True). This is
+ -- used to test the possibility of having the backend handle this.
Bind_Alternate_Main_Name : Boolean := False;
-- GNATBIND
diff --git a/gcc/ada/par-ch4.adb b/gcc/ada/par-ch4.adb
index 5116c69..df13d00 100644
--- a/gcc/ada/par-ch4.adb
+++ b/gcc/ada/par-ch4.adb
@@ -553,7 +553,7 @@ package body Ch4 is
-- case of a name which can be extended in the normal manner.
-- This case is handled by LP_State_Name or LP_State_Expr.
- -- Note: conditional expressions (without an extra level of
+ -- Note: if and case expressions (without an extra level of
-- parentheses) are permitted in this context).
-- (..., identifier => expression , ...)
@@ -1233,21 +1233,21 @@ package body Ch4 is
Lparen_Sloc := Token_Ptr;
T_Left_Paren;
- -- Conditional expression case
+ -- If expression
if Token = Tok_If then
- Expr_Node := P_Conditional_Expression;
+ Expr_Node := P_If_Expression;
T_Right_Paren;
return Expr_Node;
- -- Case expression case
+ -- Case expression
elsif Token = Tok_Case then
Expr_Node := P_Case_Expression;
T_Right_Paren;
return Expr_Node;
- -- Quantified expression case
+ -- Quantified expression
elsif Token = Tok_For then
Expr_Node := P_Quantified_Expression;
@@ -1258,12 +1258,12 @@ package body Ch4 is
-- is distinctly unpleasant, but it saves a lot of fiddling in scanning
-- out the discrete choice list.
- -- Deal with expression and extension aggregate cases first
+ -- Deal with expression and extension aggregates first
elsif Token /= Tok_Others then
Save_Scan_State (Scan_State); -- at start of expression
- -- Deal with (NULL RECORD) case
+ -- Deal with (NULL RECORD)
if Token = Tok_Null then
Scan; -- past NULL
@@ -1287,7 +1287,7 @@ package body Ch4 is
Expr_Node := P_Expression_Or_Range_Attribute_If_OK;
end if;
- -- Extension aggregate case
+ -- Extension aggregate
if Token = Tok_With then
if Nkind (Expr_Node) = N_Attribute_Reference
@@ -1329,7 +1329,7 @@ package body Ch4 is
Expr_Node := Empty;
end if;
- -- Expression case
+ -- Expression
elsif Token = Tok_Right_Paren or else Token in Token_Class_Eterm then
if Nkind (Expr_Node) = N_Attribute_Reference
@@ -1350,13 +1350,13 @@ package body Ch4 is
T_Right_Paren; -- past right paren (error message if none)
return Expr_Node;
- -- Normal aggregate case
+ -- Normal aggregate
else
Aggregate_Node := New_Node (N_Aggregate, Lparen_Sloc);
end if;
- -- Others case
+ -- Others
else
Aggregate_Node := New_Node (N_Aggregate, Lparen_Sloc);
@@ -2454,7 +2454,7 @@ package body Ch4 is
when Tok_Pragma =>
P_Pragmas_Misplaced;
- -- Deal with IF (possible unparenthesized conditional expression)
+ -- Deal with IF (possible unparenthesized if expression)
when Tok_If =>
@@ -2462,7 +2462,7 @@ package body Ch4 is
-- the start of a new line, then we consider we have a missing
-- operand. If in Ada 2012 and the IF is not properly indented
-- for a statement, we prefer to issue a message about an ill-
- -- parenthesized conditional expression.
+ -- parenthesized if expression.
if Token_Is_At_Start_Of_Line
and then not
@@ -2473,13 +2473,12 @@ package body Ch4 is
Error_Msg_AP ("missing operand");
return Error;
- -- If this looks like a conditional expression, then treat it
- -- that way with an error message.
+ -- If this looks like an if expression, then treat it that way
+ -- with an error message.
elsif Ada_Version >= Ada_2012 then
- Error_Msg_SC
- ("conditional expression must be parenthesized");
- return P_Conditional_Expression;
+ Error_Msg_SC ("if expression must be parenthesized");
+ return P_If_Expression;
-- Otherwise treat as misused identifier
@@ -2974,21 +2973,21 @@ package body Ch4 is
return Case_Alt_Node;
end P_Case_Expression_Alternative;
- ------------------------------
- -- P_Conditional_Expression --
- ------------------------------
+ ---------------------
+ -- P_If_Expression --
+ ---------------------
- function P_Conditional_Expression return Node_Id is
+ function P_If_Expression return Node_Id is
Exprs : constant List_Id := New_List;
Loc : constant Source_Ptr := Token_Ptr;
Expr : Node_Id;
State : Saved_Scan_State;
begin
- Inside_Conditional_Expression := Inside_Conditional_Expression + 1;
+ Inside_If_Expression := Inside_If_Expression + 1;
if Token = Tok_If and then Ada_Version < Ada_2012 then
- Error_Msg_SC ("|conditional expression is an Ada 2012 feature");
+ Error_Msg_SC ("|if expression is an Ada 2012 feature");
Error_Msg_SC ("\|unit must be compiled with -gnat2012 switch");
end if;
@@ -3017,7 +3016,7 @@ package body Ch4 is
-- Scan out ELSIF sequence if present
if Token = Tok_Elsif then
- Expr := P_Conditional_Expression;
+ Expr := P_If_Expression;
Set_Is_Elsif (Expr);
Append_To (Exprs, Expr);
@@ -3039,8 +3038,7 @@ package body Ch4 is
-- If we have an END IF, diagnose as not needed
if Token = Tok_End then
- Error_Msg_SC
- ("`END IF` not allowed at end of conditional expression");
+ Error_Msg_SC ("`END IF` not allowed at end of if expression");
Scan; -- past END
if Token = Tok_If then
@@ -3048,14 +3046,14 @@ package body Ch4 is
end if;
end if;
- Inside_Conditional_Expression := Inside_Conditional_Expression - 1;
+ Inside_If_Expression := Inside_If_Expression - 1;
- -- Return the Conditional_Expression node
+ -- Return the If_Expression node
return
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => Exprs);
- end P_Conditional_Expression;
+ end P_If_Expression;
-----------------------
-- P_Membership_Test --
@@ -3113,18 +3111,16 @@ package body Ch4 is
Result := P_Case_Expression;
if not (Lparen and then Token = Tok_Right_Paren) then
- Error_Msg_N
- ("case expression must be parenthesized!", Result);
+ Error_Msg_N ("case expression must be parenthesized!", Result);
end if;
- -- Conditional expression
+ -- If expression
elsif Token = Tok_If then
- Result := P_Conditional_Expression;
+ Result := P_If_Expression;
if not (Lparen and then Token = Tok_Right_Paren) then
- Error_Msg_N
- ("conditional expression must be parenthesized!", Result);
+ Error_Msg_N ("if expression must be parenthesized!", Result);
end if;
-- Quantified expression
diff --git a/gcc/ada/par.adb b/gcc/ada/par.adb
index 892aac8..486c0f3 100644
--- a/gcc/ada/par.adb
+++ b/gcc/ada/par.adb
@@ -694,17 +694,12 @@ function Par (Configuration_Pragmas : Boolean) return List_Id is
-- keyword, and returns pointing to the terminating right parent,
-- semicolon, or comma, but does not consume this terminating token.
- function P_Conditional_Expression return Node_Id;
- -- Scans out a conditional expression. Called with Token pointing to
- -- the IF keyword, and returns pointing to the terminating right paren,
- -- semicolon or comma, but does not consume this terminating token.
-
function P_Expression_If_OK return Node_Id;
-- Scans out an expression allowing an unparenthesized case expression,
- -- conditional expression, or quantified expression to appear without
- -- enclosing parentheses. However, if such an expression is not preceded
- -- by a left paren, and followed by a right paren, an error message will
- -- be output noting that parenthesization is required.
+ -- if expression, or quantified expression to appear without enclosing
+ -- parentheses. However, if such an expression is not preceded by a left
+ -- paren, and followed by a right paren, an error message will be output
+ -- noting that parenthesization is required.
function P_Expression_No_Right_Paren return Node_Id;
-- Scans out an expression in contexts where the expression cannot be
@@ -718,6 +713,11 @@ function Par (Configuration_Pragmas : Boolean) return List_Id is
-- followed by a right paren, an error message will be output noting
-- that parenthesization is required.
+ function P_If_Expression return Node_Id;
+ -- Scans out an if expression. Called with Token pointing to the
+ -- IF keyword, and returns pointing to the terminating right paren,
+ -- semicolon or comma, but does not consume this terminating token.
+
function P_Qualified_Expression (Subtype_Mark : Node_Id) return Node_Id;
-- This routine scans out a qualified expression when the caller has
-- already scanned out the name and apostrophe of the construct.
diff --git a/gcc/ada/par_sco.adb b/gcc/ada/par_sco.adb
index 29c0338..be258bf 100644
--- a/gcc/ada/par_sco.adb
+++ b/gcc/ada/par_sco.adb
@@ -112,9 +112,9 @@ package body Par_SCO is
-- If N is Empty, has no effect. Otherwise scans the tree for the node N,
-- to output any decisions it contains. T is one of IEGPWX (for context of
-- expression: if/exit when/entry guard/pragma/while/expression). If T is
- -- other than X, the node N is the conditional expression involved, and a
- -- decision is always present (at the very least a simple decision is
- -- present at the top level).
+ -- other than X, the node N is the if expression involved, and a decision
+ -- is always present (at the very least a simple decision is present at the
+ -- top level).
procedure Process_Decisions
(L : List_Id;
@@ -614,12 +614,15 @@ package body Par_SCO is
-- Case expression
+ -- Really hard to believe this is correct given the special
+ -- handling for if expressions below ???
+
when N_Case_Expression =>
return OK; -- ???
- -- Conditional expression, processed like an if statement
+ -- If expression, processed like an if statement
- when N_Conditional_Expression =>
+ when N_If_Expression =>
declare
Cond : constant Node_Id := First (Expressions (N));
Thnx : constant Node_Id := Next (Cond);
diff --git a/gcc/ada/scans.ads b/gcc/ada/scans.ads
index ca2a5bb..eb062af 100644
--- a/gcc/ada/scans.ads
+++ b/gcc/ada/scans.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -464,8 +464,8 @@ package Scans is
-- Is it really right for this to be a Name rather than a String, what
-- about the case of Wide_Wide_Characters???
- Inside_Conditional_Expression : Nat := 0;
- -- This is a counter that is set non-zero while scanning out a conditional
+ Inside_If_Expression : Nat := 0;
+ -- This is a counter that is set non-zero while scanning out an if
-- expression (incremented on entry, decremented on exit). It is used to
-- disconnect format checks that normally apply to keywords THEN, ELSE etc.
diff --git a/gcc/ada/scng.adb b/gcc/ada/scng.adb
index b0a17db..ce644bc 100644
--- a/gcc/ada/scng.adb
+++ b/gcc/ada/scng.adb
@@ -2742,13 +2742,13 @@ package body Scng is
end if;
-- Check THEN/ELSE style rules. These do not apply to AND THEN
- -- or OR ELSE, and do not apply in conditional expressions.
+ -- or OR ELSE, and do not apply in if expressions.
if (Token = Tok_Then and then Prev_Token /= Tok_And)
or else
(Token = Tok_Else and then Prev_Token /= Tok_Or)
then
- if Inside_Conditional_Expression = 0 then
+ if Inside_If_Expression = 0 then
Style.Check_Separate_Stmt_Lines;
end if;
end if;
diff --git a/gcc/ada/scos.ads b/gcc/ada/scos.ads
index d2d2c54..076a66e 100644
--- a/gcc/ada/scos.ads
+++ b/gcc/ada/scos.ads
@@ -252,7 +252,7 @@ package SCOs is
-- E decision in EXIT WHEN statement
-- G decision in entry guard
- -- I decision in IF statement or conditional expression
+ -- I decision in IF statement or if expression
-- P decision in pragma Assert/Check/Pre_Condition/Post_Condition
-- W decision in WHILE iteration scheme
-- X decision appearing in some other expression context
diff --git a/gcc/ada/sem.adb b/gcc/ada/sem.adb
index bbd6425..6aafad8 100644
--- a/gcc/ada/sem.adb
+++ b/gcc/ada/sem.adb
@@ -168,9 +168,6 @@ package body Sem is
when N_Component_Declaration =>
Analyze_Component_Declaration (N);
- when N_Conditional_Expression =>
- Analyze_Conditional_Expression (N);
-
when N_Conditional_Entry_Call =>
Analyze_Conditional_Entry_Call (N);
@@ -279,6 +276,9 @@ package body Sem is
when N_Identifier =>
Analyze_Identifier (N);
+ when N_If_Expression =>
+ Analyze_If_Expression (N);
+
when N_If_Statement =>
Analyze_If_Statement (N);
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index 017318c..cb54be1 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -17029,18 +17029,7 @@ package body Sem_Ch3 is
when N_Attribute_Reference =>
return Attribute_Name (Original_Node (Exp)) = Name_Input;
- -- For a conditional expression, all dependent expressions must be
- -- legal constructs.
-
- when N_Conditional_Expression =>
- declare
- Then_Expr : constant Node_Id :=
- Next (First (Expressions (Original_Node (Exp))));
- Else_Expr : constant Node_Id := Next (Then_Expr);
- begin
- return OK_For_Limited_Init_In_05 (Typ, Then_Expr)
- and then OK_For_Limited_Init_In_05 (Typ, Else_Expr);
- end;
+ -- For a case expression, all dependent expressions must be legal
when N_Case_Expression =>
declare
@@ -17059,6 +17048,19 @@ package body Sem_Ch3 is
return True;
end;
+ -- For an if expression, all dependent expressions must be legal
+
+ when N_If_Expression =>
+ declare
+ Then_Expr : constant Node_Id :=
+ Next (First (Expressions (Original_Node (Exp))));
+ Else_Expr : constant Node_Id := Next (Then_Expr);
+ begin
+ return OK_For_Limited_Init_In_05 (Typ, Then_Expr)
+ and then
+ OK_For_Limited_Init_In_05 (Typ, Else_Expr);
+ end;
+
when others =>
return False;
end case;
diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
index 7f3bd60..64b40e6 100644
--- a/gcc/ada/sem_ch4.adb
+++ b/gcc/ada/sem_ch4.adb
@@ -1570,79 +1570,6 @@ package body Sem_Ch4 is
Operator_Check (N);
end Analyze_Concatenation_Rest;
- ------------------------------------
- -- Analyze_Conditional_Expression --
- ------------------------------------
-
- procedure Analyze_Conditional_Expression (N : Node_Id) is
- Condition : constant Node_Id := First (Expressions (N));
- Then_Expr : constant Node_Id := Next (Condition);
- Else_Expr : Node_Id;
-
- begin
- -- Defend against error of missing expressions from previous error
-
- if No (Then_Expr) then
- return;
- end if;
-
- Check_SPARK_Restriction ("conditional expression is not allowed", N);
-
- Else_Expr := Next (Then_Expr);
-
- if Comes_From_Source (N) then
- Check_Compiler_Unit (N);
- end if;
-
- Analyze_Expression (Condition);
- Analyze_Expression (Then_Expr);
-
- if Present (Else_Expr) then
- Analyze_Expression (Else_Expr);
- end if;
-
- -- If then expression not overloaded, then that decides the type
-
- if not Is_Overloaded (Then_Expr) then
- Set_Etype (N, Etype (Then_Expr));
-
- -- Case where then expression is overloaded
-
- else
- declare
- I : Interp_Index;
- It : Interp;
-
- begin
- Set_Etype (N, Any_Type);
-
- -- Shouldn't the following statement be down in the ELSE of the
- -- following loop? ???
-
- Get_First_Interp (Then_Expr, I, It);
-
- -- if no Else_Expression the conditional must be boolean
-
- if No (Else_Expr) then
- Set_Etype (N, Standard_Boolean);
-
- -- Else_Expression Present. For each possible intepretation of
- -- the Then_Expression, add it only if the Else_Expression has
- -- a compatible type.
-
- else
- while Present (It.Nam) loop
- if Has_Compatible_Type (Else_Expr, It.Typ) then
- Add_One_Interp (N, It.Typ, It.Typ);
- end if;
-
- Get_Next_Interp (I, It);
- end loop;
- end if;
- end;
- end if;
- end Analyze_Conditional_Expression;
-
-------------------------
-- Analyze_Equality_Op --
-------------------------
@@ -1981,6 +1908,79 @@ package body Sem_Ch4 is
Set_Etype (N, Etype (Expression (N)));
end Analyze_Expression_With_Actions;
+ ---------------------------
+ -- Analyze_If_Expression --
+ ---------------------------
+
+ procedure Analyze_If_Expression (N : Node_Id) is
+ Condition : constant Node_Id := First (Expressions (N));
+ Then_Expr : constant Node_Id := Next (Condition);
+ Else_Expr : Node_Id;
+
+ begin
+ -- Defend against error of missing expressions from previous error
+
+ if No (Then_Expr) then
+ return;
+ end if;
+
+ Check_SPARK_Restriction ("if expression is not allowed", N);
+
+ Else_Expr := Next (Then_Expr);
+
+ if Comes_From_Source (N) then
+ Check_Compiler_Unit (N);
+ end if;
+
+ Analyze_Expression (Condition);
+ Analyze_Expression (Then_Expr);
+
+ if Present (Else_Expr) then
+ Analyze_Expression (Else_Expr);
+ end if;
+
+ -- If then expression not overloaded, then that decides the type
+
+ if not Is_Overloaded (Then_Expr) then
+ Set_Etype (N, Etype (Then_Expr));
+
+ -- Case where then expression is overloaded
+
+ else
+ declare
+ I : Interp_Index;
+ It : Interp;
+
+ begin
+ Set_Etype (N, Any_Type);
+
+ -- Shouldn't the following statement be down in the ELSE of the
+ -- following loop? ???
+
+ Get_First_Interp (Then_Expr, I, It);
+
+ -- if no Else_Expression the conditional must be boolean
+
+ if No (Else_Expr) then
+ Set_Etype (N, Standard_Boolean);
+
+ -- Else_Expression Present. For each possible intepretation of
+ -- the Then_Expression, add it only if the Else_Expression has
+ -- a compatible type.
+
+ else
+ while Present (It.Nam) loop
+ if Has_Compatible_Type (Else_Expr, It.Typ) then
+ Add_One_Interp (N, It.Typ, It.Typ);
+ end if;
+
+ Get_Next_Interp (I, It);
+ end loop;
+ end if;
+ end;
+ end if;
+ end Analyze_If_Expression;
+
------------------------------------
-- Analyze_Indexed_Component_Form --
------------------------------------
diff --git a/gcc/ada/sem_ch4.ads b/gcc/ada/sem_ch4.ads
index 5e3150b..0a19643 100644
--- a/gcc/ada/sem_ch4.ads
+++ b/gcc/ada/sem_ch4.ads
@@ -33,10 +33,10 @@ package Sem_Ch4 is
procedure Analyze_Case_Expression (N : Node_Id);
procedure Analyze_Comparison_Op (N : Node_Id);
procedure Analyze_Concatenation (N : Node_Id);
- procedure Analyze_Conditional_Expression (N : Node_Id);
procedure Analyze_Equality_Op (N : Node_Id);
procedure Analyze_Explicit_Dereference (N : Node_Id);
procedure Analyze_Expression_With_Actions (N : Node_Id);
+ procedure Analyze_If_Expression (N : Node_Id);
procedure Analyze_Logical_Op (N : Node_Id);
procedure Analyze_Membership_Op (N : Node_Id);
procedure Analyze_Mod (N : Node_Id);
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 6d82598..2afc4ee 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -8659,10 +8659,6 @@ package body Sem_Ch6 is
and then
FCE (Expression (E1), Expression (E2));
- when N_Conditional_Expression =>
- return
- FCL (Expressions (E1), Expressions (E2));
-
when N_Explicit_Dereference =>
return
FCE (Prefix (E1), Prefix (E2));
@@ -8682,6 +8678,10 @@ package body Sem_Ch6 is
FCL (Parameter_Associations (E1),
Parameter_Associations (E2));
+ when N_If_Expression =>
+ return
+ FCL (Expressions (E1), Expressions (E2));
+
when N_Indexed_Component =>
return
FCE (Prefix (E1), Prefix (E2))
diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb
index e96d231..be3d7c5 100644
--- a/gcc/ada/sem_elab.adb
+++ b/gcc/ada/sem_elab.adb
@@ -1188,7 +1188,7 @@ package body Sem_Elab is
-- Nothing to do if this is a call already rewritten for elab checking
- elsif Nkind (Parent (N)) = N_Conditional_Expression then
+ elsif Nkind (Parent (N)) = N_If_Expression then
return;
-- Nothing to do if inside a generic template
@@ -2935,7 +2935,8 @@ package body Sem_Elab is
-- the context of the call has already been analyzed, an insertion
-- will not work if it depends on subsequent expansion (e.g. a call in
-- a branch of a short-circuit). In that case we replace the call with
- -- a conditional expression, or with a Raise if it is unconditional.
+ -- an if expression, or with a Raise if it is unconditional.
+
-- Unfortunately this does not work if the call has a dynamic size,
-- because gigi regards it as a dynamic-sized temporary. If such a call
-- appears in a short-circuit expression, the elaboration check will be
@@ -2972,14 +2973,14 @@ package body Sem_Elab is
Reloc_N := Relocate_Node (N);
Save_Interps (N, Reloc_N);
Rewrite (N,
- Make_Conditional_Expression (Loc,
+ Make_If_Expression (Loc,
Expressions => New_List (C, Reloc_N, R)));
end if;
Analyze_And_Resolve (N, Typ);
-- If the original call requires a range check, so does the
- -- conditional expression.
+ -- if expression.
if Chk then
Enable_Range_Check (N);
diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb
index f18dc00..3d13e9c 100644
--- a/gcc/ada/sem_eval.adb
+++ b/gcc/ada/sem_eval.adb
@@ -1872,15 +1872,74 @@ package body Sem_Eval is
end;
end Eval_Concatenation;
- ---------------------------------
- -- Eval_Conditional_Expression --
- ---------------------------------
+ ----------------------
+ -- Eval_Entity_Name --
+ ----------------------
+
+ -- This procedure is used for identifiers and expanded names other than
+ -- named numbers (see Eval_Named_Integer, Eval_Named_Real. These are
+ -- static if they denote a static constant (RM 4.9(6)) or if the name
+ -- denotes an enumeration literal (RM 4.9(22)).
+
+ procedure Eval_Entity_Name (N : Node_Id) is
+ Def_Id : constant Entity_Id := Entity (N);
+ Val : Node_Id;
+
+ begin
+ -- Enumeration literals are always considered to be constants
+ -- and cannot raise constraint error (RM 4.9(22)).
+
+ if Ekind (Def_Id) = E_Enumeration_Literal then
+ Set_Is_Static_Expression (N);
+ return;
+
+ -- A name is static if it denotes a static constant (RM 4.9(5)), and
+ -- we also copy Raise_Constraint_Error. Notice that even if non-static,
+ -- it does not violate 10.2.1(8) here, since this is not a variable.
+
+ elsif Ekind (Def_Id) = E_Constant then
+
+ -- Deferred constants must always be treated as nonstatic
+ -- outside the scope of their full view.
+
+ if Present (Full_View (Def_Id))
+ and then not In_Open_Scopes (Scope (Def_Id))
+ then
+ Val := Empty;
+ else
+ Val := Constant_Value (Def_Id);
+ end if;
+
+ if Present (Val) then
+ Set_Is_Static_Expression
+ (N, Is_Static_Expression (Val)
+ and then Is_Static_Subtype (Etype (Def_Id)));
+ Set_Raises_Constraint_Error (N, Raises_Constraint_Error (Val));
+
+ if not Is_Static_Expression (N)
+ and then not Is_Generic_Type (Etype (N))
+ then
+ Validate_Static_Object_Name (N);
+ end if;
+
+ return;
+ end if;
+ end if;
+
+ -- Fall through if the name is not static
+
+ Validate_Static_Object_Name (N);
+ end Eval_Entity_Name;
+
+ ------------------------
+ -- Eval_If_Expression --
+ ------------------------
- -- We can fold to a static expression if the condition and both constituent
+ -- We can fold to a static expression if the condition and both dependent
-- expressions are static. Otherwise, the only required processing is to do
-- the check for non-static context for the then and else expressions.
- procedure Eval_Conditional_Expression (N : Node_Id) is
+ procedure Eval_If_Expression (N : Node_Id) is
Condition : constant Node_Id := First (Expressions (N));
Then_Expr : constant Node_Id := Next (Condition);
Else_Expr : constant Node_Id := Next (Then_Expr);
@@ -1949,66 +2008,7 @@ package body Sem_Eval is
end if;
Set_Is_Static_Expression (N, Rstat);
- end Eval_Conditional_Expression;
-
- ----------------------
- -- Eval_Entity_Name --
- ----------------------
-
- -- This procedure is used for identifiers and expanded names other than
- -- named numbers (see Eval_Named_Integer, Eval_Named_Real. These are
- -- static if they denote a static constant (RM 4.9(6)) or if the name
- -- denotes an enumeration literal (RM 4.9(22)).
-
- procedure Eval_Entity_Name (N : Node_Id) is
- Def_Id : constant Entity_Id := Entity (N);
- Val : Node_Id;
-
- begin
- -- Enumeration literals are always considered to be constants
- -- and cannot raise constraint error (RM 4.9(22)).
-
- if Ekind (Def_Id) = E_Enumeration_Literal then
- Set_Is_Static_Expression (N);
- return;
-
- -- A name is static if it denotes a static constant (RM 4.9(5)), and
- -- we also copy Raise_Constraint_Error. Notice that even if non-static,
- -- it does not violate 10.2.1(8) here, since this is not a variable.
-
- elsif Ekind (Def_Id) = E_Constant then
-
- -- Deferred constants must always be treated as nonstatic
- -- outside the scope of their full view.
-
- if Present (Full_View (Def_Id))
- and then not In_Open_Scopes (Scope (Def_Id))
- then
- Val := Empty;
- else
- Val := Constant_Value (Def_Id);
- end if;
-
- if Present (Val) then
- Set_Is_Static_Expression
- (N, Is_Static_Expression (Val)
- and then Is_Static_Subtype (Etype (Def_Id)));
- Set_Raises_Constraint_Error (N, Raises_Constraint_Error (Val));
-
- if not Is_Static_Expression (N)
- and then not Is_Generic_Type (Etype (N))
- then
- Validate_Static_Object_Name (N);
- end if;
-
- return;
- end if;
- end if;
-
- -- Fall through if the name is not static
-
- Validate_Static_Object_Name (N);
- end Eval_Entity_Name;
+ end Eval_If_Expression;
----------------------------
-- Eval_Indexed_Component --
diff --git a/gcc/ada/sem_eval.ads b/gcc/ada/sem_eval.ads
index b2f5aa2..06607d7 100644
--- a/gcc/ada/sem_eval.ads
+++ b/gcc/ada/sem_eval.ads
@@ -296,8 +296,8 @@ package Sem_Eval is
procedure Eval_Case_Expression (N : Node_Id);
procedure Eval_Character_Literal (N : Node_Id);
procedure Eval_Concatenation (N : Node_Id);
- procedure Eval_Conditional_Expression (N : Node_Id);
procedure Eval_Entity_Name (N : Node_Id);
+ procedure Eval_If_Expression (N : Node_Id);
procedure Eval_Indexed_Component (N : Node_Id);
procedure Eval_Integer_Literal (N : Node_Id);
procedure Eval_Logical_Op (N : Node_Id);
@@ -439,7 +439,7 @@ private
pragma Inline (Eval_Actual);
pragma Inline (Eval_Allocator);
pragma Inline (Eval_Character_Literal);
- pragma Inline (Eval_Conditional_Expression);
+ pragma Inline (Eval_If_Expression);
pragma Inline (Eval_Indexed_Component);
pragma Inline (Eval_Named_Integer);
pragma Inline (Eval_Named_Real);
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index 86d7452..e50bcc9 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -178,11 +178,11 @@ package body Sem_Res is
procedure Resolve_Case_Expression (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Character_Literal (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Comparison_Op (N : Node_Id; Typ : Entity_Id);
- procedure Resolve_Conditional_Expression (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Entity_Name (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Equality_Op (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Explicit_Dereference (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Expression_With_Actions (N : Node_Id; Typ : Entity_Id);
+ procedure Resolve_If_Expression (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Indexed_Component (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Integer_Literal (N : Node_Id; Typ : Entity_Id);
procedure Resolve_Logical_Op (N : Node_Id; Typ : Entity_Id);
@@ -834,7 +834,7 @@ package body Sem_Res is
N_And_Then,
N_Case_Expression,
N_Case_Statement,
- N_Conditional_Expression,
+ N_If_Expression,
N_If_Statement)
then
return False;
@@ -2342,7 +2342,7 @@ package body Sem_Res is
elsif Nkind (N) = N_Character_Literal then
Set_Etype (N, Expr_Type);
- elsif Nkind (N) = N_Conditional_Expression then
+ elsif Nkind (N) = N_If_Expression then
Set_Etype (N, Expr_Type);
-- AI05-0139-2: Expression is overloaded because type has
@@ -2744,9 +2744,6 @@ package body Sem_Res is
when N_Character_Literal
=> Resolve_Character_Literal (N, Ctx_Type);
- when N_Conditional_Expression
- => Resolve_Conditional_Expression (N, Ctx_Type);
-
when N_Expanded_Name
=> Resolve_Entity_Name (N, Ctx_Type);
@@ -2765,6 +2762,9 @@ package body Sem_Res is
when N_Identifier
=> Resolve_Entity_Name (N, Ctx_Type);
+ when N_If_Expression
+ => Resolve_If_Expression (N, Ctx_Type);
+
when N_Indexed_Component
=> Resolve_Indexed_Component (N, Ctx_Type);
@@ -6128,75 +6128,6 @@ package body Sem_Res is
Eval_Relational_Op (N);
end Resolve_Comparison_Op;
- ------------------------------------
- -- Resolve_Conditional_Expression --
- ------------------------------------
-
- procedure Resolve_Conditional_Expression (N : Node_Id; Typ : Entity_Id) is
- Condition : constant Node_Id := First (Expressions (N));
- Then_Expr : constant Node_Id := Next (Condition);
- Else_Expr : Node_Id := Next (Then_Expr);
- Else_Typ : Entity_Id;
- Then_Typ : Entity_Id;
-
- begin
- Resolve (Condition, Any_Boolean);
- Resolve (Then_Expr, Typ);
- Then_Typ := Etype (Then_Expr);
-
- -- When the "then" expression is of a scalar type different from the
- -- result type, then insert a conversion to ensure the generation of
- -- a constraint check.
-
- if Is_Scalar_Type (Then_Typ)
- and then Then_Typ /= Typ
- then
- Rewrite (Then_Expr, Convert_To (Typ, Then_Expr));
- Analyze_And_Resolve (Then_Expr, Typ);
- end if;
-
- -- If ELSE expression present, just resolve using the determined type
-
- if Present (Else_Expr) then
- Resolve (Else_Expr, Typ);
- Else_Typ := Etype (Else_Expr);
-
- if Is_Scalar_Type (Else_Typ)
- and then Else_Typ /= Typ
- then
- Rewrite (Else_Expr, Convert_To (Typ, Else_Expr));
- Analyze_And_Resolve (Else_Expr, Typ);
- end if;
-
- -- If no ELSE expression is present, root type must be Standard.Boolean
- -- and we provide a Standard.True result converted to the appropriate
- -- Boolean type (in case it is a derived boolean type).
-
- elsif Root_Type (Typ) = Standard_Boolean then
- Else_Expr :=
- Convert_To (Typ, New_Occurrence_Of (Standard_True, Sloc (N)));
- Analyze_And_Resolve (Else_Expr, Typ);
- Append_To (Expressions (N), Else_Expr);
-
- else
- Error_Msg_N ("can only omit ELSE expression in Boolean case", N);
- Append_To (Expressions (N), Error);
- end if;
-
- Set_Etype (N, Typ);
- Eval_Conditional_Expression (N);
-
- -- If we still have a conditional expression, and overflow checks are
- -- enabled in MINIMIZED or ELIMINATED modes, then set Do_Overflow_Check
- -- to ensure that we handle overflow for dependent expressions.
-
- if Nkind (N) = N_Conditional_Expression
- and then Overflow_Check_Mode (Typ) in Minimized_Or_Eliminated
- then
- Set_Do_Overflow_Check (N);
- end if;
- end Resolve_Conditional_Expression;
-
-----------------------------------------
-- Resolve_Discrete_Subtype_Indication --
-----------------------------------------
@@ -6863,12 +6794,12 @@ package body Sem_Res is
R : constant Node_Id := Right_Opnd (N);
T : Entity_Id := Find_Unique_Type (L, R);
- procedure Check_Conditional_Expression (Cond : Node_Id);
- -- The resolution rule for conditional expressions requires that each
- -- such must have a unique type. This means that if several dependent
- -- expressions are of a non-null anonymous access type, and the context
- -- does not impose an expected type (as can be the case in an equality
- -- operation) the expression must be rejected.
+ procedure Check_If_Expression (Cond : Node_Id);
+ -- The resolution rule for if expressions requires that each such must
+ -- have a unique type. This means that if several dependent expressions
+ -- are of a non-null anonymous access type, and the context does not
+ -- impose an expected type (as can be the case in an equality operation)
+ -- the expression must be rejected.
function Find_Unique_Access_Type return Entity_Id;
-- In the case of allocators, make a last-ditch attempt to find a single
@@ -6876,27 +6807,26 @@ package body Sem_Res is
-- dubious, and of no interest to any real code, but c48008a makes it
-- all worthwhile.
- ----------------------------------
- -- Check_Conditional_Expression --
- ----------------------------------
+ -------------------------
+ -- Check_If_Expression --
+ -------------------------
- procedure Check_Conditional_Expression (Cond : Node_Id) is
+ procedure Check_If_Expression (Cond : Node_Id) is
Then_Expr : Node_Id;
Else_Expr : Node_Id;
begin
- if Nkind (Cond) = N_Conditional_Expression then
+ if Nkind (Cond) = N_If_Expression then
Then_Expr := Next (First (Expressions (Cond)));
Else_Expr := Next (Then_Expr);
if Nkind (Then_Expr) /= N_Null
and then Nkind (Else_Expr) /= N_Null
then
- Error_Msg_N
- ("cannot determine type of conditional expression", Cond);
+ Error_Msg_N ("cannot determine type of if expression", Cond);
end if;
end if;
- end Check_Conditional_Expression;
+ end Check_If_Expression;
-----------------------------
-- Find_Unique_Access_Type --
@@ -6972,9 +6902,11 @@ package body Sem_Res is
return;
end if;
- -- Conditional expressions must have a single type, and if the
- -- context does not impose one the dependent expressions cannot
- -- be anonymous access types.
+ -- If expressions must have a single type, and if the context does
+ -- not impose one the dependent expressions cannot be anonymous
+ -- access types.
+
+ -- Why no similar processing for case expressions???
elsif Ada_Version >= Ada_2012
and then Ekind_In (Etype (L), E_Anonymous_Access_Type,
@@ -6982,8 +6914,8 @@ package body Sem_Res is
and then Ekind_In (Etype (R), E_Anonymous_Access_Type,
E_Anonymous_Access_Subprogram_Type)
then
- Check_Conditional_Expression (L);
- Check_Conditional_Expression (R);
+ Check_If_Expression (L);
+ Check_If_Expression (R);
end if;
Resolve (L, T);
@@ -6994,6 +6926,7 @@ package body Sem_Res is
-- operands have equal static bounds.
if Is_Array_Type (T) then
+
-- Protect call to Matching_Static_Array_Bounds to avoid costly
-- operation if not needed.
@@ -7208,6 +7141,75 @@ package body Sem_Res is
Set_Etype (N, Typ);
end Resolve_Expression_With_Actions;
+ ---------------------------
+ -- Resolve_If_Expression --
+ ---------------------------
+
+ procedure Resolve_If_Expression (N : Node_Id; Typ : Entity_Id) is
+ Condition : constant Node_Id := First (Expressions (N));
+ Then_Expr : constant Node_Id := Next (Condition);
+ Else_Expr : Node_Id := Next (Then_Expr);
+ Else_Typ : Entity_Id;
+ Then_Typ : Entity_Id;
+
+ begin
+ Resolve (Condition, Any_Boolean);
+ Resolve (Then_Expr, Typ);
+ Then_Typ := Etype (Then_Expr);
+
+ -- When the "then" expression is of a scalar type different from the
+ -- result type, then insert a conversion to ensure the generation of
+ -- a constraint check.
+
+ if Is_Scalar_Type (Then_Typ)
+ and then Then_Typ /= Typ
+ then
+ Rewrite (Then_Expr, Convert_To (Typ, Then_Expr));
+ Analyze_And_Resolve (Then_Expr, Typ);
+ end if;
+
+ -- If ELSE expression present, just resolve using the determined type
+
+ if Present (Else_Expr) then
+ Resolve (Else_Expr, Typ);
+ Else_Typ := Etype (Else_Expr);
+
+ if Is_Scalar_Type (Else_Typ)
+ and then Else_Typ /= Typ
+ then
+ Rewrite (Else_Expr, Convert_To (Typ, Else_Expr));
+ Analyze_And_Resolve (Else_Expr, Typ);
+ end if;
+
+ -- If no ELSE expression is present, root type must be Standard.Boolean
+ -- and we provide a Standard.True result converted to the appropriate
+ -- Boolean type (in case it is a derived boolean type).
+
+ elsif Root_Type (Typ) = Standard_Boolean then
+ Else_Expr :=
+ Convert_To (Typ, New_Occurrence_Of (Standard_True, Sloc (N)));
+ Analyze_And_Resolve (Else_Expr, Typ);
+ Append_To (Expressions (N), Else_Expr);
+
+ else
+ Error_Msg_N ("can only omit ELSE expression in Boolean case", N);
+ Append_To (Expressions (N), Error);
+ end if;
+
+ Set_Etype (N, Typ);
+ Eval_If_Expression (N);
+
+ -- If we still have a if expression, and overflow checks are enabled in
+ -- MINIMIZED or ELIMINATED modes, then set Do_Overflow_Check to ensure
+ -- that we handle overflow for dependent expressions.
+
+ if Nkind (N) = N_If_Expression
+ and then Overflow_Check_Mode (Typ) in Minimized_Or_Eliminated
+ then
+ Set_Do_Overflow_Check (N);
+ end if;
+ end Resolve_If_Expression;
+
-------------------------------
-- Resolve_Indexed_Component --
-------------------------------
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 6d86d8b..ef6b0cb 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -2250,9 +2250,9 @@ package body Sem_Util is
Msgs := False;
exit;
- -- Conditional expression
+ -- If expression
- elsif Nkind (P) = N_Conditional_Expression then
+ elsif Nkind (P) = N_If_Expression then
declare
Cond : constant Node_Id := First (Expressions (P));
Texp : constant Node_Id := Next (Cond);
@@ -12146,13 +12146,15 @@ package body Sem_Util is
begin
Desc := N;
+ -- Seems dubious that case expressions are not handled here ???
+
P := Parent (N);
while Present (P) loop
if Nkind (P) = N_If_Statement
or else Nkind (P) = N_Case_Statement
or else (Nkind (P) in N_Short_Circuit
and then Desc = Right_Opnd (P))
- or else (Nkind (P) = N_Conditional_Expression
+ or else (Nkind (P) = N_If_Expression
and then Desc /= First (Expressions (P)))
or else Nkind (P) = N_Exception_Handler
or else Nkind (P) = N_Selective_Accept
diff --git a/gcc/ada/sinfo.adb b/gcc/ada/sinfo.adb
index a7ecd17..7b349de 100644
--- a/gcc/ada/sinfo.adb
+++ b/gcc/ada/sinfo.adb
@@ -928,7 +928,7 @@ package body Sinfo is
or else NT (N).Nkind in N_Op
or else NT (N).Nkind = N_Attribute_Reference
or else NT (N).Nkind = N_Case_Expression
- or else NT (N).Nkind = N_Conditional_Expression
+ or else NT (N).Nkind = N_If_Expression
or else NT (N).Nkind = N_Type_Conversion);
return Flag17 (N);
end Do_Overflow_Check;
@@ -1008,7 +1008,7 @@ package body Sinfo is
(N : Node_Id) return List_Id is
begin
pragma Assert (False
- or else NT (N).Nkind = N_Conditional_Expression);
+ or else NT (N).Nkind = N_If_Expression);
return List3 (N);
end Else_Actions;
@@ -1247,8 +1247,8 @@ package body Sinfo is
pragma Assert (False
or else NT (N).Nkind = N_Aggregate
or else NT (N).Nkind = N_Attribute_Reference
- or else NT (N).Nkind = N_Conditional_Expression
or else NT (N).Nkind = N_Extension_Aggregate
+ or else NT (N).Nkind = N_If_Expression
or else NT (N).Nkind = N_Indexed_Component);
return List1 (N);
end Expressions;
@@ -1745,7 +1745,7 @@ package body Sinfo is
(N : Node_Id) return Boolean is
begin
pragma Assert (False
- or else NT (N).Nkind = N_Conditional_Expression);
+ or else NT (N).Nkind = N_If_Expression);
return Flag13 (N);
end Is_Elsif;
@@ -2990,7 +2990,7 @@ package body Sinfo is
(N : Node_Id) return List_Id is
begin
pragma Assert (False
- or else NT (N).Nkind = N_Conditional_Expression);
+ or else NT (N).Nkind = N_If_Expression);
return List2 (N);
end Then_Actions;
@@ -4001,7 +4001,7 @@ package body Sinfo is
or else NT (N).Nkind in N_Op
or else NT (N).Nkind = N_Attribute_Reference
or else NT (N).Nkind = N_Case_Expression
- or else NT (N).Nkind = N_Conditional_Expression
+ or else NT (N).Nkind = N_If_Expression
or else NT (N).Nkind = N_Type_Conversion);
Set_Flag17 (N, Val);
end Set_Do_Overflow_Check;
@@ -4081,7 +4081,7 @@ package body Sinfo is
(N : Node_Id; Val : List_Id) is
begin
pragma Assert (False
- or else NT (N).Nkind = N_Conditional_Expression);
+ or else NT (N).Nkind = N_If_Expression);
Set_List3 (N, Val); -- semantic field, no parent set
end Set_Else_Actions;
@@ -4311,8 +4311,8 @@ package body Sinfo is
pragma Assert (False
or else NT (N).Nkind = N_Aggregate
or else NT (N).Nkind = N_Attribute_Reference
- or else NT (N).Nkind = N_Conditional_Expression
or else NT (N).Nkind = N_Extension_Aggregate
+ or else NT (N).Nkind = N_If_Expression
or else NT (N).Nkind = N_Indexed_Component);
Set_List1_With_Parent (N, Val);
end Set_Expressions;
@@ -4809,7 +4809,7 @@ package body Sinfo is
(N : Node_Id; Val : Boolean := True) is
begin
pragma Assert (False
- or else NT (N).Nkind = N_Conditional_Expression);
+ or else NT (N).Nkind = N_If_Expression);
Set_Flag13 (N, Val);
end Set_Is_Elsif;
@@ -6054,7 +6054,7 @@ package body Sinfo is
(N : Node_Id; Val : List_Id) is
begin
pragma Assert (False
- or else NT (N).Nkind = N_Conditional_Expression);
+ or else NT (N).Nkind = N_If_Expression);
Set_List2 (N, Val); -- semantic field, no parent set
end Set_Then_Actions;
diff --git a/gcc/ada/sinfo.ads b/gcc/ada/sinfo.ads
index 79f8c43..a0f5b52 100644
--- a/gcc/ada/sinfo.ads
+++ b/gcc/ada/sinfo.ads
@@ -824,7 +824,7 @@ package Sinfo is
-- attribute references which use this flag are Pred and Succ, where it
-- means that the result should be checked for going outside the base
-- range. Note that this flag is not set for modular types. This flag is
- -- also set on conditional expression nodes if we are operating in either
+ -- also set on if and case expression nodes if we are operating in either
-- MINIMIZED or ELIMINATED overflow checking mode (to make sure that we
-- properly process overflow checking for dependent expressions).
@@ -908,12 +908,12 @@ package Sinfo is
-- boolean is required.
-- Else_Actions (List3-Sem)
- -- This field is present in conditional expression nodes. During code
+ -- This field is present in if expression nodes. During code
-- expansion we use the Insert_Actions procedure (in Exp_Util) to insert
-- actions at an appropriate place in the tree to get elaborated at the
- -- right time. For conditional expressions, we have to be sure that the
- -- actions for the Else branch are only elaborated if the condition is
- -- False. The Else_Actions field is used as a temporary parking place for
+ -- right time. For if expressions, we have to be sure that the actions
+ -- for the Else branch are only elaborated if the condition is False.
+ -- The Else_Actions field is used as a temporary parking place for
-- these actions. The final tree is always rewritten to eliminate the
-- need for this field, so in the tree passed to Gigi, this field is
-- always set to No_List.
@@ -1761,12 +1761,12 @@ package Sinfo is
-- do size validation for.
-- Then_Actions (List3-Sem)
- -- This field is present in conditional expression nodes. During code
- -- expansion we use the Insert_Actions procedure (in Exp_Util) to insert
- -- actions at an appropriate place in the tree to get elaborated at the
- -- right time. For conditional expressions, we have to be sure that the
- -- actions for the Then branch are only elaborated if the condition is
- -- True. The Then_Actions field is used as a temporary parking place for
+ -- This field is present in if expression nodes. During code expansion
+ -- we use the Insert_Actions procedure (in Exp_Util) to insert actions
+ -- at an appropriate place in the tree to get elaborated at the right
+ -- time. For if expressions, we have to be sure that the actions for
+ -- for the Then branch are only elaborated if the condition is True.
+ -- The Then_Actions field is used as a temporary parking place for
-- these actions. The final tree is always rewritten to eliminate the
-- need for this field, so in the tree passed to Gigi, this field is
-- always set to No_List.
@@ -3885,15 +3885,9 @@ package Sinfo is
-- Note: if we have (IF x1 THEN x2 ELSIF x3 THEN x4 ELSE x5) then it
-- is represented as (IF x1 THEN x2 ELSE (IF x3 THEN x4 ELSE x5)) and
- -- the Is_Elsif flag is set on the inner conditional expression.
-
- -- Note: to be consistent with the grammar, the following node should
- -- really be named N_If_Expression, but historically it was always
- -- N_Conditional_Expression, so it would be a bit of an earthquake
- -- to change, and actually conditional expression seems a bit clearer
- -- than if expression in typical contexts, so we decide to leave it!
+ -- the Is_Elsif flag is set on the inner if expression.
- -- N_Conditional_Expression
+ -- N_If_Expression
-- Sloc points to IF or ELSIF keyword
-- Expressions (List1)
-- Then_Actions (List2-Sem)
@@ -6952,11 +6946,6 @@ package Sinfo is
-- reconstructed tree printed by Sprint, and the node descriptions here
-- show this syntax.
- -- Note: Case_Expression and Conditional_Expression is in this section for
- -- historical reasons, since they were initially extensions. Now that they
- -- are an official part of Ada 2012, we should move them to the appropriate
- -- section of this package. ???
-
--------------
-- Contract --
--------------
@@ -7639,12 +7628,6 @@ package Sinfo is
N_And_Then,
N_Or_Else,
- -- N_Subexpr, N_Has_Etype
-
- N_Conditional_Expression,
- N_Explicit_Dereference,
- N_Expression_With_Actions,
-
-- N_Subexpr, N_Has_Etype, N_Subprogram_Call
N_Function_Call,
@@ -7652,6 +7635,9 @@ package Sinfo is
-- N_Subexpr, N_Has_Etype
+ N_Explicit_Dereference,
+ N_Expression_With_Actions,
+ N_If_Expression,
N_Indexed_Component,
N_Integer_Literal,
N_Null,
@@ -11586,7 +11572,7 @@ package Sinfo is
4 => True, -- Pragmas_Before (List4)
5 => False), -- unused
- N_Conditional_Expression =>
+ N_If_Expression =>
(1 => True, -- Expressions (List1)
2 => False, -- Then_Actions (List2-Sem)
3 => False, -- Else_Actions (List3-Sem)
@@ -12454,6 +12440,9 @@ package Sinfo is
-- should refer to N_Simple_Return_Statement.
N_Parameterized_Expression : constant Node_Kind := N_Expression_Function;
- -- Old name for expression functions (used during Ada 2012 transition)
+ -- Old name for expression function (used during Ada 2012 transition)
+
+ N_Conditional_Expression : Node_Kind renames N_If_Expression;
+ -- Old name for if expression (used during Ada 2012 transition)
end Sinfo;
diff --git a/gcc/ada/sprint.adb b/gcc/ada/sprint.adb
index 17aca3b..0eee5d5 100644
--- a/gcc/ada/sprint.adb
+++ b/gcc/ada/sprint.adb
@@ -1320,27 +1320,6 @@ package body Sprint is
Sprint_Indented_List (Else_Statements (Node));
Write_Indent_Str ("end select;");
- when N_Conditional_Expression =>
- declare
- Condition : constant Node_Id := First (Expressions (Node));
- Then_Expr : constant Node_Id := Next (Condition);
-
- begin
- Write_Str_With_Col_Check_Sloc ("(if ");
- Sprint_Node (Condition);
- Write_Str_With_Col_Check (" then ");
-
- -- Defense against junk here!
-
- if Present (Then_Expr) then
- Sprint_Node (Then_Expr);
- Write_Str_With_Col_Check (" else ");
- Sprint_Node (Next (Then_Expr));
- end if;
-
- Write_Char (')');
- end;
-
when N_Constrained_Array_Definition =>
Write_Str_With_Col_Check_Sloc ("array ");
Sprint_Paren_Comma_List (Discrete_Subtype_Definitions (Node));
@@ -1978,6 +1957,27 @@ package body Sprint is
Set_Debug_Sloc;
Write_Id (Node);
+ when N_If_Expression =>
+ declare
+ Condition : constant Node_Id := First (Expressions (Node));
+ Then_Expr : constant Node_Id := Next (Condition);
+
+ begin
+ Write_Str_With_Col_Check_Sloc ("(if ");
+ Sprint_Node (Condition);
+ Write_Str_With_Col_Check (" then ");
+
+ -- Defense against junk here!
+
+ if Present (Then_Expr) then
+ Sprint_Node (Then_Expr);
+ Write_Str_With_Col_Check (" else ");
+ Sprint_Node (Next (Then_Expr));
+ end if;
+
+ Write_Char (')');
+ end;
+
when N_If_Statement =>
Write_Indent_Str_Sloc ("if ");
Sprint_Node (Condition (Node));
diff --git a/gcc/ada/sprint.ads b/gcc/ada/sprint.ads
index a44b9ed..173d148 100644
--- a/gcc/ada/sprint.ads
+++ b/gcc/ada/sprint.ads
@@ -48,7 +48,6 @@ package Sprint is
-- Allocator new xxx [storage_pool = xxx]
-- Cleanup action at end procedure name;
- -- Conditional expression (if expr then expr else expr)
-- Conversion wi Float_Truncate target^(source)
-- Convert wi Conversion_OK target?(source)
-- Convert wi Rounded_Result target@(source)
diff --git a/gcc/ada/style.ads b/gcc/ada/style.ads
index d425494..b52a8fb 100644
--- a/gcc/ada/style.ads
+++ b/gcc/ada/style.ads
@@ -190,8 +190,8 @@ package Style is
procedure Check_Xtra_Parens (Loc : Source_Ptr)
renames Style_Inst.Check_Xtra_Parens;
- -- Called after scanning a conditional expression that has at least one
- -- level of parentheses around the entire expression.
+ -- Called after scanning an if, case or quantified expression that has at
+ -- least one level of parentheses around the entire expression.
function Mode_In_Check return Boolean
renames Style_Inst.Mode_In_Check;
diff --git a/gcc/ada/styleg.ads b/gcc/ada/styleg.ads
index 7aabac4..06e5534 100644
--- a/gcc/ada/styleg.ads
+++ b/gcc/ada/styleg.ads
@@ -151,8 +151,8 @@ package Styleg is
-- Called after scanning a vertical bar to check spacing
procedure Check_Xtra_Parens (Loc : Source_Ptr);
- -- Called after scanning a conditional expression that has at least one
- -- level of parentheses around the entire expression.
+ -- Called after scanning an if, case, or quantified expression that has at
+ -- least one level of parentheses around the entire expression.
function Mode_In_Check return Boolean;
pragma Inline (Mode_In_Check);
diff --git a/gcc/ada/stylesw.ads b/gcc/ada/stylesw.ads
index b64e686..26fa480 100644
--- a/gcc/ada/stylesw.ads
+++ b/gcc/ada/stylesw.ads
@@ -268,8 +268,8 @@ package Stylesw is
Style_Check_Xtra_Parens : Boolean := False;
-- This can be set True by using the -gnatyx switch. If true, then it is
- -- not allowed to enclose entire conditional expressions in parentheses
- -- (C style).
+ -- not allowed to enclose entire expressions in tests in parentheses
+ -- (C style), e.g. if (x = y) then ... is not allowed.
Style_Max_Line_Length : Int := 0;
-- Value used to check maximum line length. Gets reset as a result of
diff --git a/gcc/ada/types.h b/gcc/ada/types.h
index a0f2891..bd1ef62 100644
--- a/gcc/ada/types.h
+++ b/gcc/ada/types.h
@@ -384,3 +384,4 @@ typedef Int Mechanism_Type;
#define SE_Object_Too_Large 34
#define LAST_REASON_CODE 34
+