exp_ch3.adb (Make_Eq_If): If the etype of the _parent component is an interface type...
authorJavier Miranda <miranda@adacore.com>
Tue, 30 Aug 2011 13:23:33 +0000 (13:23 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 30 Aug 2011 13:23:33 +0000 (15:23 +0200)
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.

From-SVN: r178300

gcc/ada/ChangeLog
gcc/ada/exp_ch3.adb

index 9a4bc026579124bf41d873b4d079aa94c0dd3ea2..33ee4765a6865805cb045e65168e618da5076c0d 100644 (file)
@@ -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
index 3f11e0efcd528b3da5b2252499035e6acfa38862..b1d9b9c9e647f642affd898dbe321a89c5978b50 100644 (file)
@@ -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 =>