The following code (self-contained): template<typename T, typename...> using head = T; template<typename... Ts> using x = head<Ts...>; results for me in the following error: $ LD_LIBRARY_PATH=/opt/gcc4.7/lib:$LD_LIBRARY_PATH PATH=/opt/gcc4.7/bin/:$PATH g++ -std=c++11 test68.cpp test68.cpp:2:15: internal compiler error: tree check: accessed elt 2 of tree_vec with 1 elts in tsubst_pack_expansion, at cp/pt.c:9298 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. GCC version: $ LD_LIBRARY_PATH=/opt/gcc4.7/lib:$LD_LIBRARY_PATH PATH=/opt/gcc4.7/bin/:$PATH g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/opt/gcc4.7/libexec/gcc/x86_64-unknown-linux-gnu/4.7.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: ../trunk/configure --disable-bootstrap --enable-languages=c,c++ --prefix=/opt/gcc4.7 Thread model: posix gcc version 4.7.0 20111120 (experimental) (GCC) SVN revision: 181530 A version from 20111109 produced the same error (at a different line number). The line in question in the current revision, and the two lines before it: levels = TMPL_ARGS_DEPTH (args); if (level <= levels) arg_pack = TMPL_ARG (args, level, idx);
Here is my understanding of what is happening here. When we first build the type head<Ts...>, we don't yet know the actual number of arguments for the 'head' template. So we should build a representation of head<Ts...> in which we don't yet try to substitute Ts... for the parameters of 'head'. That substitution would happen when 'x' is instantiated with a real argument pack. That argument pack would be substituted for Ts... and yield a real list of arguments that would in turn be applied to 'head'. Instead, we proceed as if we knew the number of arguments, and try to apply Ts... to head directly. And from there on, bad things happen. I am currently testing a patch for this.
A candidate patch for this has been submitted to http://gcc.gnu.org/ml/gcc-patches/2011-12/msg00163.html
There were more patches for this at http://gcc.gnu.org/ml/gcc-patches/2011-12/msg00728.html and http://gcc.gnu.org/ml/gcc-patches/2011-12/msg00729.html. I'd need to address the comments raised by the first patch, at least. But at the same time, it turned out that we are hitting DR 1430 (http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#1430). So I am suspending this bug for now because depending on the resolution of DR 1430 there, we might have to take a totally different direction.
*** Bug 53786 has been marked as a duplicate of this bug. ***
Created attachment 29859 [details] initial patch This patch takes the approach the committee seems to be settling on for 1430: just disallowing a pack expansion passed to a fixed alias template parameter. But I don't think it's complete, because I think the rules need to be more complex; for one thing, it ought to allow it for aliases that are equivalent to the template they refer to.
Patch applied as r201469. Leaving suspended until the DR resolution is final.
*** Bug 60328 has been marked as a duplicate of this bug. ***
*** Bug 57138 has been marked as a duplicate of this bug. ***