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 <dero...@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 <dero...@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.
--
Eric Botcazou
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:
/* { dg-do compile } */
/* { dg-options "-fdump-ada-spec" } */
namespace foo
{
int bar = 0;
}
namespace bar = foo;
/* { dg-final { cleanup-ada-spec } } */
/* { dg-do compile } */
/* { dg-options "-fdump-ada-spec" } */
template<typename T, bool b> class Foo;
template<typename T>
class Foo<T, false>
{
public:
// This checks that we do not crash on static members from partially
// specialized class templates.
static int bar;
int f();
};
int func()
{
Foo<int, false> f;
return f.f();
}
/* { dg-final { cleanup-ada-spec } } */
/* { dg-do compile } */
/* { dg-options "-fdump-ada-spec" } */
template<int n>
void bar ()
{
return;
}
class Foo
{
// This check that we properly skip the specification for templated
// members of non-templated classes.
template<int n>
void bar ();
};
template<int n>
void Foo::bar ()
{
return;
}
/* { dg-final { cleanup-ada-spec } } */