OSDN Git Service

2011-08-30 Javier Miranda <miranda@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Aug 2011 13:23:33 +0000 (13:23 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Aug 2011 13:23:33 +0000 (13:23 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178300 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 9a4bc02..33ee476 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 3f11e0e..b1d9b9c 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 =>