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