summaryrefslogtreecommitdiff
path: root/gcc/ada/exp_disp.adb
diff options
context:
space:
mode:
authorPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2017-10-09 18:23:07 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2017-10-09 18:23:07 +0000
commit5d57846b76a90d2a1f12b519afdb636851a15e90 (patch)
tree38ff92e8ad71a71e6fd37742318ecea0e136146a /gcc/ada/exp_disp.adb
parenta1df65216abc657e2bc941ede69eeb225e7bd224 (diff)
downloadgcc-5d57846b76a90d2a1f12b519afdb636851a15e90.tar.gz
exp_ch6.adb: (Make_Build_In_Place_Call_In_Object_Declaration): Take care of unchecked...
gcc/ada/ 2017-10-09 Bob Duff <duff@adacore.com> * exp_ch6.adb: (Make_Build_In_Place_Call_In_Object_Declaration): Take care of unchecked conversions in addition to regular conversions. This takes care of a case where a type is derived from a private untagged type that is completed by a tagged controlled type. 2017-10-09 Ed Schonberg <schonberg@adacore.com> * exp_disp.adb (Build_Class_Wide_Check, Replace_Formals): When rewriting a class-wide condition, handle properly the case where the controlling argument of the operation to which the condition applies is an access to a tagged type, and the condition includes a dispatching call with an implicit dereference. gcc/testsuite/ 2017-10-09 Ed Schonberg <schonberg@adacore.com> * gnat.dg/class_wide4.adb, gnat.dg/class_wide4_pkg.ads, gnat.dg/class_wide4_pkg2.ads: New testcase. From-SVN: r253554
Diffstat (limited to 'gcc/ada/exp_disp.adb')
-rw-r--r--gcc/ada/exp_disp.adb12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb
index 80276a93255..63c996ee706 100644
--- a/gcc/ada/exp_disp.adb
+++ b/gcc/ada/exp_disp.adb
@@ -736,6 +736,18 @@ package body Exp_Disp is
if Is_Class_Wide_Type (Etype (F)) then
Set_Etype (N, Etype (F));
+
+ -- Conversely, if this is a controlling argument
+ -- (in a dispatching call in the condition)
+ -- that is a dereference, the source is an access to
+ -- classwide type, so preserve the dispatching nature
+ -- of the call in the rewritten condition.
+
+ elsif Nkind (Parent (N)) = N_Explicit_Dereference
+ and then Is_Controlling_Actual (Parent (N))
+ then
+ Set_Controlling_Argument (Parent (Parent (N)),
+ Parent (N));
end if;
exit;