c++/8778: ICE on illegal initialization of non-integral static in-class constant
Wolfgang Bangerth
bangerth@ticam.utexas.edu
Mon Dec 2 16:26:00 GMT 2002
The following reply was made to PR c++/8778; it has been noted by GNATS.
From: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
To: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
Cc: gcc-gnats@gcc.gnu.org, <gcc-bugs@gcc.gnu.org>, <sgunderson@bigfoot.com>
Subject: Re: c++/8778: ICE on illegal initialization of non-integral static
in-class constant
Date: Mon, 2 Dec 2002 18:19:36 -0600 (CST)
> 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
More information about the Gcc-prs
mailing list