aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/exp_ch3.adb10
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 9a4bc02..33ee476 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,10 @@
+2011-08-30 Javier Miranda <miranda@adacore.com>
+
+ * exp_ch3.adb (Make_Eq_If): If the etype of the _parent component is an
+ interface type then do not generate code to compare this component.
+ Required since they have no components and their equality operator is
+ abstract.
+
2011-08-30 Steve Baird <baird@adacore.com>
* sem_util.ads (Deepest_Type_Access_Level): New function; for the type
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index 3f11e0e..b1d9b9c 100644
--- a/gcc/ada/exp_ch3.adb
+++ b/gcc/ada/exp_ch3.adb
@@ -8040,14 +8040,20 @@ package body Exp_Ch3 is
Field_Name := Chars (Defining_Identifier (C));
-- The tags must not be compared: they are not part of the value.
- -- Ditto for the controller component, if present.
+ -- Ditto for parent interfaces because their equality operator is
+ -- abstract.
-- Note also that in the following, we use Make_Identifier for
-- the component names. Use of New_Reference_To to identify the
-- components would be incorrect because the wrong entities for
-- discriminants could be picked up in the private type case.
- if Field_Name /= Name_uTag then
+ if Field_Name = Name_uParent
+ and then Is_Interface (Etype (Defining_Identifier (C)))
+ then
+ null;
+
+ elsif Field_Name /= Name_uTag then
Evolve_Or_Else (Cond,
Make_Op_Ne (Loc,
Left_Opnd =>