On Thu, Apr 23, 2009 at 1:38 PM, Denis Onischenko > <denis.onische...@gmail.com> wrote: > > The minimal code example is following: > > > > > > extern unsigned int __invalid_size_argument; > > #define TYPECHECK(t) ( sizeof(t) == sizeof(t[1]) ? sizeof(t) : > > __invalid_size_argument ) > > > > static int arr[] = { > > [TYPECHECK(int)] = 0, > > }; > > > > int main() > > { > > return 0; > > } > > > > > > command line is: gcc test.c > > > > GCC 4.5.0 revision 146607 compiles this code with following errors: > > test.c:5: error: nonconstant array index in initializer > > test.c:5: error: (near initialization for 'arr') > > > > released GCC 4.4.0 compiles without any errors
On Thu, Apr 23, 2009 at 04:58:17PM -0700, James Dennett wrote: > A diagnostic is required in standards-conforming modes, as > TYPECHECK(int) is not an "integral constant expression" (because it > includes a non-constant in a potentially-evaluated operand). But there are cases where we avoid issuing such a diagnostic by default, without flags such as -pedantic or calling out a specific language standard. The compiler is not supposed to be pedantic by default. A standards document saying that a diagnostic is required should not be the end of the story, especially when we're talking about important, widely used code bases.