From e4394af56897939d2f47827330f75838fe038b23 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 7 Sep 2012 20:17:43 +0000 Subject: [PATCH] pt.c (num_template_headers_for_class): Rework per the code inline in cp_parser_check_declarator_template_parameters. 2012-09-07 Paolo Carlini * pt.c (num_template_headers_for_class): Rework per the code inline in cp_parser_check_declarator_template_parameters. * parser.c (cp_parser_check_declarator_template_parameters): Use num_template_headers_for_class. From-SVN: r191082 --- gcc/cp/ChangeLog | 7 ++++++ gcc/cp/parser.c | 56 +++++++++++------------------------------------- gcc/cp/pt.c | 27 +++++++++++------------ 3 files changed, 33 insertions(+), 57 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4ffe1b41eda..0fea1a664d3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-09-07 Paolo Carlini + + * pt.c (num_template_headers_for_class): Rework per the code + inline in cp_parser_check_declarator_template_parameters. + * parser.c (cp_parser_check_declarator_template_parameters): + Use num_template_headers_for_class. + 2012-09-06 Jason Merrill PR c++/54341 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 60ba380cf74..327ad0b2c7d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -20670,54 +20670,24 @@ cp_parser_check_declarator_template_parameters (cp_parser* parser, cp_declarator *declarator, location_t declarator_location) { - unsigned num_templates; - - /* We haven't seen any classes that involve template parameters yet. */ - num_templates = 0; - switch (declarator->kind) { case cdk_id: - if (declarator->u.id.qualifying_scope) - { - tree scope; + { + unsigned num_templates = 0; + tree scope = declarator->u.id.qualifying_scope; - scope = declarator->u.id.qualifying_scope; - - while (scope && CLASS_TYPE_P (scope)) - { - /* You're supposed to have one `template <...>' - for every template class, but you don't need one - for a full specialization. For example: - - template struct S{}; - template <> struct S { void f(); }; - void S::f () {} - - is correct; there shouldn't be a `template <>' for - the definition of `S::f'. */ - if (!CLASSTYPE_TEMPLATE_INFO (scope)) - /* If SCOPE does not have template information of any - kind, then it is not a template, nor is it nested - within a template. */ - break; - if (explicit_class_specialization_p (scope)) - break; - if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope))) - ++num_templates; - - scope = TYPE_CONTEXT (scope); - } - } - else if (TREE_CODE (declarator->u.id.unqualified_name) - == TEMPLATE_ID_EXPR) - /* If the DECLARATOR has the form `X' then it uses one - additional level of template parameters. */ - ++num_templates; - - return cp_parser_check_template_parameters - (parser, num_templates, declarator_location, declarator); + if (scope) + num_templates = num_template_headers_for_class (scope); + else if (TREE_CODE (declarator->u.id.unqualified_name) + == TEMPLATE_ID_EXPR) + /* If the DECLARATOR has the form `X' then it uses one + additional level of template parameters. */ + ++num_templates; + return cp_parser_check_template_parameters + (parser, num_templates, declarator_location, declarator); + } case cdk_function: case cdk_array: diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6f6235c009d..cde83f2d953 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2214,9 +2214,9 @@ copy_default_args_to_explicit_spec (tree decl) int num_template_headers_for_class (tree ctype) { - int template_count = 0; - tree t = ctype; - while (t != NULL_TREE && CLASS_TYPE_P (t)) + int num_templates = 0; + + while (ctype && CLASS_TYPE_P (ctype)) { /* You're supposed to have one `template <...>' for every template class, but you don't need one for a full @@ -2228,21 +2228,20 @@ num_template_headers_for_class (tree ctype) is correct; there shouldn't be a `template <>' for the definition of `S::f'. */ - if (CLASSTYPE_TEMPLATE_SPECIALIZATION (t) - && !any_dependent_template_arguments_p (CLASSTYPE_TI_ARGS (t))) - /* T is an explicit (not partial) specialization. All - containing classes must therefore also be explicitly - specialized. */ + if (!CLASSTYPE_TEMPLATE_INFO (ctype)) + /* If CTYPE does not have template information of any + kind, then it is not a template, nor is it nested + within a template. */ break; - if ((CLASSTYPE_USE_TEMPLATE (t) || CLASSTYPE_IS_TEMPLATE (t)) - && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t))) - template_count += 1; + if (explicit_class_specialization_p (ctype)) + break; + if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (ctype))) + ++num_templates; - t = TYPE_MAIN_DECL (t); - t = DECL_CONTEXT (t); + ctype = TYPE_CONTEXT (ctype); } - return template_count; + return num_templates; } /* Do a simple sanity check on the template headers that precede the