[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Mon, 1 Aug 2011 16:09:10 +0000 (18:09 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 1 Aug 2011 16:09:10 +0000 (18:09 +0200)
2011-08-01  Javier Miranda  <miranda@adacore.com>

* sem_disp.adb (Override_Dispatching_Operation): Enforce strictness of
condition that detects if the overridden operation must replace an
existing entity.

2011-08-01  Javier Miranda  <miranda@adacore.com>

* exp_ch4.adb (Expand_N_Case_Expression): Propagate to the expanded
code declarations inserted by Insert_Actions in each alternative of the
N_Case_Expression node.

2011-08-01  Robert Dewar  <dewar@adacore.com>

* sem_ch6.adb: Minor code reorganization.
* sem_util.adb: Minor reformatting.

From-SVN: r177059

gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_disp.adb
gcc/ada/sem_util.adb

index 591bd6acdc3b297bed15360ba85cd003f1a98355..b171ba0c213c9a6bf22c1f4d65571cf03d118124 100644 (file)
@@ -1,3 +1,20 @@
+2011-08-01  Javier Miranda  <miranda@adacore.com>
+
+       * sem_disp.adb (Override_Dispatching_Operation): Enforce strictness of
+       condition that detects if the overridden operation must replace an
+       existing entity.
+
+2011-08-01  Javier Miranda  <miranda@adacore.com>
+
+       * exp_ch4.adb (Expand_N_Case_Expression): Propagate to the expanded
+       code declarations inserted by Insert_Actions in each alternative of the
+       N_Case_Expression node.
+
+2011-08-01  Robert Dewar  <dewar@adacore.com>
+
+       * sem_ch6.adb: Minor code reorganization.
+       * sem_util.adb: Minor reformatting.
+
 2011-08-01  Pascal Obry  <obry@adacore.com>
 
        * prj-env.adb: Remove <prefix>/lib/gpr/<target> project search path.
index 5615ac912ddafea800a62798471aac53e9199819..a0c4104b3312b36fd854d5889847f38c607dbeb3 100644 (file)
@@ -4018,6 +4018,11 @@ package body Exp_Ch4 is
             Aloc : constant Source_Ptr := Sloc (Aexp);
 
          begin
+            --  Propagate declarations inserted in the node by Insert_Actions
+            --  (for example, temporaries generated to remove side effects).
+
+            Append_List_To (Actions, Sinfo.Actions (Alt));
+
             if not Is_Scalar_Type (Typ) then
                Aexp :=
                  Make_Attribute_Reference (Aloc,
index 992222198d7f2fad7cce99e4facca93172b49933..84bb761e190ac8e81a1d11c4e33377bfa89a3fd2 100644 (file)
@@ -1855,7 +1855,7 @@ package body Sem_Ch6 is
                            Last_Source_Node_In_Sequence (Statements (HSS));
                begin
                   if Present (Stat)
-                    and then not Nkind_In (Nkind (Stat),
+                    and then not Nkind_In (Stat,
                                            N_Simple_Return_Statement,
                                            N_Extended_Return_Statement)
                   then
index 818f9b85574eb2fc3ad207fbb9c172d297625671..450716bd9e6e2a9b4149f7a7b8414204d6ba7338 100644 (file)
@@ -2078,15 +2078,19 @@ package body Sem_Disp is
       --  The location of entities that come from source in the list of
       --  primitives of the tagged type must follow their order of occurrence
       --  in the sources to fulfill the C++ ABI. If the overridden entity is a
-      --  primitive of an interface that is not an ancestor of this tagged
-      --  type (that is, it is an entity added to the list of primitives by
-      --  Derive_Interface_Progenitors), then we must append the new entity
-      --  at the end of the list of primitives.
+      --  primitive of an interface that is not implemented by the parents of
+      --  this tagged type (that is, it is an alias of an interface primitive
+      --  generated by Derive_Interface_Progenitors), then we must append the
+      --  new entity at the end of the list of primitives.
 
       if Present (Alias (Prev_Op))
+        and then Etype (Tagged_Type) /= Tagged_Type
         and then Is_Interface (Find_Dispatching_Type (Alias (Prev_Op)))
         and then not Is_Ancestor (Find_Dispatching_Type (Alias (Prev_Op)),
                                   Tagged_Type)
+        and then not Implements_Interface
+                       (Etype (Tagged_Type),
+                        Find_Dispatching_Type (Alias (Prev_Op)))
       then
          Remove_Elmt (Primitive_Operations (Tagged_Type), Elmt);
          Append_Elmt (New_Op, Primitive_Operations (Tagged_Type));
index e93a2997091c7667d1529879170038e1e4b46c2f..9a9b60e395ab53e2f0e773dd4476c1990a829650 100644 (file)
@@ -7986,13 +7986,12 @@ package body Sem_Util is
    ----------------------------------
 
    function Last_Source_Node_In_Sequence (List : List_Id) return Node_Id is
-      N : Node_Id := Last (List);
+      N : Node_Id;
+
    begin
+      N := Last (List);
       while Present (N) loop
          exit when Comes_From_Source (N);
-
-         --  Reach before the generated statements at the end of the function
-
          N := Prev (N);
       end loop;