diff mbox

Restore proper operation of -fdump-ada-spec in C++

Message ID 5093394.kXI4feKI2F@arcturus.home
State New
Headers show

Commit Message

Eric Botcazou Aug. 5, 2017, 10:03 p.m. UTC
> It was broken by the recent removal of TYPE_METHODS.

It turns out that the support for constructors/destructors also needs to be 
adjusted after the recent changes.

Tested on x86_64-suse-linux, applied on the mainline.


2017-08-05  Eric Botcazou  <ebotcazou@adacore.com>

c-family/
	* c-ada-spec.c (has_static_fields): Look only into variables.
	(print_constructor): Add TYPE parameter and use it for the name.
	(print_destructor): Likewise.
	(print_ada_declaration): Adjust to new constructor/destructor names.
	Adjust calls to print_constructor and print_destructor.
	(print_ada_struct_decl): Do not test TREE_STATIC on FIELD_DECL.
	Look only into variables in the final loop.
diff mbox

Patch

Index: c-ada-spec.c
===================================================================
--- c-ada-spec.c	(revision 250802)
+++ c-ada-spec.c	(working copy)
@@ -1056,7 +1056,7 @@  has_static_fields (const_tree type)
     return false;
 
   for (tree fld = TYPE_FIELDS (type); fld; fld = TREE_CHAIN (fld))
-    if (TREE_CODE (fld) == FIELD_DECL && DECL_NAME (fld) && TREE_STATIC (fld))
+    if (TREE_CODE (fld) == VAR_DECL && DECL_NAME (fld))
       return true;
 
   return false;
@@ -2635,12 +2634,12 @@  dump_nested_type (pretty_printer *buffer, tree fie
     }
 }
 
-/* Dump in BUFFER constructor spec corresponding to T.  */
+/* Dump in BUFFER constructor spec corresponding to T for TYPE.  */
 
 static void
-print_constructor (pretty_printer *buffer, tree t)
+print_constructor (pretty_printer *buffer, tree t, tree type)
 {
-  tree decl_name = DECL_NAME (DECL_ORIGIN (t));
+  tree decl_name = DECL_NAME (TYPE_NAME (type));
 
   pp_string (buffer, "New_");
   pp_ada_tree_identifier (buffer, decl_name, t, false);
@@ -2649,9 +2648,9 @@  static void
 /* Dump in BUFFER destructor spec corresponding to T.  */
 
 static void
-print_destructor (pretty_printer *buffer, tree t)
+print_destructor (pretty_printer *buffer, tree t, tree type)
 {
-  tree decl_name = DECL_NAME (DECL_ORIGIN (t));
+  tree decl_name = DECL_NAME (TYPE_NAME (type));
 
   pp_string (buffer, "Delete_");
   pp_ada_tree_identifier (buffer, decl_name, t, false);
@@ -2907,7 +2906,8 @@  print_ada_declaration (pretty_printer *buffer, tre
 	    return 0;
 
 	  /* Only consider constructors/destructors for complete objects.  */
-	  if (strncmp (IDENTIFIER_POINTER (decl_name), "__comp", 6) != 0)
+	  if (strncmp (IDENTIFIER_POINTER (decl_name), "__ct_comp", 9) != 0
+	      && strncmp (IDENTIFIER_POINTER (decl_name), "__dt_comp", 9) != 0)
 	    return 0;
 	}
 
@@ -2935,9 +2935,9 @@  print_ada_declaration (pretty_printer *buffer, tre
 	}
 
       if (is_constructor)
-	print_constructor (buffer, t);
+	print_constructor (buffer, t, type);
       else if (is_destructor)
-	print_destructor (buffer, t);
+	print_destructor (buffer, t, type);
       else
 	dump_ada_decl_name (buffer, t, false);
 
@@ -2976,7 +2976,7 @@  print_ada_declaration (pretty_printer *buffer, tre
       if (is_constructor)
 	{
 	  pp_string (buffer, "pragma CPP_Constructor (");
-	  print_constructor (buffer, t);
+	  print_constructor (buffer, t, type);
 	  pp_string (buffer, ", \"");
 	  pp_asm_name (buffer, t);
 	  pp_string (buffer, "\");");
@@ -2984,7 +2984,7 @@  print_ada_declaration (pretty_printer *buffer, tre
       else if (is_destructor)
 	{
 	  pp_string (buffer, "pragma Import (CPP, ");
-	  print_destructor (buffer, t);
+	  print_destructor (buffer, t, type);
 	  pp_string (buffer, ", \"");
 	  pp_asm_name (buffer, t);
 	  pp_string (buffer, "\");");
@@ -3214,7 +3208,7 @@  print_ada_struct_decl (pretty_printer *buffer, tre
 		  field_num++;
 		}
 	    }
-	  else if (TREE_CODE (tmp) == FIELD_DECL && !TREE_STATIC (tmp))
+	  else if (TREE_CODE (tmp) == FIELD_DECL)
 	    {
 	      /* Skip internal virtual table field.  */
 	      if (!DECL_VIRTUAL_P (tmp))
@@ -3308,9 +3302,7 @@  print_ada_struct_decl (pretty_printer *buffer, tre
   /* Print the static fields of the structure, if any.  */
   for (tmp = TYPE_FIELDS (node); tmp; tmp = TREE_CHAIN (tmp))
     {
-      if (TREE_CODE (tmp) == FIELD_DECL
-	  && DECL_NAME (tmp)
-	  && TREE_STATIC (tmp))
+      if (TREE_CODE (tmp) == VAR_DECL && DECL_NAME (tmp))
 	{
 	  if (need_semicolon)
 	    {