Bug 51239 - [DR 1430] ICE with variadic template alias
Summary: [DR 1430] ICE with variadic template alias
Status: SUSPENDED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.7.0
: P3 normal
Target Milestone: ---
Assignee: Dodji Seketeli
URL:
Keywords:
: 53786 57138 (view as bug list)
Depends on:
Blocks: cwg1430 51180
  Show dependency treegraph
 
Reported: 2011-11-20 16:01 UTC by Gábor Lehel
Modified: 2021-11-08 09:36 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2011-11-21 00:00:00


Attachments
initial patch (1.59 KB, patch)
2013-04-11 15:19 UTC, Jason Merrill
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Gábor Lehel 2011-11-20 16:01:23 UTC
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);
Comment 1 Dodji Seketeli 2011-12-01 14:44:10 UTC
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.
Comment 2 Dodji Seketeli 2011-12-03 17:23:43 UTC
A candidate patch for this has been submitted to http://gcc.gnu.org/ml/gcc-patches/2011-12/msg00163.html
Comment 3 Dodji Seketeli 2012-03-11 22:32:48 UTC
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.
Comment 4 Jason Merrill 2013-04-05 16:29:42 UTC
*** Bug 53786 has been marked as a duplicate of this bug. ***
Comment 5 Jason Merrill 2013-04-11 15:19:29 UTC
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.
Comment 6 Jason Merrill 2013-08-03 20:35:00 UTC
Patch applied as r201469.  Leaving suspended until the DR resolution is final.
Comment 7 Jason Merrill 2014-02-24 22:28:15 UTC
*** Bug 60328 has been marked as a duplicate of this bug. ***
Comment 8 Jason Merrill 2014-08-01 18:46:19 UTC
*** Bug 57138 has been marked as a duplicate of this bug. ***