[gnu.gcc.bug] GCC bug in cc1 - got fatal signal 4

jmberkley@watnext.waterloo.edu ("J. Michael Berkley") (01/09/89)

I think that I may have found a bug with gcc's optimizer.  I'll keep
this short (but hopefully complete) to save you some time.

Mike Berkley, University of Waterloo
*******************************************************
* jmberkley@watnext.uwaterloo.ca                      *
*                                                     *
* Bitnet:      jmberkley@water.bitnet                 *
* CSNet:       jmberkley@watnext.waterloo.edu         *
* uucp:        {utai,uunet}!watmath!watnext!jmberkley *
*******************************************************


The bug ONLY occurs when I use the -O option.

I am running version:
---------------------------------------------------------------------------
    [uw/server:37] gcc -v 
    gcc version 1.30              
---------------------------------------------------------------------------


This is the message from the compilation:
---------------------------------------------------------------------------
    cd /u/jmberkley/uw/server/
    gcc -I../h -O -c uw_opt2.c
    gcc: Program cc1 got fatal signal 4.
    Compilation exited abnormally with code 1 at Sun Jan  8 22:08:20
---------------------------------------------------------------------------


The following is the output from "cc -E" (I couldn't use gcc -E).
I've deleted the extra blank lines for your convenience.
---------------------------------------------------------------------------

# 1 "uw_opt2.c"

# 1 "/usr/include/sys/types.h"

typedef	unsigned char	u_char;
typedef	unsigned short	u_short;
typedef	unsigned int	u_int;
typedef	unsigned int	uint;		
typedef	unsigned long	u_long;
typedef	unsigned short	ushort;		

typedef	struct	_physadr { int r[1]; } *physadr;
typedef	struct	label_t	{
	int	val[14];
} label_t;

typedef	struct	_quad { long val[2]; } quad;
typedef	long	daddr_t;
typedef	char *	caddr_t;
typedef	u_long	ino_t;
typedef u_long	gno_t;
typedef short	cnt_t;			
typedef	long	swblk_t;
typedef	int	size_t;
typedef	int	time_t;
typedef	short	dev_t;
typedef	int	off_t;
typedef long	paddr_t;		
typedef long	key_t;			

typedef	struct	fd_set { int fds_bits[1]; } fd_set;

# 10 "uw_opt2.c"

# 1 "../h/uw_opt.h"

typedef unsigned int woptcmd_t;		

typedef unsigned int woption_t;		

typedef unsigned woptarg_t;		

typedef long woptbmask_t;		

struct woptdefn {
	woptbmask_t	wod_pending;	
	woptbmask_t	wod_inquire;	
	woptbmask_t	wod_do;		
	woptbmask_t	wod_dont;	
	woptbmask_t	wod_askrpt;	
	struct woptlst {
		woptarg_t	*wol_argdefn;	
		char		*(*wol_get)();	
		void		(*wol_set)();	
		void		(*wol_ext)();	
	}		wod_optlst[31		+1];
};

union optvalue {
	unsigned char	ov_udata1;
	unsigned char	ov_udata2;
	unsigned char	ov_udata6;
	unsigned short	ov_udata12;
	struct {
		unsigned short	v,h;
	}		ov_point;
	char		ov_string[256];
};

struct netadj {
	short		(*na_short)();
	long		(*na_long)();
	unsigned short	(*na_ushort)();
	unsigned long	(*na_ulong)();
};

# 12 "uw_opt2.c"

int calloptscan;			

opt_new(wod, generic, unique)
register struct woptdefn *wod, *generic, *unique;
{
	register int n, mask;

	mask = (1<<(7		+1))-1;
	if (unique) {
		wod->wod_askrpt = unique->wod_askrpt & ~mask;
		wod->wod_pending = unique->wod_pending & ~mask;
		for (n=7		+1; n <= 31		; n++)
			wod->wod_optlst[n] = unique->wod_optlst[n];
	} else {
		wod->wod_askrpt = 0;
		wod->wod_pending = 0;
		for (n=7		+1; n <= 31		; n++)
			wod->wod_optlst[n].wol_argdefn = (woptarg_t *)0;
	}
	if (generic) {
		wod->wod_askrpt |= generic->wod_askrpt & mask;
		wod->wod_pending |= generic->wod_pending & mask;
		for (n=1; n <= 7		; n++)
			wod->wod_optlst[n] = generic->wod_optlst[n];
	} else {
		for (n=1; n <= 7		; n++)
			wod->wod_optlst[n].wol_argdefn = (woptarg_t *)0;
	}
	wod->wod_do = wod->wod_askrpt;
	wod->wod_dont = 0;
	wod->wod_inquire = 0;
	calloptscan = 1;
}