c-ada-spec.c (print_constructor): New function.
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 28 Dec 2013 10:12:59 +0000 (10:12 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 28 Dec 2013 10:12:59 +0000 (10:12 +0000)
* c-ada-spec.c (print_constructor): New function.
(print_destructor): Retrieve the origin of the destructor.
(print_ada_declaration): Revamp handling of constructors/destructors.

From-SVN: r206228

gcc/c-family/ChangeLog
gcc/c-family/c-ada-spec.c

index 1e0da89..5895ed3 100644 (file)
@@ -1,3 +1,9 @@
+2013-12-28  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * c-ada-spec.c (print_constructor): New function.
+       (print_destructor): Retrieve the origin of the destructor.
+       (print_ada_declaration): Revamp handling of constructors/destructors.
+
 2013-12-23  Stuart Hastings <stuart@apple.com>
            Bill Maddox  <maddox@google.com>
            Jason Merrill  <jason@redhat.com>
index 1724c74..27fb9d7 100644 (file)
@@ -2521,20 +2521,34 @@ dump_nested_types (pretty_printer *buffer, tree t, tree parent, bool forward,
   TREE_VISITED (t) = 1;
 }
 
+/* Dump in BUFFER constructor spec corresponding to T.  */
+
+static void
+print_constructor (pretty_printer *buffer, tree t)
+{
+  tree decl_name = DECL_NAME (DECL_ORIGIN (t));
+
+  pp_string (buffer, "New_");
+  pp_ada_tree_identifier (buffer, decl_name, t, false);
+}
+
 /* Dump in BUFFER destructor spec corresponding to T.  */
 
 static void
 print_destructor (pretty_printer *buffer, tree t)
 {
-  const char *s = IDENTIFIER_POINTER (DECL_NAME (t));
+  tree decl_name = DECL_NAME (DECL_ORIGIN (t));
+  const char *s = IDENTIFIER_POINTER (decl_name);
 
   if (*s == '_')
-    for (s += 2; *s != ' '; s++)
-      pp_character (buffer, *s);
+    {
+      for (s += 2; *s != ' '; s++)
+       pp_character (buffer, *s);
+    }
   else
     {
       pp_string (buffer, "Delete_");
-      pp_ada_tree_identifier (buffer, DECL_NAME (t), t, false);
+      pp_ada_tree_identifier (buffer, decl_name, t, false);
     }
 }
 
@@ -2785,7 +2799,7 @@ print_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
     }
   else if (TREE_CODE (t) == FUNCTION_DECL)
     {
-      bool is_function = true, is_abstract_class = false;
+      bool is_function, is_abstract_class = false;
       bool is_method = TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE;
       tree decl_name = DECL_NAME (t);
       int prev_in_function = in_function;
@@ -2805,24 +2819,21 @@ print_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
          is_copy_constructor = cpp_check (t, IS_COPY_CONSTRUCTOR);
        }
 
-      /* Skip __comp_dtor destructor which is redundant with the '~class()'
-        destructor.  */
-      if (is_destructor
-         && !strncmp (IDENTIFIER_POINTER (decl_name), "__comp", 6))
-       return 0;
-
       /* Skip copy constructors: some are internal only, and those that are
         not cannot be called easily from Ada anyway.  */
       if (is_copy_constructor)
        return 0;
 
-      /* If this function has an entry in the dispatch table, we cannot
-        omit it.  */
-      if (!DECL_VINDEX (t) && *IDENTIFIER_POINTER (decl_name) == '_')
+      if (is_constructor || is_destructor)
        {
-         if (IDENTIFIER_POINTER (decl_name)[1] == '_')
+         /* Only consider constructors/destructors for complete objects.  */
+         if (strncmp (IDENTIFIER_POINTER (decl_name), "__comp", 6) != 0)
            return 0;
+       }
 
+      /* If this function has an entry in the vtable, we cannot omit it.  */
+      else if (!DECL_VINDEX (t) && *IDENTIFIER_POINTER (decl_name) == '_')
+       {
          INDENT (spc);
          pp_string (buffer, "--  skipped func ");
          pp_string (buffer, IDENTIFIER_POINTER (decl_name));
@@ -2832,19 +2843,22 @@ print_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
       if (need_indent)
        INDENT (spc);
 
-      if (is_constructor)
-       pp_string (buffer, "function New_");
-      else if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (t))))
+      if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (t))) && !is_constructor)
        {
-         is_function = false;
          pp_string (buffer, "procedure ");
+         is_function = false;
        }
       else
-       pp_string (buffer, "function ");
+       {
+         pp_string (buffer, "function ");
+         is_function = true;
+       }
 
       in_function = is_function;
 
-      if (is_destructor)
+      if (is_constructor)
+       print_constructor (buffer, t);
+      else if (is_destructor)
        print_destructor (buffer, t);
       else
        dump_ada_decl_name (buffer, t, false);
@@ -2856,16 +2870,9 @@ print_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
       if (is_function)
        {
          pp_string (buffer, " return ");
-
-         if (is_constructor)
-           {
-             dump_ada_decl_name (buffer, t, false);
-           }
-         else
-           {
-             dump_generic_ada_node
-               (buffer, TREE_TYPE (TREE_TYPE (t)), type, spc, false, true);
-           }
+         tree ret_type
+           = is_constructor ? DECL_CONTEXT (t) : TREE_TYPE (TREE_TYPE (t));
+         dump_generic_ada_node (buffer, ret_type, type, spc, false, true);
        }
 
       if (is_constructor
@@ -2877,7 +2884,7 @@ print_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
          for (tmp = TYPE_METHODS (type); tmp; tmp = TREE_CHAIN (tmp))
            if (cpp_check (tmp, IS_ABSTRACT))
              {
-               is_abstract_class = 1;
+               is_abstract_class = true;
                break;
              }
        }
@@ -2896,8 +2903,8 @@ print_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc)
 
       if (is_constructor)
        {
-         pp_string (buffer, "pragma CPP_Constructor (New_");
-         dump_ada_decl_name (buffer, t, false);
+         pp_string (buffer, "pragma CPP_Constructor (");
+         print_constructor (buffer, t);
          pp_string (buffer, ", \"");
          pp_asm_name (buffer, t);
          pp_string (buffer, "\");");