Bug 51723 - [C++0x] delegating constructor ICE
Summary: [C++0x] delegating constructor ICE
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.7.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-12-31 21:52 UTC by andyg1001
Modified: 2012-01-01 18:30 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2012-01-01 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description andyg1001 2011-12-31 21:52:50 UTC
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.
Comment 1 Paolo Carlini 2012-01-01 00:01:25 UTC
This works for me with today's (Rev 182761) GCC. Can you double check? I mean to add the testcase and close the PR.
Comment 2 andyg1001 2012-01-01 13:05:50 UTC
I have double-checked and, yes, it does work in the latest revision from trunk - sorry, I ought to have checked that first.
Comment 3 Paolo Carlini 2012-01-01 13:10:33 UTC
No problem, thanks.
Comment 4 paolo@gcc.gnu.org 2012-01-01 13:31:51 UTC
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
Comment 5 Paolo Carlini 2012-01-01 13:34:18 UTC
By the way, this is most likely a duplicate of PR51526, but an additional testcase for this recent feature cannot hurt. Thanks again.
Comment 6 andyg1001 2012-01-01 15:25:50 UTC
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.)
Comment 7 Paolo Carlini 2012-01-01 18:30:08 UTC
Oops, you are right, will do.