OSDN Git Service

2009-06-23 Ed Schonberg <schonberg@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 23 Jun 2009 09:25:20 +0000 (09:25 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 23 Jun 2009 09:25:20 +0000 (09:25 +0000)
* sem_ch3.adb (Derive_Subprogram): If the inherited subprogram is a
primitive equality include it with its source name even if the
operation is currently invisible, to make sure that the corresponding
slot in the dispatch table is reserved for the internal equality
subsequently generated during expansion.

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

gcc/ada/ChangeLog
gcc/ada/sem_ch3.adb

index 7b55a04..69ea312 100644 (file)
@@ -1,3 +1,11 @@
+2009-06-23  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch3.adb (Derive_Subprogram): If the inherited subprogram is a
+       primitive equality include it with its source name even if the
+       operation is currently invisible, to make sure that the corresponding
+       slot in the dispatch table is reserved for the internal equality
+       subsequently generated during expansion.
+
 2009-06-23  Matthew Gingell  <gingell@adacore.com>
 
        * Makefile.rtl, a-stwiha.adb: Add a-stwiha.adb back.
index 4761682..df1a500 100644 (file)
@@ -12034,6 +12034,26 @@ package body Sem_Ch3 is
       then
          Set_Derived_Name;
 
+      --  An inherited dispatching equality will be overridden by an internally
+      --  generated one, or by an explicit one, so preserve its name and thus
+      --  its entry in the dispatch table. Otherwise, if Parent_Subp is a
+      --  private operation it may become invisible if the full view has
+      --  progenitors, and the dispatch table will be malformed.
+      --  We check that the type is limited to handle the anomalous declaration
+      --  of Limited_Controlled, which is derived from a non-limited type, and
+      --  which is handled specially elsewhere as well.
+
+      elsif Chars (Parent_Subp) = Name_Op_Eq
+        and then Is_Dispatching_Operation (Parent_Subp)
+        and then Etype (Parent_Subp) = Standard_Boolean
+        and then
+          not Is_Limited_Type (Etype (First_Formal (Parent_Subp)))
+        and then
+          Etype (First_Formal (Parent_Subp))
+          = Etype (Next_Formal (First_Formal (Parent_Subp)))
+      then
+         Set_Derived_Name;
+
       --  If parent is hidden, this can be a regular derivation if the
       --  parent is immediately visible in a non-instantiating context,
       --  or if we are in the private part of an instance. This test
@@ -12065,7 +12085,7 @@ package body Sem_Ch3 is
       elsif Parent_Overrides_Interface_Primitive then
          Set_Derived_Name;
 
-      --  The type is inheriting a private operation, so enter
+      --  Otherwise, the type is inheriting a private operation, so enter
       --  it with a special name so it can't be overridden.
 
       else