mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 22:21:44 +08:00
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
This commit is contained in:
parent
7d906d07ed
commit
eae6758d2b
@ -1,3 +1,8 @@
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user