From eae6758d2b3d30b4f431b063ba98183fdac344a6 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 24 Nov 2015 08:42:37 +0000 Subject: [PATCH] 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 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/decl.c | 23 +++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2b552a24a20..65cc3da8e4b 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2015-11-24 Eric Botcazou + + * 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 * system-aix.ads: Add Frontend_Exceptions flag. diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index e3284378aaf..9994c679a40 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -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; -- 2.30.2