diff options
author | Javier Miranda <miranda@adacore.com> | 2018-09-26 09:18:29 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2018-09-26 09:18:29 +0000 |
commit | c886a946134d08a3ae3ad2dacbcee8d6b981db1d (patch) | |
tree | 1df089e246aba438b05dd6b9e493cee1197ff250 | |
parent | 4f95defaa9c9e60f3e07f629bde8189fb6af19cf (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 1 |
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)) |