+2012-10-02 Robert Dewar <dewar@adacore.com>
+
+ * exp_ch4.adb (Expand_N_Op_Expon): Use expression with actions
+ for x ** 4.
+
+2012-10-02 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch5.adb: (Analyze_Iterator_Specification): If container
+ has a variable indexing aspect, the element is a variable and
+ is modifiable in the loop. This check is also performed when the
+ loop is expanded, but it must be done in semantic analysis when
+ expansion is disabled, for example for ASIS usage.
+
+2012-10-02 Ed Schonberg <schonberg@adacore.com>
+
+ * lib-xref.adb (Generate_Reference): If a child subprogram
+ has no previous spec, treat a reference to its formals (such
+ as a parameter association) as coming from source in order to
+ generate the proper references and enable gps navigation between
+ reference and declaration.
+
2012-10-02 Robert Dewar <dewar@adacore.com>
* checks.adb (Apply_Arithmetic_Overflow_Checked_Suppressed):
Exptyp : constant Entity_Id := Etype (Exp);
Ovflo : constant Boolean := Do_Overflow_Check (N);
Expv : Uint;
- Xnode : Node_Id;
Temp : Node_Id;
Rent : RE_Id;
Ent : Entity_Id;
Etyp : Entity_Id;
+ Xnode : Node_Id;
begin
Binary_Op_Validity_Checks (N);
return;
end if;
- -- Test for case of known right argument
+ -- Test for case of known right argument where we can replace the
+ -- exponentiation by an equivalent expression using multiplication.
if Compile_Time_Known_Value (Exp) then
Expv := Expr_Value (Exp);
Right_Opnd => Duplicate_Subexpr_No_Checks (Base));
-- X ** 4 ->
+
+ -- do
-- En : constant base'type := base * base;
- -- ...
+ -- in
-- En * En
- else -- Expv = 4
+ else
+ pragma Assert (Expv = 4);
Temp := Make_Temporary (Loc, 'E', Base);
- Insert_Actions (N, New_List (
- Make_Object_Declaration (Loc,
- Defining_Identifier => Temp,
- Constant_Present => True,
- Object_Definition => New_Reference_To (Typ, Loc),
+ Xnode :=
+ Make_Expression_With_Actions (Loc,
+ Actions => New_List (
+ Make_Object_Declaration (Loc,
+ Defining_Identifier => Temp,
+ Constant_Present => True,
+ Object_Definition => New_Reference_To (Typ, Loc),
+ Expression =>
+ Make_Op_Multiply (Loc,
+ Left_Opnd =>
+ Duplicate_Subexpr (Base),
+ Right_Opnd =>
+ Duplicate_Subexpr_No_Checks (Base)))),
+
Expression =>
Make_Op_Multiply (Loc,
- Left_Opnd => Duplicate_Subexpr (Base),
- Right_Opnd => Duplicate_Subexpr_No_Checks (Base)))));
-
- Xnode :=
- Make_Op_Multiply (Loc,
- Left_Opnd => New_Reference_To (Temp, Loc),
- Right_Opnd => New_Reference_To (Temp, Loc));
+ Left_Opnd => New_Reference_To (Temp, Loc),
+ Right_Opnd => New_Reference_To (Temp, Loc)));
end if;
Rewrite (N, Xnode);