OSDN Git Service

2005-07-04 Ed Schonberg <schonberg@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Jul 2005 13:28:00 +0000 (13:28 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Jul 2005 13:28:00 +0000 (13:28 +0000)
* exp_intr.adb (Expand_Unc_Deallocation): If the designated type is
controlled, indicate the expected type of the dereference that is
created for the call to Deep_Finalize, to prevent spurious errors when
the designated type is private and completed with a derivation from
another private type.

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

gcc/ada/exp_intr.adb

index df50c65..ea5d74f 100644 (file)
@@ -664,12 +664,21 @@ package body Exp_Intr is
 
          --  If the type is tagged, then we must force dispatching on the
          --  finalization call because the designated type may not be the
-         --  actual type of the object
+         --  actual type of the object.
 
          if Is_Tagged_Type (Desig_T)
            and then not Is_Class_Wide_Type (Desig_T)
          then
             Deref := Unchecked_Convert_To (Class_Wide_Type (Desig_T), Deref);
+
+         elsif not Is_Tagged_Type (Desig_T) then
+
+            --  Set type of result, to force a conversion when needed (see
+            --  exp_ch7, Convert_View), given that Deep_Finalize may be
+            --  inherited from the parent type, and we need the type of the
+            --  expression to see whether the conversion is in fact needed.
+
+            Set_Etype (Deref, Desig_T);
          end if;
 
          Free_Cod :=