From: Javier Miranda Date: Thu, 4 Jul 2019 08:07:24 +0000 (+0000) Subject: [Ada] Spurious error on non-default C++ constructor X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=07c91770f821ae9f6a567fb79b7f2ed675dfeaff;p=gcc.git [Ada] Spurious error on non-default C++ constructor The frontend reports spurious errors on C++ non-default constructors that have formals whose type is an access to subprogram. 2019-07-04 Javier Miranda gcc/ada/ * exp_tss.adb (Init_Proc): Adding missing support for access to subprograms and access to protected subprograms of non-default C++ constructors. gcc/testsuite/ * gnat.dg/cpp_constructor.adb, gnat.dg/cpp_constructor_fp.ads, gnat.dg/cpp_constructor_useit.ads: New testcase. From-SVN: r273072 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 3ea8e477e8a..45c5f39cb87 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2019-07-04 Javier Miranda + + * exp_tss.adb (Init_Proc): Adding missing support for access to + subprograms and access to protected subprograms of non-default + C++ constructors. + 2019-07-04 Eric Botcazou * gnat1drv.adb (Adjust_Global_Switches): Use proper interface to diff --git a/gcc/ada/exp_tss.adb b/gcc/ada/exp_tss.adb index 388be486406..8ef05e23d3e 100644 --- a/gcc/ada/exp_tss.adb +++ b/gcc/ada/exp_tss.adb @@ -32,6 +32,7 @@ with Lib; use Lib; with Restrict; use Restrict; with Rident; use Rident; with Sem_Aux; use Sem_Aux; +with Sem_Ch6; use Sem_Ch6; with Sem_Util; use Sem_Util; with Sinfo; use Sinfo; @@ -275,8 +276,8 @@ package body Exp_Tss is then exit; - elsif Ekind (Etype (E1)) /= E_Anonymous_Access_Type - and then Ekind (Etype (E2)) /= E_Anonymous_Access_Type + elsif not Is_Anonymous_Access_Type (Etype (E1)) + and then not Is_Anonymous_Access_Type (Etype (E2)) and then Etype (E1) /= Etype (E2) then exit; @@ -287,6 +288,17 @@ package body Exp_Tss is /= Directly_Designated_Type (Etype (E2)) then exit; + + elsif Ekind_In (Etype (E1), + E_Anonymous_Access_Subprogram_Type, + E_Anonymous_Access_Protected_Subprogram_Type) + and then Ekind_In (Etype (E2), + E_Anonymous_Access_Subprogram_Type, + E_Anonymous_Access_Protected_Subprogram_Type) + and then not Conforming_Types + (Etype (E1), Etype (E2), Fully_Conformant) + then + exit; end if; E1 := Next_Formal (E1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd1aa0dc14a..89601758400 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-07-04 Javier Miranda + + * gnat.dg/cpp_constructor.adb, gnat.dg/cpp_constructor_fp.ads, + gnat.dg/cpp_constructor_useit.ads: New testcase. + 2019-07-04 Gary Dismukes * gnat.dg/ghost5.adb, gnat.dg/ghost5.ads, diff --git a/gcc/testsuite/gnat.dg/cpp_constructor.adb b/gcc/testsuite/gnat.dg/cpp_constructor.adb new file mode 100644 index 00000000000..1ecae1b792f --- /dev/null +++ b/gcc/testsuite/gnat.dg/cpp_constructor.adb @@ -0,0 +1,12 @@ +-- { dg-do compile } + +with Interfaces.C; use Interfaces.C; +with Cpp_Constructor_FP; +with Cpp_Constructor_Useit; + +procedure Cpp_Constructor is + F : Cpp_Constructor_FP.Class := + Cpp_Constructor_FP.Constructor (Cpp_Constructor_Useit.My_Fn'Access); +begin + null; +end Cpp_Constructor; diff --git a/gcc/testsuite/gnat.dg/cpp_constructor_fp.ads b/gcc/testsuite/gnat.dg/cpp_constructor_fp.ads new file mode 100644 index 00000000000..3ee4b3eed84 --- /dev/null +++ b/gcc/testsuite/gnat.dg/cpp_constructor_fp.ads @@ -0,0 +1,10 @@ +with Interfaces.C; use Interfaces.C; + +package Cpp_Constructor_FP is + type Class is limited record null; end record + with Convention => Cpp, Import; + + function Constructor + (Fn : access function (Val : int) return int) return Class; + pragma Cpp_Constructor (Constructor, External_Name => "foo"); +end Cpp_Constructor_FP; diff --git a/gcc/testsuite/gnat.dg/cpp_constructor_useit.ads b/gcc/testsuite/gnat.dg/cpp_constructor_useit.ads new file mode 100644 index 00000000000..1f3046450a1 --- /dev/null +++ b/gcc/testsuite/gnat.dg/cpp_constructor_useit.ads @@ -0,0 +1,8 @@ +with Interfaces.C; use Interfaces.C; + +package Cpp_Constructor_Useit is + function My_Fn (Val : int) return int + with Convention => Cpp; + + function My_Fn (Val : int) return int is (Val + 1); +end Cpp_Constructor_Useit;