OSDN Git Service

Fix candidate for PR c++/43206
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Mar 2010 22:08:33 +0000 (22:08 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:14:42 +0000 (14:14 +0900)
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
gcc/cp/cp-tree.h
gcc/cp/pt.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog

index d9e0f89..0f4f384 100644 (file)
@@ -1,3 +1,16 @@
+2010-03-25  Dodji Seketeli  <dodji@redhat.com>
+
+       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  <jason@redhat.com>
 
        PR c++/43502
index 361a6f2..5089ebb 100644 (file)
@@ -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);
index 7a66d36..bb8749b 100644 (file)
@@ -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
index dfdd592..cff3211 100644 (file)
@@ -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));
index ed8848e..ef270e8 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-25  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/43206
+       * g++.dg/template/typedef30.C: New test case.
+
 2010-03-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/43385