Assigning an compound literal to a const void pointer( const void* ), gives a completely bogus warning:
error #2139: Too many initializers.
The constraints are somewhat specific. The pointer must be const void* and the assignment must be a compound literal of any type.
Here are some examples of what gives an error and what doesn't. Of course all of them are valid C code.
#include <stdio.h>
void Test( const void* f )
{
printf( "%p\n" , f ) ;
}
struct holdvoid
{
const void* h ;
} ;
int main( void )
{
//////WORKS/////
int n = 123 ;
Test( &n ) ;
const int m = 123 ;
Test( &m ) ;
n = ( int ){ 123 } ;
Test( &n ) ;
int* np = &( int ){ 123 } ;
Test( np ) ;
const int* cnp = &( const int ){ 123 } ;
Test( cnp ) ;
void* vp = &( int ){ 123 } ;
vp = &( int ){ n } ;
( void )vp ;
const void* cvpw = &n ;
( void )cvpw ;
//////DOESN'T WORK/////
const void* vpp = &( int ){ 123 } ;
( void )vpp ;
const void* cvp = &( const int ){ 123 } ;
( void )cvp ;
Test( &( int ){ 123 } ) ;
Test( &( const int ){ 123 } ) ;
( void )( struct holdvoid ){ &( const int ){ 123 } } ;
return 0 ;
}
http://ideone.com/xIoEv5I have noticed that if the initializer is a variable, the bug is not present. If I replace the constants with variables in the it doesn't work part of the code:
const void* vpp = &( int ){ n } ;
( void )vpp ;
const void* cvp = &( const int ){ n } ;
( void )cvp ;
Test( &( int ){ n } ) ;
Test( &( const int ){ n } ) ;
( void )( struct holdvoid ){ &( const int ){ n } } ;
The code compiles.