Consider: template <typename...> struct p; template <typename, typename> struct d; template <typename... A, typename... B> struct d<p<A...>, p<B...> > { typedef int t; }; typedef d<p<>, p<int, float> >::t q; typedef d<q, d<p<int>, p<float> >::t> r; // * typedef d<d<p<>, p<int, float> >::t, d<p<>, p<> >::t> s; // error: ‘typedef int d<p<int>, p<float> >::t’ is inaccessible within this context The error makes no sense. In fact, it disappears if the unrelated line marked with an asterisk is removed.
Confirmed.
Subject: Bug 35784 Author: jason Date: Wed Jan 7 20:43:01 2009 New Revision: 143166 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=143166 Log: PR c++/35297 PR c++/35477 PR c++/35784 PR c++/36846 PR c++/38276 * pt.c (check_default_tmpl_args): Don't complain about out-of-order parameter packs in the enclosing class or parameter packs after default args. (coerce_template_parms): If we have more than one parameter pack, don't flatten argument packs. (template_args_equal): Handle argument packs. (comp_template_args): Don't flatten argument packs. (check_instantiated_arg): Split out from... (check_instantiated_args): Here. Handle arg packs. (convert_template_argument): Just check that nontype argument packs have the right type. Added: trunk/gcc/testsuite/g++.dg/cpp0x/variadic92.C trunk/gcc/testsuite/g++.dg/cpp0x/variadic93.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/pt.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/cpp0x/variadic65.C trunk/gcc/testsuite/g++.dg/cpp0x/variadic82.C trunk/gcc/testsuite/g++.dg/cpp0x/variadic83.C
Fixed.