[Ada] Crash in C++ constructor without external and link name
authorJavier Miranda <miranda@adacore.com>
Mon, 22 Jul 2019 13:56:36 +0000 (13:56 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 22 Jul 2019 13:56:36 +0000 (13:56 +0000)
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.

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.

From-SVN: r273670

gcc/ada/ChangeLog
gcc/ada/freeze.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/cpp_constructor2.adb [new file with mode: 0644]

index c42164b..5cb3ab4 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-22  Javier Miranda  <miranda@adacore.com>
+
+       * freeze.adb (Freeze_Subprogram): Check that C++ constructors
+       must have external or link name.
+
 2019-07-22  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_res.adb (Resolve_Selected_Component): If the prefix has a
index b29ff67..728eaf2 100644 (file)
@@ -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.
index f8372ba..2fa30eb 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-22  Javier Miranda  <miranda@adacore.com>
+
+       * gnat.dg/cpp_constructor2.adb: New testcase.
+
 2019-07-22  Ed Schonberg  <schonberg@adacore.com>
 
        * gnat.dg/warn22.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/cpp_constructor2.adb b/gcc/testsuite/gnat.dg/cpp_constructor2.adb
new file mode 100644 (file)
index 0000000..3b245b0
--- /dev/null
@@ -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;