aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2018-09-26 09:18:29 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-09-26 09:18:29 +0000
commitc886a946134d08a3ae3ad2dacbcee8d6b981db1d (patch)
tree1df089e246aba438b05dd6b9e493cee1197ff250
parent4f95defaa9c9e60f3e07f629bde8189fb6af19cf (diff)
downloadgcc-c886a946134d08a3ae3ad2dacbcee8d6b981db1d.zip
gcc-c886a946134d08a3ae3ad2dacbcee8d6b981db1d.tar.gz
gcc-c886a946134d08a3ae3ad2dacbcee8d6b981db1d.tar.bz2
[Ada] Mimic the C++ ABI when passing class-wide conversion actuals
This patch does not affect the behavior of Ada-only code but improves consistency with the code generated by the C++ compiler. 2018-09-26 Javier Miranda <miranda@adacore.com> gcc/ada/ * sem_res.adb (Resolve_Actuals): If the formal is a class-wide type conversion then do not skip resolving and expanding the conversion; required to displace the pointer to the object and reference the dispatch table associated with the target interface type. From-SVN: r264624
-rw-r--r--gcc/ada/ChangeLog8
-rw-r--r--gcc/ada/sem_res.adb1
2 files changed, 9 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index b9187b6..5996edc 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,11 @@
+2018-09-26 Javier Miranda <miranda@adacore.com>
+
+ * sem_res.adb (Resolve_Actuals): If the formal is a class-wide
+ type conversion then do not skip resolving and expanding the
+ conversion; required to displace the pointer to the object and
+ reference the dispatch table associated with the target
+ interface type.
+
2018-09-26 Hristian Kirtchev <kirtchev@adacore.com>
* libgnat/g-dynhta.adb (Prepend_Or_Replace): Update the number
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index 5354d81..6a3dfb7 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -3809,6 +3809,7 @@ package body Sem_Res is
if Ekind (F) /= E_In_Parameter
and then Nkind (A) = N_Type_Conversion
and then not Is_Class_Wide_Type (Etype (Expression (A)))
+ and then not Is_Interface (Etype (A))
then
if Ekind (F) = E_In_Out_Parameter
and then Is_Array_Type (Etype (F))