diff options
author | Javier Miranda <miranda@adacore.com> | 2023-05-08 19:10:56 +0000 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-06-15 09:59:33 +0200 |
commit | 63c8e3a136860f967ba29ba64ef261f94ceb6fc8 (patch) | |
tree | 82ef3a4c959f5e39dddb1b893b547a7ec0af440d | |
parent | 4b14ffb9a86b938f6bd3073cffb4c39a5223f9f6 (diff) | |
download | gcc-63c8e3a136860f967ba29ba64ef261f94ceb6fc8.zip gcc-63c8e3a136860f967ba29ba64ef261f94ceb6fc8.tar.gz gcc-63c8e3a136860f967ba29ba64ef261f94ceb6fc8.tar.bz2 |
ada: Crash on C++ constructor of private type
The compiler crashes compiling a function that has pragma
CPP_constructor when its return type is a private type.
gcc/ada/
* sem_util.adb
(Is_CPP_Constructor_Call): Add missing support for calls to
functions returning a private type.
-rw-r--r-- | gcc/ada/sem_util.adb | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 3fd3eb4..3a64047d 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -16153,9 +16153,25 @@ package body Sem_Util is ----------------------------- function Is_CPP_Constructor_Call (N : Node_Id) return Boolean is + Ret_Typ : Entity_Id; + begin - return Nkind (N) = N_Function_Call - and then Is_CPP_Class (Etype (Etype (N))) + if Nkind (N) /= N_Function_Call then + return False; + end if; + + Ret_Typ := Base_Type (Etype (N)); + + if Is_Class_Wide_Type (Ret_Typ) then + Ret_Typ := Root_Type (Ret_Typ); + end if; + + if Is_Private_Type (Ret_Typ) then + Ret_Typ := Underlying_Type (Ret_Typ); + end if; + + return Present (Ret_Typ) + and then Is_CPP_Class (Ret_Typ) and then Is_Constructor (Entity (Name (N))) and then Is_Imported (Entity (Name (N))); end Is_CPP_Constructor_Call; |