OSDN Git Service

Fix PR c++/43558
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 Mar 2010 09:21:02 +0000 (09:21 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:15:38 +0000 (14:15 +0900)
gcc/cp/ChangeLog:
PR c++/43558
* cp-tree.h (TEMPLATE_TYPE_PARM_SIBLING_PARMS): New accessor macro.
* pt.c (end_template_parm_list): Store sibling template parms of
each TEMPLATE_TYPE_PARMs into its TEMPLATE_TYPE_PARM_SIBLING_PARMS.
(push_template_decl_real): Don't store the containing template decl
into the DECL_CONTEXT of TEMPLATE_TYPE_PARMs anymore.
* typeck.c (get_template_parms_of_dependent_type): Get sibling parms
of a TEMPLATE_TYPE_PARM from TEMPLATE_TYPE_PARM_SIBLING_PARMS.
Simplify the logic.

gcc/testsuite/ChangeLog:
PR c++/43558
* g++.dg/template/typedef31.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157857 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog

index 387d355..0a1bce8 100644 (file)
@@ -1,3 +1,15 @@
+2010-03-31  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/43558
+       * cp-tree.h (TEMPLATE_TYPE_PARM_SIBLING_PARMS): New accessor macro.
+       * pt.c (end_template_parm_list): Store sibling template parms of
+       each TEMPLATE_TYPE_PARMs into its TEMPLATE_TYPE_PARM_SIBLING_PARMS.
+       (push_template_decl_real): Don't store the containing template decl
+       into the DECL_CONTEXT of TEMPLATE_TYPE_PARMs anymore.
+       * typeck.c (get_template_parms_of_dependent_type): Get sibling parms
+       of a TEMPLATE_TYPE_PARM from TEMPLATE_TYPE_PARM_SIBLING_PARMS.
+       Simplify the logic.
+
 2010-03-30  Jason Merrill  <jason@redhat.com>
 
        PR c++/43076
index cff3211..dfdd592 100644 (file)
@@ -1129,15 +1129,11 @@ 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)));
-  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));
+  /* 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 (TYPE_CONTEXT (t)
           && !NAMESPACE_SCOPE_P (t))
     tinfo = get_template_info (TYPE_CONTEXT (t));
index 3489d8a..579b9be 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-31  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/43558
+       * g++.dg/template/typedef31.C: New test.
+
 2010-03-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * g++.dg/ext/visibility/pragma-override1.C: Allow for .hidden in