The interfacing with C++ assignment operators in Ada is not very clear but we 
should at least make sure that the generated binding compile.

Tested on x86_64-suse-linux, applied on mainline as obvious for the cp/ part.


2019-05-21  Eric Botcazou  <ebotca...@adacore.com>

c-family/
        * c-ada-spec.h (enum cpp_operation): Add IS_ASSIGNMENT_OPERATOR.
        * c-ada-spec.c (print_assignment_operator): New function.
        (dump_ada_declaration) <FUNCTION_DECL>: Call it do dump explicit copy
        assignment operators declared as methods and filter out the others.


2019-05-21  Eric Botcazou  <ebotca...@adacore.com>

cp/
        * decl2.c (cpp_check) <IS_ASSIGNMENT_OPERATOR>: New case.

-- 
Eric Botcazou
Index: c-family/c-ada-spec.c
===================================================================
--- c-family/c-ada-spec.c	(revision 271106)
+++ c-family/c-ada-spec.c	(working copy)
@@ -2681,6 +2681,17 @@ print_destructor (pretty_printer *buffer
   pp_ada_tree_identifier (buffer, decl_name, t, false);
 }
 
+/* Dump in BUFFER assignment operator spec corresponding to T.  */
+
+static void
+print_assignment_operator (pretty_printer *buffer, tree t, tree type)
+{
+  tree decl_name = DECL_NAME (TYPE_NAME (type));
+
+  pp_string (buffer, "Assign_");
+  pp_ada_tree_identifier (buffer, decl_name, t, false);
+}
+
 /* Return the name of type T.  */
 
 static const char *
@@ -2920,6 +2931,7 @@ dump_ada_declaration (pretty_printer *bu
       bool is_method = TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE;
       tree decl_name = DECL_NAME (t);
       bool is_abstract = false;
+      bool is_assignment_operator = false;
       bool is_constructor = false;
       bool is_destructor = false;
       bool is_copy_constructor = false;
@@ -2931,6 +2943,7 @@ dump_ada_declaration (pretty_printer *bu
       if (cpp_check)
 	{
 	  is_abstract = cpp_check (t, IS_ABSTRACT);
+	  is_assignment_operator = cpp_check (t, IS_ASSIGNMENT_OPERATOR);
 	  is_constructor = cpp_check (t, IS_CONSTRUCTOR);
 	  is_destructor = cpp_check (t, IS_DESTRUCTOR);
 	  is_copy_constructor = cpp_check (t, IS_COPY_CONSTRUCTOR);
@@ -2955,6 +2968,13 @@ dump_ada_declaration (pretty_printer *bu
 	    return 0;
 	}
 
+      else if (is_assignment_operator)
+	{
+	  /* ??? Skip implicit or non-method assignment operators for now.  */
+	  if (DECL_ARTIFICIAL (t) || !is_method)
+	    return 0;
+	}
+
       /* If this function has an entry in the vtable, we cannot omit it.  */
       else if (!DECL_VINDEX (t) && *IDENTIFIER_POINTER (decl_name) == '_')
 	{
@@ -2977,6 +2997,8 @@ dump_ada_declaration (pretty_printer *bu
 	print_constructor (buffer, t, type);
       else if (is_destructor)
 	print_destructor (buffer, t, type);
+      else if (is_assignment_operator)
+	print_assignment_operator (buffer, t, type);
       else
 	dump_ada_decl_name (buffer, t, false);
 
Index: c-family/c-ada-spec.h
===================================================================
--- c-family/c-ada-spec.h	(revision 271106)
+++ c-family/c-ada-spec.h	(working copy)
@@ -27,6 +27,7 @@ along with GCC; see the file COPYING3.
 enum cpp_operation {
   HAS_DEPENDENT_TEMPLATE_ARGS,
   IS_ABSTRACT,
+  IS_ASSIGNMENT_OPERATOR,
   IS_CONSTRUCTOR,
   IS_DESTRUCTOR,
   IS_COPY_CONSTRUCTOR,
Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 271106)
+++ cp/decl2.c	(working copy)
@@ -4247,6 +4247,8 @@ cpp_check (tree t, cpp_operation op)
 	}
       case IS_ABSTRACT:
 	return DECL_PURE_VIRTUAL_P (t);
+      case IS_ASSIGNMENT_OPERATOR:
+	return DECL_ASSIGNMENT_OPERATOR_P (t);
       case IS_CONSTRUCTOR:
 	return DECL_CONSTRUCTOR_P (t);
       case IS_DESTRUCTOR:

Reply via email to