OSDN Git Service

PR c++/45236
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Aug 2010 21:13:12 +0000 (21:13 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Aug 2010 21:13:12 +0000 (21:13 +0000)
* pt.c (lookup_template_class): Don't re-coerce outer parms.

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

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/variadic-104.C [new file with mode: 0644]

index 6355215..c202af4 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-09  Jason Merrill  <jason@redhat.com>
+
+       PR c++/45236
+       * pt.c (lookup_template_class): Don't re-coerce outer parms.
+
 2010-08-09  Nathan Froyd  <froydnj@codesourcery.com>
 
        * call.c (add_builtin_candidates): Use VECs for local variable
index bb6b1a0..02c54f9 100644 (file)
@@ -6540,11 +6540,16 @@ lookup_template_class (tree d1,
               i > 0 && t != NULL_TREE;
               --i, t = TREE_CHAIN (t))
            {
-             tree a = coerce_template_parms (TREE_VALUE (t),
-                                             arglist, gen_tmpl,
-                                             complain,
-                                             /*require_all_args=*/true,
-                                             /*use_default_args=*/true);
+             tree a;
+             if (i == saved_depth)
+               a = coerce_template_parms (TREE_VALUE (t),
+                                          arglist, gen_tmpl,
+                                          complain,
+                                          /*require_all_args=*/true,
+                                          /*use_default_args=*/true);
+             else
+               /* Outer levels should have already been coerced.  */
+               a = TMPL_ARGS_LEVEL (arglist, i);
 
              /* Don't process further if one of the levels fails.  */
              if (a == error_mark_node)
index 638f3af..8e73a3b 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-09  Jason Merrill  <jason@redhat.com>
+
+       PR c++/45236
+       * g++.dg/cpp0x/variadic-104.C: New.
+
 2010-08-09  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/44235
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-104.C b/gcc/testsuite/g++.dg/cpp0x/variadic-104.C
new file mode 100644 (file)
index 0000000..c693b33
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/45236
+// { dg-options -std=c++0x }
+
+template <class T, class S> class foo;
+
+template<template<int...> class C, int... II, class S>
+struct foo<C<II...>,S>
+{
+    template <class U>
+    struct bar { typedef int type; };
+};
+
+template <int... I>
+struct A {};
+
+foo<A<3>, float>::bar<int> x;