This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: c++/8778: ICE on illegal initialization of non-integral staticin-class constant
- From: Wolfgang Bangerth <bangerth at ticam dot utexas dot edu>
- To: Volker Reichelt <reichelt at igpm dot rwth-aachen dot de>
- Cc: gcc-gnats at gcc dot gnu dot org, <gcc-bugs at gcc dot gnu dot org>, <sgunderson at bigfoot dot com>
- Date: Mon, 2 Dec 2002 18:19:36 -0600 (CST)
- Subject: Re: c++/8778: ICE on illegal initialization of non-integral staticin-class constant
> I don't quite agree with Wolfgangs analysis.
:-)
> Initializing const arrays is usually supported by gcc.
True, but not as static member variables.
> In fact, the code compiles if you just leave out the curly
> braces around the initializer.
>
> So the ICE is neither caused by the array initializer nor by the
> infinite recursion (which might also come to mind as a compiler crasher)
> as the following example shows:
>
> --------------------snip here----------------------
> template <int n> struct A
> {
> static const int i = A<0>::i; // works
> static const int i = { A<0>::i }; // ICE
> static const int i = { 1 }; // works
> };
> --------------------snip here----------------------
Your analysis gives a clue as to what goes wrong in the compiler, but note
that the original code reads
const static int result[] = { mylist<n-1>::result };
^^^^
This is what makes it illegal, not the curly braces. In your example, you
are initializing a scalar, he is initializing an array/pointer. However,
the curly braces seem to be the reason for the ICE, as you point out.
But thanks for the analysis anyway, it will help those that actually fix
the problem :-)
W.
-------------------------------------------------------------------------
Wolfgang Bangerth email: bangerth@ticam.utexas.edu
www: http://www.ticam.utexas.edu/~bangerth