From f6ee6cd0705164e7829bf3f7d122091a4770b406 Mon Sep 17 00:00:00 2001 From: dodji Date: Thu, 25 Mar 2010 22:08:33 +0000 Subject: [PATCH] Fix candidate for PR c++/43206 gcc/cp/ChangeLog: PR c++/43206 * cp-tree.h (get_template_parms_at_level): Declare ... * pt.c (get_template_parms_at_level): ... new function. * typeck.c (get_template_parms_of_dependent_type): If a template type parm's DECL_CONTEXT isn't yet set, get its siblings from current_template_parms. Use get_template_parms_at_level. Remove useless test. (incompatible_dependent_types_p): If we get empty parms from just one of the template type parms we are comparing then the template parms are incompatible. gcc/testsuite/ChangeLog: PR c++/43206 * g++.dg/template/typedef30.C: New test case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157730 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 13 +++++++++++++ gcc/cp/cp-tree.h | 2 +- gcc/cp/pt.c | 2 +- gcc/cp/typeck.c | 14 +++++++++----- gcc/testsuite/ChangeLog | 5 +++++ 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d9e0f893909..0f4f38415c6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2010-03-25 Dodji Seketeli + + PR c++/43206 + * cp-tree.h (get_template_parms_at_level): Declare ... + * pt.c (get_template_parms_at_level): ... new function. + * typeck.c (get_template_parms_of_dependent_type): If a template + type parm's DECL_CONTEXT isn't yet set, get its siblings from + current_template_parms. Use get_template_parms_at_level. Remove + useless test. + (incompatible_dependent_types_p): If we get empty parms from just one + of the template type parms we are comparing then the template parms are + incompatible. + 2010-03-24 Jason Merrill PR c++/43502 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 361a6f26b37..5089ebb2d32 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5008,7 +5008,7 @@ extern void print_template_statistics (void); bool template_template_parameter_p (const_tree); extern bool primary_template_instantiation_p (const_tree); extern tree get_primary_template_innermost_parameters (const_tree); -extern tree get_template_parms_at_level (tree, int); +extern tree get_template_parms_at_level (tree, unsigned); extern tree get_template_innermost_arguments (const_tree); extern tree get_template_argument_pack_elems (const_tree); extern tree get_function_template_decl (const_tree); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 7a66d367826..bb8749bfc5f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2852,7 +2852,7 @@ get_primary_template_innermost_parameters (const_tree t) of template parameters PARMS. */ tree -get_template_parms_at_level (tree parms, int level) +get_template_parms_at_level (tree parms, unsigned level) { tree p; if (!parms diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index dfdd5925a37..cff3211919a 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1129,11 +1129,15 @@ get_template_parms_of_dependent_type (tree t) else if (typedef_variant_p (t) && !NAMESPACE_SCOPE_P (TYPE_NAME (t))) tinfo = get_template_info (DECL_CONTEXT (TYPE_NAME (t))); - /* If T is a TYPENAME_TYPE which context is a template type - parameter, get the template parameters from that context. */ - else if (TYPE_CONTEXT (t) - && TREE_CODE (TYPE_CONTEXT (t)) == TEMPLATE_TYPE_PARM) - return TEMPLATE_TYPE_PARM_SIBLING_PARMS (TYPE_CONTEXT (t)); + else if (TREE_CODE (t) == TEMPLATE_TYPE_PARM + && DECL_CONTEXT (TYPE_NAME (t)) == NULL_TREE) + /* We have not yet created the DECL_TEMPLATE this + template type parm belongs to. It probably means + that we are in the middle of parsing the template parameters + of a template, and T is one of the parameters we have parsed. + Let's return the list of template parms we have parsed so far. */ + return get_template_parms_at_level (current_template_parms, + TEMPLATE_TYPE_LEVEL (t)); else if (TYPE_CONTEXT (t) && !NAMESPACE_SCOPE_P (t)) tinfo = get_template_info (TYPE_CONTEXT (t)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ed8848e5568..ef270e8890d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-03-25 Dodji Seketeli + + PR c++/43206 + * g++.dg/template/typedef30.C: New test case. + 2010-03-25 Jakub Jelinek PR c/43385 -- 2.11.0