g++ internal compiler error after errors
Bruno Haible
haible@ilog.fr
Tue Mar 16 08:54:00 GMT 1999
Hi,
When trying to compile a piece of violently incorrect C++ code (it tries
to define a function named `delete'...), g++ (egcs-1.1.1) crashes:
$ gcc -v
Reading specs from /packages/gnu/lib/gcc-lib/i486-pc-linux-gnulibc1/egcs-2.91.60/specs
gcc version egcs-2.91.60 19981201 (egcs-1.1.1 release)
$ gcc -c bug.cc
bug.cc:176: parse error before `delete'
bug.cc:179: `tree' was not declared in this scope
bug.cc:183: parse error before `for'
bug.cc:186: syntax error before `++'
bug.cc:186: syntax error before `++'
bug.cc:201: syntax error before `--'
bug.cc:201: syntax error before `--'
bug.cc:204: redefinition of `struct node_t ** nodeplace'
bug.cc:179: `struct node_t ** nodeplace' previously defined here
bug.cc:204: `node_to_delete' was not declared in this scope
bug.cc:206: parse error before `for'
bug.cc:209: syntax error before `++'
bug.cc:209: syntax error before `++'
bug.cc:210: warning: ANSI C++ forbids declaration `nodeplace' with no type
bug.cc:210: conflicting types for `int nodeplace'
bug.cc:204: previous declaration as `struct node_t ** nodeplace'
bug.cc:210: warning: initialization to `int' from `node_t **' lacks a cast
bug.cc:211: parse error before `}'
bug.cc:212: warning: ANSI C++ forbids declaration `nodeplace' with no type
bug.cc:212: conflicting types for `int * nodeplace'
bug.cc:210: previous declaration as `int nodeplace'
bug.cc:212: initialization to `int *' from `node_t *'
bug.cc:213: syntax error before `->'
bug.cc:214: syntax error before `->'
bug.cc:215: syntax error before `->'
bug.cc:216: warning: ANSI C++ forbids declaration `nodeplace_to_delete' with no type
bug.cc:216: initialization to `int *' from `node_t *'
bug.cc:217: warning: ANSI C++ forbids declaration `stack_ptr_to_delete' with no type
bug.cc:217: initialization to `int *' from `node_t **'
bug.cc:218: parse error before `}'
bug.cc:220: warning: ANSI C++ forbids declaration `rebalance' with no type
bug.cc:220: `int rebalance' redeclared as different kind of symbol
bug.cc:103: previous declaration of `void rebalance(struct node_t ***, unsigned int)'
bug.cc:220: warning: initializer list being treated as compound expression
bug.cc:221: parse error before `return'
bug.cc: In function `void sigsegv_unregister(struct sigsegv_dispatcher *, void *)':
bug.cc:247: void value not ignored as it ought to be
At top level:
(null):136543740: register name not specified for ` /* decl error */ '
../../gcc/varasm.c:750: Internal compiler error in function make_decl_rtl
================================ bug.cc ======================================
extern "C" {
typedef int (*sigsegv_handler_t) (void* fault_address);
extern int sigsegv_install_handler (sigsegv_handler_t handler);
extern void sigsegv_deinstall_handler (void);
extern void sigsegv_leave_handler (void);
typedef int (*sigsegv_area_handler_t) (void* fault_address, void* user_arg);
typedef
struct sigsegv_dispatcher {
void* tree;
}
sigsegv_dispatcher;
extern void sigsegv_init (sigsegv_dispatcher* dispatcher);
extern void* sigsegv_register (sigsegv_dispatcher* dispatcher,
void* address, unsigned long len,
sigsegv_area_handler_t handler, void* handler_arg);
extern void sigsegv_unregister (sigsegv_dispatcher* dispatcher, void* ticket);
extern int sigsegv_dispatch (sigsegv_dispatcher* dispatcher, void* fault_address);
}
typedef int ptrdiff_t;
typedef unsigned int size_t;
typedef unsigned int wint_t;
typedef long double __long_double_t;
extern "C" {
extern void perror (__const char* __s) ;
extern char* strerror (int __errno) ;
extern int errno;
}
extern "C" {
typedef struct
{
int quot;
int rem;
} div_t;
typedef struct
{
long int quot;
long int rem;
} ldiv_t;
extern double atof (__const char *__nptr) ;
extern int atoi (__const char *__nptr) ;
extern long int atol (__const char *__nptr) ;
extern float strtof (__const char *__nptr, char **__endptr) ;
extern double strtod (__const char *__nptr, char **__endptr) ;
extern long int strtol (__const char *__nptr, char **__endptr,
int __base) ;
extern unsigned long int strtoul (__const char *__nptr,
char **__endptr, int __base) ;
extern double __strtod_internal (__const char *__nptr,
char **__endptr, int __group);
extern float __strtof_internal (__const char *__nptr, char **__endptr,
int __group);
extern __long_double_t __strtold_internal (__const char *__nptr,
char **__endptr, int __group);
extern long int __strtol_internal (__const char *__nptr, char **__endptr,
int __base, int __group);
extern unsigned long int __strtoul_internal (__const char *__nptr,
char **__endptr, int __base,
int __group);
extern int rand (void) ;
extern void srand (unsigned int __seed) ;
extern long int __random (void) ;
extern void __srandom (unsigned int __seed) ;
extern void * __initstate (unsigned int __seed, void * __statebuf,
size_t __statelen) ;
extern void * __setstate (void * __statebuf) ;
extern void * malloc (size_t __size) ;
extern void * realloc (void * __ptr, size_t __size) ;
extern void * calloc (size_t __nmemb, size_t __size) ;
extern void free (void * __ptr) ;
extern void abort (void) ;
extern int atexit (void (*__func) (void)) ;
extern void exit (int __status) ;
extern char *getenv (__const char *__name) ;
extern int system (__const char *__command) ;
typedef int (*__compar_fn_t) (__const void * , __const void * ) ;
extern void * bsearch (__const void * __key, __const void * __base,
size_t __nmemb, size_t __size,
__compar_fn_t __compar) ;
extern void qsort (void * __base, size_t __nmemb, size_t __size,
__compar_fn_t __compar) ;
extern int abs (int __x) ;
extern long int labs (long int __x) ;
extern div_t div (int __numer, int __denom) ;
extern ldiv_t ldiv (long int __numer, long int __denom) ;
extern int mblen (__const char *__s, size_t __n) ;
extern int mbtowc (wchar_t * __pwc, __const char *__s, size_t __n) ;
extern int wctomb (char *__s, wchar_t __wchar) ;
extern size_t mbstowcs (wchar_t * __pwcs, __const char *__s, size_t __n) ;
extern size_t wcstombs (char *__s, __const wchar_t * __pwcs, size_t __n) ;
}
typedef
struct node_t {
struct node_t * left;
struct node_t * right;
unsigned int height;
unsigned long address;
unsigned long len;
sigsegv_area_handler_t handler;
void* handler_arg;
}
node_t;
static void rebalance (node_t*** nodeplaces_ptr, unsigned int count)
{
if (count > 0)
do {
node_t** nodeplace = *--nodeplaces_ptr;
node_t* node = *nodeplace;
node_t* nodeleft = node->left;
node_t* noderight = node->right;
unsigned int heightleft = (( nodeleft )== ((node_t *) 0) ? 0 : ( nodeleft )->height) ;
unsigned int heightright = (( noderight )== ((node_t *) 0) ? 0 : ( noderight )->height) ;
if (heightright + 1 < heightleft) {
node_t* nodeleftleft = nodeleft->left;
node_t* nodeleftright = nodeleft->right;
unsigned int heightleftright = (( nodeleftright )== ((node_t *) 0) ? 0 : ( nodeleftright )->height) ;
if ((( nodeleftleft )== ((node_t *) 0) ? 0 : ( nodeleftleft )->height) >= heightleftright) {
node->left = nodeleftright; nodeleft->right = node;
nodeleft->height = 1 + (node->height = 1 + heightleftright);
*nodeplace = nodeleft;
} else {
nodeleft->right = nodeleftright->left;
node->left = nodeleftright->right;
nodeleftright->left = nodeleft;
nodeleftright->right = node;
nodeleft->height = node->height = heightleftright;
nodeleftright->height = heightleft;
*nodeplace = nodeleftright;
}
} else if (heightleft + 1 < heightright) {
node_t* noderightright = noderight->right;
node_t* noderightleft = noderight->left;
unsigned int heightrightleft = (( noderightleft )== ((node_t *) 0) ? 0 : ( noderightleft )->height) ;
if ((( noderightright )== ((node_t *) 0) ? 0 : ( noderightright )->height) >= heightrightleft) {
node->right = noderightleft; noderight->left = node;
noderight->height = 1 + (node->height = 1 + heightrightleft);
*nodeplace = noderight;
} else {
noderight->left = noderightleft->right;
node->right = noderightleft->left;
noderightleft->right = noderight;
noderightleft->left = node;
noderight->height = node->height = heightrightleft;
noderightleft->height = heightright;
*nodeplace = noderightleft;
}
} else {
unsigned int height = (heightleft<heightright ? heightright : heightleft) + 1;
if (height == node->height) break;
node->height = height;
}
} while (--count > 0);
}
static node_t* insert (node_t* new_node, node_t* tree)
{
unsigned int key = new_node->address;
node_t** nodeplace = &tree;
node_t** stack[41 ];
unsigned int stack_count = 0;
node_t*** stack_ptr = &stack[0];
for (;;) {
node_t* node = *nodeplace;
if (node == ((node_t *) 0) ) break;
*stack_ptr++ = nodeplace; stack_count++;
if (key < node->address)
nodeplace = &node->left;
else
nodeplace = &node->right;
}
new_node->left = ((node_t *) 0) ;
new_node->right = ((node_t *) 0) ;
new_node->height = 1;
*nodeplace = new_node;
rebalance(stack_ptr,stack_count);
return tree;
}
static node_t* delete (node_t* node_to_delete, node_t* tree)
{
unsigned long key = node_to_delete->address;
node_t** nodeplace = &tree;
node_t** stack[41 ];
unsigned int stack_count = 0;
node_t*** stack_ptr = &stack[0];
for (;;) {
node_t* node = *nodeplace;
if (node == ((node_t *) 0) ) return tree;
*stack_ptr++ = nodeplace; stack_count++;
if (key == node->address) {
if (node != node_to_delete)
abort();
break;
}
if (key < node->address)
nodeplace = &node->left;
else
nodeplace = &node->right;
}
{
node_t** nodeplace_to_delete = nodeplace;
if (node_to_delete->left == ((node_t *) 0) ) {
*nodeplace_to_delete = node_to_delete->right;
stack_ptr--; stack_count--;
} else {
node_t*** stack_ptr_to_delete = stack_ptr;
node_t** nodeplace = &node_to_delete->left;
node_t* node;
for (;;) {
node = *nodeplace;
if (node->right == ((node_t *) 0) ) break;
*stack_ptr++ = nodeplace; stack_count++;
nodeplace = &node->right;
}
*nodeplace = node->left;
node->left = node_to_delete->left;
node->right = node_to_delete->right;
node->height = node_to_delete->height;
*nodeplace_to_delete = node;
*stack_ptr_to_delete = &node->left;
}
}
rebalance(stack_ptr,stack_count);
return tree;
}
void sigsegv_init (sigsegv_dispatcher* dispatcher)
{
dispatcher->tree = ((node_t *) 0) ;
}
void* sigsegv_register (sigsegv_dispatcher* dispatcher,
void* address, unsigned long len,
sigsegv_area_handler_t handler, void* handler_arg)
{
if (len == 0)
return __null ;
else {
node_t* new_node = (node_t*) malloc(sizeof(node_t));
new_node->address = (unsigned long) address;
new_node->len = len;
new_node->handler = handler;
new_node->handler_arg = handler_arg;
dispatcher->tree = insert(new_node,(node_t*)(dispatcher->tree));
return new_node;
}
}
void sigsegv_unregister (sigsegv_dispatcher* dispatcher, void* ticket)
{
if (ticket != __null ) {
node_t* node_to_delete = (node_t*)ticket;
dispatcher->tree = delete(node_to_delete,(node_t*)(dispatcher->tree));
free(node_to_delete);
}
}
int sigsegv_dispatch (sigsegv_dispatcher* dispatcher, void* fault_address)
{
unsigned long key = (unsigned long) fault_address;
node_t* tree = (node_t*)(dispatcher->tree);
for (;;) {
if (tree == ((node_t *) 0) ) return 0;
if (key < tree->address)
tree = tree->left;
else if (key - tree->address >= tree->len)
tree = tree->right;
else
break;
}
return (*tree->handler)(fault_address,tree->handler_arg);
}
==============================================================================
Regards,
Bruno
----------------------------------------------------------------------------
Bruno Haible email: <haible@ilog.fr>
ILOG S.A. tel: +33 1 4908 3585
9, rue de Verdun - BP 85 fax: +33 1 4908 3510
94253 Gentilly Cedex url: http://www.ilog.fr/
France running Sparc-Linux-BSD-GNU-X11-KDE
More information about the Gcc-bugs
mailing list