aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2005-07-04 15:28:00 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2005-07-04 15:28:00 +0200
commit4a2ddf6697829835a010d159f7803ff13c9943b7 (patch)
tree38e64f2e6dd2f26517d091c0b94c090934e9678b /gcc
parent64dd539571685b9a8b052352241b1f110f6d7002 (diff)
downloadgcc-4a2ddf6697829835a010d159f7803ff13c9943b7.zip
gcc-4a2ddf6697829835a010d159f7803ff13c9943b7.tar.gz
gcc-4a2ddf6697829835a010d159f7803ff13c9943b7.tar.bz2
exp_intr.adb (Expand_Unc_Deallocation): If the designated type is controlled...
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/exp_intr.adb11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/ada/exp_intr.adb b/gcc/ada/exp_intr.adb
index df50c65..ea5d74f 100644
--- a/gcc/ada/exp_intr.adb
+++ b/gcc/ada/exp_intr.adb
@@ -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 :=