From c6a2f2d98d666f3d4ddd1e49e0f794da0410ac5c Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat Date: Mon, 22 Jun 2015 19:16:58 +0000 Subject: [PATCH] c-ada-spec.h (cpp_operation): Add HAS_DEPENDENT_TEMPLATE_ARGS. 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. From-SVN: r224754 --- gcc/c-family/ChangeLog | 6 +++++ gcc/c-family/c-ada-spec.c | 17 ++++++++++---- gcc/c-family/c-ada-spec.h | 1 + gcc/cp/ChangeLog | 4 ++++ gcc/cp/decl2.c | 10 ++++++++ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/g++.dg/other/dump-ada-spec-5.C | 11 +++++++++ gcc/testsuite/g++.dg/other/dump-ada-spec-6.C | 23 +++++++++++++++++++ gcc/testsuite/g++.dg/other/dump-ada-spec-7.C | 24 ++++++++++++++++++++ 9 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/dump-ada-spec-5.C create mode 100644 gcc/testsuite/g++.dg/other/dump-ada-spec-6.C create mode 100644 gcc/testsuite/g++.dg/other/dump-ada-spec-7.C diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 39de58a9ea5..a721ab58183 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2015-06-22 Pierre-Marie de Rodat + + * 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. + 2015-06-22 Mikhail Maltsev * c-common.c (scalar_to_vector): Use std::swap instead of manually diff --git a/gcc/c-family/c-ada-spec.c b/gcc/c-family/c-ada-spec.c index 85db5e37dc2..ab29f863e40 100644 --- a/gcc/c-family/c-ada-spec.c +++ b/gcc/c-family/c-ada-spec.c @@ -593,9 +593,12 @@ collect_ada_nodes (tree t, const char *source_file) 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++; @@ -605,6 +608,7 @@ collect_ada_nodes (tree t, const char *source_file) /* 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; } @@ -1745,7 +1749,7 @@ dump_ada_template (pretty_printer *buffer, tree t, int spc) != 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); @@ -1756,6 +1760,13 @@ dump_ada_template (pretty_printer *buffer, tree t, int spc) 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 "); @@ -1791,8 +1802,6 @@ dump_ada_template (pretty_printer *buffer, tree t, int spc) pp_semicolon (buffer); pp_newline (buffer); pp_newline (buffer); - - inst = TREE_CHAIN (inst); } return num_inst > 0; diff --git a/gcc/c-family/c-ada-spec.h b/gcc/c-family/c-ada-spec.h index 32fcaf91379..e922968626f 100644 --- a/gcc/c-family/c-ada-spec.h +++ b/gcc/c-family/c-ada-spec.h @@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see /* In c-ada-spec.c */ typedef enum { + HAS_DEPENDENT_TEMPLATE_ARGS, IS_ABSTRACT, IS_CONSTRUCTOR, IS_DESTRUCTOR, diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 89e43735a05..f8ad21b17c7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2015-06-22 Pierre-Marie de Rodat + + * decl2.c (cpp_check): Deal with HAS_DEPENDENT_TEMPLATE_ARGS. + 2015-06-22 Paolo Carlini * decl.c (grokdeclarator): Use declspecs->locations[ds_virtual]. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 8e0eae3745d..e24d2d66c07 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -4057,6 +4057,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: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 60d13270ff3..fac610723d2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-06-22 Pierre-Marie de Rodat + + * 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. + 2015-06-22 Paolo Carlini * g++.dg/inherit/pure1.C: Test location too. diff --git a/gcc/testsuite/g++.dg/other/dump-ada-spec-5.C b/gcc/testsuite/g++.dg/other/dump-ada-spec-5.C new file mode 100644 index 00000000000..4a106c56bc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/dump-ada-spec-5.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-ada-spec" } */ + +namespace foo +{ + int bar = 0; +} + +namespace bar = foo; + +/* { dg-final { cleanup-ada-spec } } */ diff --git a/gcc/testsuite/g++.dg/other/dump-ada-spec-6.C b/gcc/testsuite/g++.dg/other/dump-ada-spec-6.C new file mode 100644 index 00000000000..9659c505d70 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/dump-ada-spec-6.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-ada-spec" } */ + +template class Foo; + +template +class Foo +{ +public: + // This checks that we do not crash on static members from partially + // specialized class templates. + static int bar; + + int f(); +}; + +int func() +{ + Foo f; + return f.f(); +} + +/* { dg-final { cleanup-ada-spec } } */ diff --git a/gcc/testsuite/g++.dg/other/dump-ada-spec-7.C b/gcc/testsuite/g++.dg/other/dump-ada-spec-7.C new file mode 100644 index 00000000000..de47ec30fe3 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/dump-ada-spec-7.C @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-ada-spec" } */ + +template +void bar () +{ + return; +} + +class Foo +{ + // This check that we properly skip the specification for templated + // members of non-templated classes. + template + void bar (); +}; + +template +void Foo::bar () +{ + return; +} + +/* { dg-final { cleanup-ada-spec } } */ -- 2.30.2