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

2017-08-07 Thread Eric Botcazou
> It was broken by the recent removal of TYPE_METHODS.

Hopefully last tweak...

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


2017-08-07  Eric Botcazou  

c-family/
* c-ada-spec.c (has_nontrivial_methods): Test for FUNCTION_DECL.
(print_ada_methods): Likewise.
(print_ada_declaration): Likewise.

-- 
Eric BotcazouIndex: c-ada-spec.c
===
--- c-ada-spec.c	(revision 250890)
+++ c-ada-spec.c	(working copy)
@@ -1099,7 +1099,7 @@ has_nontrivial_methods (tree type)
 
   /* If there are user-defined methods, they are deemed non-trivial.  */
   for (tree fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
-if (TREE_CODE (TREE_TYPE (fld)) == METHOD_TYPE && !DECL_ARTIFICIAL (fld))
+if (TREE_CODE (fld) == FUNCTION_DECL && !DECL_ARTIFICIAL (fld))
   return true;
 
   return false;
@@ -2442,7 +2442,7 @@ print_ada_methods (pretty_printer *buffer, tree no
 
   int res = 1;
   for (tree fld = TYPE_FIELDS (node); fld; fld = DECL_CHAIN (fld))
-if (TREE_CODE (TREE_TYPE (fld)) == METHOD_TYPE)
+if (TREE_CODE (fld) == FUNCTION_DECL)
   {
 	if (res)
 	  {
@@ -2955,8 +2955,7 @@ print_ada_declaration (pretty_printer *buffer, tre
 
   if (is_constructor && RECORD_OR_UNION_TYPE_P (type))
 	for (tree fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
-	  if (TREE_CODE (TREE_TYPE (fld)) == METHOD_TYPE
-	  && cpp_check (fld, IS_ABSTRACT))
+	  if (TREE_CODE (fld) == FUNCTION_DECL && cpp_check (fld, IS_ABSTRACT))
 	{
 	  is_abstract_class = true;
 	  break;
@@ -3036,7 +3035,7 @@ print_ada_declaration (pretty_printer *buffer, tre
 		is_interface = 0;
 		  has_fields = true;
 		}
-	  else if (TREE_CODE (TREE_TYPE (fld)) == METHOD_TYPE
+	  else if (TREE_CODE (fld) == FUNCTION_DECL
 		   && !DECL_ARTIFICIAL (fld))
 		{
 		  if (cpp_check (fld, IS_ABSTRACT))


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

2017-08-05 Thread Eric Botcazou
> 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  

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.

-- 
Eric BotcazouIndex: 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)
 	{