[Ada] Mimic the C++ ABI when passing class-wide conversion actuals
authorJavier Miranda <miranda@adacore.com>
Wed, 26 Sep 2018 09:18:29 +0000 (09:18 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 26 Sep 2018 09:18:29 +0000 (09:18 +0000)
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

gcc/ada/ChangeLog
gcc/ada/sem_res.adb

index b9187b6338ebc81e0eefec6dea5ed3d3adf2ced2..5996edc98dca805c1422a196948704f2ab02f008 100644 (file)
@@ -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
index 5354d81630b71c75386b90586df4af782fecff01..6a3dfb74c854e1e13273cab4867fc352f3deb064 100644 (file)
@@ -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))