[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 2 Oct 2012 08:40:05 +0000 (10:40 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 2 Oct 2012 08:40:05 +0000 (10:40 +0200)
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

gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb
gcc/ada/lib-xref.adb
gcc/ada/sem_ch5.adb

index 8dd037ffba443b74545c5b62e377c4811c1c6c27..b93836e904d73da3d5aa92bf807643d45c548278 100644 (file)
@@ -1,3 +1,24 @@
+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):
index 560d1759ef8bddf6367e536afa53a1db7b271ea6..ece60efa52c1bf570cb863897bead5658ce04334 100644 (file)
@@ -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);
index bbf1a3db4fb7f8b448303748bb03a77c9aa4ded5..aa9031f835ca6b1d71ae73b7fec3632141c62437 100644 (file)
@@ -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.
 
index f3df8c5c6ab9bdf57722fb528a03540425e533df..f756dbcaf5d3bbff13681a5ebbd2b61e48435d47 100644 (file)
@@ -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;