]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
exp_intr.adb (Expand_Unc_Deallocation): If the designated type is controlled...
authorEd Schonberg <schonberg@adacore.com>
Mon, 4 Jul 2005 13:28:00 +0000 (15:28 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 4 Jul 2005 13:28:00 +0000 (15:28 +0200)
2005-07-04  Ed Schonberg  <schonberg@adacore.com>

* 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.

From-SVN: r101579

gcc/ada/exp_intr.adb

index df50c65845f2b23df1780fc792d78f2030823a2e..ea5d74f8b97678f0dd5da15f57d74ed174364676 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 :=