diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-08-01 18:09:10 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-08-01 18:09:10 +0200 |
commit | 05dbd302cf611413886938da4448a7cdaeb88232 (patch) | |
tree | f9333a9cb727b17699ecf799b4cf9098ec094277 | |
parent | af9e051fadb5e6900ffc8668d6166dd5a1988ee2 (diff) | |
download | gcc-05dbd302cf611413886938da4448a7cdaeb88232.zip gcc-05dbd302cf611413886938da4448a7cdaeb88232.tar.gz gcc-05dbd302cf611413886938da4448a7cdaeb88232.tar.bz2 |
[multiple changes]
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
-rw-r--r-- | gcc/ada/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/ada/exp_ch4.adb | 5 | ||||
-rw-r--r-- | gcc/ada/sem_ch6.adb | 2 | ||||
-rw-r--r-- | gcc/ada/sem_disp.adb | 12 | ||||
-rw-r--r-- | gcc/ada/sem_util.adb | 7 |
5 files changed, 34 insertions, 9 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 591bd6a..b171ba0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -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. diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 5615ac9..a0c4104 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -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, diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 9922221..84bb761 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -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 diff --git a/gcc/ada/sem_disp.adb b/gcc/ada/sem_disp.adb index 818f9b8..450716b 100644 --- a/gcc/ada/sem_disp.adb +++ b/gcc/ada/sem_disp.adb @@ -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)); diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index e93a299..9a9b60e 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -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; |