This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Crash in C++ constructor without external and link name


The compiler blows up processing the declaration of a tagged type
variable that has a C++ constructor without external or link name. After
this patch the frontend reports an error.

Tested on x86_64-pc-linux-gnu, committed on trunk

2019-07-22  Javier Miranda  <miranda@adacore.com>

gcc/ada/

	* freeze.adb (Freeze_Subprogram): Check that C++ constructors
	must have external or link name.

gcc/testsuite/

	* gnat.dg/cpp_constructor2.adb: New testcase.
--- gcc/ada/freeze.adb
+++ gcc/ada/freeze.adb
@@ -62,6 +62,7 @@ with Sem_Util;  use Sem_Util;
 with Sinfo;     use Sinfo;
 with Snames;    use Snames;
 with Stand;     use Stand;
+with Stringt;   use Stringt;
 with Targparm;  use Targparm;
 with Tbuild;    use Tbuild;
 with Ttypes;    use Ttypes;
@@ -8766,6 +8767,20 @@ package body Freeze is
          Set_Is_Pure (E, False);
       end if;
 
+      --  For C++ constructors check that their external name has been given
+      --  (either in pragma CPP_Constructor or in a pragma import).
+
+      if Is_Constructor (E)
+        and then
+           (No (Interface_Name (E))
+              or else String_Equal
+                        (L => Strval (Interface_Name (E)),
+                         R => Strval (Get_Default_External_Name (E))))
+      then
+         Error_Msg_N
+           ("'C++ constructor must have external name or link name", E);
+      end if;
+
       --  We also reset the Pure indication on a subprogram with an Address
       --  parameter, because the parameter may be used as a pointer and the
       --  referenced data may change even if the address value does not.

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/cpp_constructor2.adb
@@ -0,0 +1,19 @@
+--  { dg-do compile }
+
+procedure CPP_Constructor2 is
+
+   package P is
+      type X is tagged limited record
+         A, B, C, D : Integer;
+      end record;
+      pragma Import (Cpp, X);
+
+      procedure F1 (V : X);
+      pragma Import (Cpp, F1);
+
+      function F2 return X; --  { dg-error "C\\+\\+ constructor must have external name or link name" }
+      pragma Cpp_Constructor (F2);
+   end P;
+begin
+  null;
+end CPP_Constructor2;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]