[gnu.g++.bug] -finline-functions crashes G++1.35

tom@tnosoes.UUCP (Tom Vijlbrief) (06/29/89)

Sun 3:
======================
g++ -c bug.c -finline-functions -v
g++ version 1.35.0
 /usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 bug.c /tmp/cca08505.cpp
GNU CPP version 1.35
 /usr/local/lib/gcc-cc1plus /tmp/cca08505.cpp -quiet -dumpbase bug.c -finline-functions -noreg -version -o /tmp/cca08505.s
GNU C++ version 1.35.0 (68k, MIT syntax) compiled by GNU C version 1.35.
In function void DefaultErrorHandler (int, enum bool, char *, char *):
bug.c:62: warning: implicit declaration of function `Abort'
In function void Error (char *, char *, ...):
bug.c:92: Segmentation violation
========Bug.c:============================
#include <stream.h>
#include <stdarg.h>


#ifndef Error_First
#define Error_First


static const int cWarning  =   0,
	  cError    =   1000,
	  cSysError =   2000,
	  cFatal    =   3000;
	  
typedef void (*ErrorHandlerFunc)(int level, bool abort, char *location, char *msg);
 
extern void ErrorHandler(int level, char *location, va_list va);
extern void Error(char *location, char *msgfmt, ...);
extern void SysError(char *location, char *msgfmt, ...);
extern void Warning(char *location, char *msgfmt, ...);
extern void Fatal(char *location, char *msgfmt, ...);
extern void AbstractMethod(char*);

extern void DefaultErrorHandler(int level, bool abort, char *location, char *msg);

ErrorHandlerFunc SetErrorHandler(ErrorHandlerFunc newhandler);
ErrorHandlerFunc GetErrorHandler();
int SetAbortLevel(int newlevel);
int GetAbortLevel();
int SetIgnoreLevel(int newlevel);
int GetIgnoreLevel();

extern void _exit(int code);

#endif Error_First
int gDebug= 0;

void AbstractMethod(char *s)
{
    Warning(s, "abstract method called");
}

static int abortlevel= cSysError;
static int ignorelevel= cError;

void DefaultErrorHandler(int level, bool abort, char *location, char *msg)
{
    char *type= "Warning";
    if (level < ignorelevel)
	return;
    if (level >= cFatal)
	type= "Fatal";
    else if (level >= cSysError)
	type= "SysError";
    else if (level >= cError)
	type= "Error";
	  
    fprintf(stderr, "%s in <%s>: %s\n", type, location, msg);
    fflush(stderr);
    if (abort) {
	fprintf(stderr, "aborting\n");
	fflush(stderr);
	Abort();
    }
}

static ErrorHandlerFunc errorhandler= DefaultErrorHandler;

void ErrorHandler(int level, char *location, va_list ap)
{
    char buf[1024], *syserror= 0, buf3[1024], *bp;
    
    char *fmt= va_arg(ap, char*);
    vsprintf(buf, fmt, ap);
    if (level >= cSysError && level < cFatal) {
	if (errno < 0 || errno >= sys_nerr)
	    syserror= form("errno out of range %d", errno);
	else
	    syserror= sys_errlist[errno];
    }
    if (syserror) {
	sprintf(buf3, "%s (%s)", buf, syserror);
	bp= buf3;
    } else
	bp= buf;
    errorhandler(level, level >= abortlevel, location, bp);
}

void Error(char *location, char*, ...)
{
    va_list ap;
    va_start(ap, location);
    ErrorHandler(cError, location, ap);
    va_end(ap);
}

void SysError(char *location,  char*, ...)
{
    va_list ap;
    va_start(ap, location);
    ErrorHandler(cSysError, location, ap);
    va_end(ap);
}

void Warning(char *location, char*, ...)
{
    va_list ap;
    va_start(ap, location);
    ErrorHandler(cWarning, location, ap);
    va_end(ap);
}

void Fatal(char *location, char*, ...)
{
    va_list ap;
    va_start(ap, location);
    ErrorHandler(cFatal, location, ap);
    va_end(ap);
}
 
ErrorHandlerFunc SetErrorHandler(ErrorHandlerFunc newhandler)
{
    ErrorHandlerFunc oldhandler= errorhandler;
    errorhandler= newhandler;
    return oldhandler;
}

ErrorHandlerFunc GetErrorHandler()
{
    return errorhandler;
}

int SetAbortLevel(int newlevel)
{
    int oldlevel= abortlevel;
    abortlevel= newlevel;
    return oldlevel;
}

int GetAbortLevel()
{
    return abortlevel;
}

int SetIgnoreLevel(int newlevel)
{
    int oldlevel= abortlevel;
    ignorelevel= newlevel;
    return oldlevel;
}

int GetIgnoreLevel()
{
    return ignorelevel; 
}
========================
===============================================================================
Tom Vijlbrief
TNO Institute for Perception
P.O. Box 23				Phone: +31 34 63 562 11
3769 ZG  Soesterberg			E-mail: tnosoes!tom@mcvax.cwi.nl
The Netherlands				    or:	uunet!mcvax!tnosoes!tom
===============================================================================