Commit 2fdc20b6 by Javier Miranda Committed by Pierre-Marie de Rodat

[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.

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
parent 0af66bdc
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
......
......@@ -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.
......
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.
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment