+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.
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,
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
-- 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));
----------------------------------
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;