Commit eae6758d by Eric Botcazou Committed by Eric Botcazou

decl.c (is_cplusplus_method): Check that the type of the first parameter…

decl.c (is_cplusplus_method): Check that the type of the first parameter (indirectly) has C++ convention too.

	* gcc-interface/decl.c (is_cplusplus_method): Check that the type of
	the first parameter (indirectly) has C++ convention too.

From-SVN: r230788
parent 7d906d07
2015-11-24 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (is_cplusplus_method): Check that the type of
the first parameter (indirectly) has C++ convention too.
2015-11-23 Olivier Hainque <hainque@adacore.com>
* system-aix.ads: Add Frontend_Exceptions flag.
......
......@@ -5403,9 +5403,28 @@ get_minimal_subprog_decl (Entity_Id gnat_entity)
bool
is_cplusplus_method (Entity_Id gnat_entity)
{
/* Check that the subprogram has C++ convention. */
if (Convention (gnat_entity) != Convention_CPP)
return false;
/* A constructor is a method on the C++ side. We deal with it now because
it is declared without the 'this' parameter in the sources and, although
the front-end will create a version with the 'this' parameter for code
generation purposes, we want to return true for both versions. */
if (Is_Constructor (gnat_entity))
return true;
/* And that the type of the first parameter (indirectly) has it too. */
Entity_Id gnat_first = First_Formal (gnat_entity);
if (No (gnat_first))
return false;
Entity_Id gnat_type = Etype (gnat_first);
if (Is_Access_Type (gnat_type))
gnat_type = Directly_Designated_Type (gnat_type);
if (Convention (gnat_type) != Convention_CPP)
return false;
/* This is the main case: C++ method imported as a primitive operation.
Note that a C++ class with no virtual functions can be imported as a
limited record type so the operation is not necessarily dispatching. */
......@@ -5416,10 +5435,6 @@ is_cplusplus_method (Entity_Id gnat_entity)
if (Is_Subprogram (gnat_entity) && Is_Thunk (gnat_entity))
return true;
/* A constructor is a method on the C++ side. */
if (Is_Constructor (gnat_entity))
return true;
/* This is set on the E_Subprogram_Type built for a dispatching call. */
if (Is_Dispatch_Table_Entity (gnat_entity))
return true;
......
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