diff mbox

[C++] Add query for template-dependent arguments (-fdump-ada-spec)

Message ID 2043592.WFFkIS1Kum@polaris
State New
Headers show

Commit Message

Eric Botcazou June 4, 2015, 1:06 p.m. UTC
Hi,

we would like to add a new query for -fdump-ada-spec corresponding to the 
any_dependent_template_arguments_p predicate of the C++ front-end.  This makes 
it possible for -fdump-ada-spec to accept a few more patterns.

Tested on x86_64-suse-linux, OK for the mainline?


2015-06-04  Pierre-Marie de Rodat  <derodat@adacore.com>

c-family/
	* c-ada-spec.h (cpp_operation): Add HAS_DEPENDENT_TEMPLATE_ARGS.
	* c-ada-spec.c (collect_ada_nodes): Skip NAMESPACE_DECL
	(dump_ada_template): Skip partially specialized types.
cp/
	* decl2.c (cpp_check): Deal with HAS_DEPENDENT_TEMPLATE_ARGS.


2015-06-04  Pierre-Marie de Rodat  <derodat@adacore.com>

	* g++.dg/other/dump-ada-spec-5.C: New test.
	* g++.dg/other/dump-ada-spec-6.C: Likewise.
	* g++.dg/other/dump-ada-spec-7.C: Likewise.
diff mbox

Patch

Index: c-family/c-ada-spec.h
===================================================================
--- c-family/c-ada-spec.h	(revision 224054)
+++ c-family/c-ada-spec.h	(working copy)
@@ -25,6 +25,7 @@  along with GCC; see the file COPYING3.
 /* In c-ada-spec.c  */
 
 typedef enum {
+  HAS_DEPENDENT_TEMPLATE_ARGS,
   IS_ABSTRACT,
   IS_CONSTRUCTOR,
   IS_DESTRUCTOR,
Index: c-family/c-ada-spec.c
===================================================================
--- c-family/c-ada-spec.c	(revision 224054)
+++ c-family/c-ada-spec.c	(working copy)
@@ -601,9 +601,12 @@  collect_ada_nodes (tree t, const char *s
   tree n;
   int i = to_dump_count;
 
-  /* Count the likely relevant nodes.  */
+  /* Count the likely relevant nodes: do not dump builtins (they are irrelevant
+     in the context of bindings) and namespaces (we do not handle them properly
+     yet).  */
   for (n = t; n; n = TREE_CHAIN (n))
     if (!DECL_IS_BUILTIN (n)
+	&& TREE_CODE (n) != NAMESPACE_DECL
 	&& LOCATION_FILE (decl_sloc (n, false)) == source_file)
       to_dump_count++;
 
@@ -613,6 +616,7 @@  collect_ada_nodes (tree t, const char *s
   /* Store the relevant nodes.  */
   for (n = t; n; n = TREE_CHAIN (n))
     if (!DECL_IS_BUILTIN (n)
+	&& TREE_CODE (n) != NAMESPACE_DECL
 	&& LOCATION_FILE (decl_sloc (n, false)) == source_file)
       to_dump[i++] = n;
 }
@@ -1753,7 +1757,7 @@  dump_ada_template (pretty_printer *buffe
       != LOCATION_FILE (decl_sloc (t, false)))
     return 0;
 
-  while (inst && inst != error_mark_node)
+  for (; inst && inst != error_mark_node; inst = TREE_CHAIN (inst))
     {
       tree types = TREE_PURPOSE (inst);
       tree instance = TREE_VALUE (inst);
@@ -1764,6 +1768,13 @@  dump_ada_template (pretty_printer *buffe
       if (!RECORD_OR_UNION_TYPE_P (instance) || !TYPE_METHODS (instance))
 	break;
 
+      /* We are interested in concrete template instantiations only: skip
+	 partially specialized nodes.  */
+      if ((TREE_CODE (instance) == RECORD_TYPE
+	   || TREE_CODE (instance) == UNION_TYPE)
+	  && cpp_check && cpp_check (instance, HAS_DEPENDENT_TEMPLATE_ARGS))
+	continue;
+
       num_inst++;
       INDENT (spc);
       pp_string (buffer, "package ");
@@ -1799,8 +1810,6 @@  dump_ada_template (pretty_printer *buffe
       pp_semicolon (buffer);
       pp_newline (buffer);
       pp_newline (buffer);
-
-      inst = TREE_CHAIN (inst);
     }
 
   return num_inst > 0;
Index: cp/decl2.c
===================================================================
--- cp/decl2.c	(revision 224054)
+++ cp/decl2.c	(working copy)
@@ -4044,6 +4044,16 @@  cpp_check (tree t, cpp_operation op)
 {
   switch (op)
     {
+      case HAS_DEPENDENT_TEMPLATE_ARGS:
+	{
+	  tree ti = CLASSTYPE_TEMPLATE_INFO (t);
+	  if (!ti)
+	    return 0;
+	  ++processing_template_decl;
+	  const bool dep = any_dependent_template_arguments_p (TI_ARGS (ti));
+	  --processing_template_decl;
+	  return dep;
+	}
       case IS_ABSTRACT:
 	return DECL_PURE_VIRTUAL_P (t);
       case IS_CONSTRUCTOR: