Commit cb42ba5d by Arnaud Charlet

[multiple changes]

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.

From-SVN: r191965
parent 4b1c4f20
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):
New name for Apply_Arithmetic_Overflow_Normal
(Apply_Arithmetic_Overflow_Minimized_Eliminated):
......
......@@ -7242,11 +7242,11 @@ package body Exp_Ch4 is
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);
......@@ -7301,7 +7301,8 @@ package body Exp_Ch4 is
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);
......@@ -7355,27 +7356,34 @@ package body Exp_Ch4 is
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);
......
......@@ -945,6 +945,13 @@ package body Lib.Xref is
then
Ent := E;
-- Ditto for the formals of such a subprogram
elsif Is_Overloadable (Scope (E))
and then Is_Child_Unit (Scope (E))
then
Ent := E;
-- Record components of discriminated subtypes or derived types must
-- be treated as references to the original component.
......
......@@ -1808,6 +1808,13 @@ package body Sem_Ch5 is
return;
else
Set_Etype (Def_Id, Entity (Element));
-- If the container has a variable indexing aspect, the
-- element is a variable and is modifiable in the loop.
if Present (Find_Aspect (Typ, Aspect_Variable_Indexing)) then
Set_Ekind (Def_Id, E_Variable);
end if;
end if;
end;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment