The following reduced code generates an ICE in gcc version 4.7.0 20111219: template <int... V> struct A { static constexpr int a[sizeof...(V)] = { V... }; }; template <int... V> constexpr int A<V...>::a[]; struct B { const int* const b; template <unsigned int N> constexpr B(const int(&b)[N]) : b(b) { } template <int... V> constexpr B(A<V...>) : B(A<V...>::a) /* replace 'B' with 'b' to compile without ICE */ { } }; constexpr B works = A<10, 20, 30>::a; /* uses first ctor */ constexpr B causes_ice = A<10, 20, 30>(); /* uses second ctor */ The ICE occurs around the delegating constructor, but the code compiles correctly if it is substituted for a non-delegating form of the constructor. The message from gcc is: ice.cpp: In instantiation of 'constexpr B::B(A<V ...>) [with int ...V = {10, 20, 30}]': ice.cpp:25:40: required from here ice.cpp:21:7: internal compiler error: in build_data_member_initialization, at cp/semantics.c:5844 Please submit a full bug report, with preprocessed source if appropriate.
This works for me with today's (Rev 182761) GCC. Can you double check? I mean to add the testcase and close the PR.
I have double-checked and, yes, it does work in the latest revision from trunk - sorry, I ought to have checked that first.
No problem, thanks.
Author: paolo Date: Sun Jan 1 13:31:48 2012 New Revision: 182768 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=182768 Log: 2012-01-01 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51723 * g++.dg/cpp0x/constexpr-delegating2.C: New. Added: trunk/gcc/testsuite/g++.dg/cpp0x/constexpr-delegating2.C Modified: trunk/gcc/testsuite/ChangeLog
By the way, this is most likely a duplicate of PR51526, but an additional testcase for this recent feature cannot hurt. Thanks again.
As a suggestion, the test case added in commit http://gcc.gnu.org/viewcvs?view=revision&revision=182768 should have the additional two lines: constexpr B b1 = A<10, 20, 30>::a; constexpr B b2 = A<10, 20, 30>(); since these actually *cause* the ICE in the initial post. (These two lines were part of the initial post.)
Oops, you are right, will do.