[gnu.g++.bug] BIG in G++ 1.35-.0

rfg@MCC.COM (Ron Guilmette) (05/04/89)

In the following source file, errors are not properly flagged for attempts
to give default arguments within (binary) operator declaration formal argument
lists.

b063 had missed error(s) as follows:
	11: int operator + (st st1, st st2 = st_object);		// ERROR
	12: int operator - (st st1, st st2 = st_object);		// ERROR
	13: int operator & (st st1, st st2 = st_object);		// ERROR
	14: int operator * (st st1, st st2 = st_object);		// ERROR
	16: int operator / (st st1, st st2 = st_object);		// ERROR
	17: int operator % (st st1, st st2 = st_object);		// ERROR
	18: int operator ^ (st st1, st st2 = st_object);		// ERROR
	19: int operator | (st st1, st st2 = st_object);		// ERROR
	20: int operator >> (st st1, st st2 = st_object);		// ERROR
	21: int operator << (st st1, st st2 = st_object);		// ERROR
	22: int operator && (st st1, st st2 = st_object);		// ERROR
	23: int operator || (st st1, st st2 = st_object);		// ERROR
	26: int operator == (st st1, st st2 = st_object);		// ERROR
	27: int operator != (st st1, st st2 = st_object);		// ERROR
	28: int operator < (st st1, st st2 = st_object);		// ERROR
	29: int operator > (st st1, st st2 = st_object);		// ERROR
	30: int operator <= (st st1, st st2 = st_object);		// ERROR
	31: int operator >= (st st1, st st2 = st_object);		// ERROR
	33: int operator = (st st1, st st2 = st_object);		// ERROR
	34: int operator += (st st1, st st2 = st_object);		// ERROR
	35: int operator -= (st st1, st st2 = st_object);		// ERROR
	36: int operator *= (st st1, st st2 = st_object);		// ERROR
	37: int operator /= (st st1, st st2 = st_object);		// ERROR
	38: int operator %= (st st1, st st2 = st_object);		// ERROR
	39: int operator ^= (st st1, st st2 = st_object);		// ERROR
	40: int operator &= (st st1, st st2 = st_object);		// ERROR
	41: int operator |= (st st1, st st2 = st_object);		// ERROR
	42: int operator >>= (st st1, st st2 = st_object);		// ERROR
	43: int operator <<= (st st1, st st2 = st_object);		// ERROR
	45: int operator [] (st st1, st st2 = st_object);		// ERROR
	47: int operator + (st st1 = st_object, st st2 = st_object);		// ERROR
	48: int operator - (st st1 = st_object, st st2 = st_object);		// ERROR
	49: int operator & (st st1 = st_object, st st2 = st_object);		// ERROR
	50: int operator * (st st1 = st_object, st st2 = st_object);		// ERROR
	52: int operator / (st st1 = st_object, st st2 = st_object);		// ERROR
	53: int operator % (st st1 = st_object, st st2 = st_object);		// ERROR
	54: int operator ^ (st st1 = st_object, st st2 = st_object);		// ERROR
	55: int operator | (st st1 = st_object, st st2 = st_object);		// ERROR
	56: int operator >> (st st1 = st_object, st st2 = st_object);		// ERROR
	57: int operator << (st st1 = st_object, st st2 = st_object);		// ERROR
	58: int operator && (st st1 = st_object, st st2 = st_object);		// ERROR
	59: int operator || (st st1 = st_object, st st2 = st_object);		// ERROR
	62: int operator == (st st1 = st_object, st st2 = st_object);		// ERROR
	63: int operator != (st st1 = st_object, st st2 = st_object);		// ERROR
	64: int operator < (st st1 = st_object, st st2 = st_object);		// ERROR
	65: int operator > (st st1 = st_object, st st2 = st_object);		// ERROR
	66: int operator <= (st st1 = st_object, st st2 = st_object);		// ERROR
	67: int operator >= (st st1 = st_object, st st2 = st_object);		// ERROR
	69: int operator = (st st1 = st_object, st st2 = st_object);		// ERROR
	70: int operator += (st st1 = st_object, st st2 = st_object);		// ERROR
	71: int operator -= (st st1 = st_object, st st2 = st_object);		// ERROR
	72: int operator *= (st st1 = st_object, st st2 = st_object);		// ERROR
	73: int operator /= (st st1 = st_object, st st2 = st_object);		// ERROR
	74: int operator %= (st st1 = st_object, st st2 = st_object);		// ERROR
	75: int operator ^= (st st1 = st_object, st st2 = st_object);		// ERROR
	76: int operator &= (st st1 = st_object, st st2 = st_object);		// ERROR
	77: int operator |= (st st1 = st_object, st st2 = st_object);		// ERROR
	78: int operator >>= (st st1 = st_object, st st2 = st_object);		// ERROR
	79: int operator <<= (st st1 = st_object, st st2 = st_object);		// ERROR
	81: int operator [] (st st1 = st_object, st st2 = st_object);		// ERROR
	84: 	int operator + (st st2 = st_object);		// ERROR
	85: 	int operator - (st st2 = st_object);		// ERROR
	86: 	int operator & (st st2 = st_object);		// ERROR
	87: 	int operator * (st st2 = st_object);		// ERROR
	89: 	int operator / (st st2 = st_object);		// ERROR
	90: 	int operator % (st st2 = st_object);		// ERROR
	91: 	int operator ^ (st st2 = st_object);		// ERROR
	92: 	int operator | (st st2 = st_object);		// ERROR
	93: 	int operator >> (st st2 = st_object);		// ERROR
	94: 	int operator << (st st2 = st_object);		// ERROR
	95: 	int operator && (st st2 = st_object);		// ERROR
	96: 	int operator || (st st2 = st_object);		// ERROR
	99: 	int operator == (st st2 = st_object);		// ERROR
	100: 	int operator != (st st2 = st_object);		// ERROR
	101: 	int operator < (st st2 = st_object);		// ERROR
	102: 	int operator > (st st2 = st_object);		// ERROR
	103: 	int operator <= (st st2 = st_object);		// ERROR
	104: 	int operator >= (st st2 = st_object);		// ERROR
	106: 	int operator = (st st2 = st_object);		// ERROR
	107: 	int operator += (st st2 = st_object);		// ERROR
	108: 	int operator -= (st st2 = st_object);		// ERROR
	109: 	int operator *= (st st2 = st_object);		// ERROR
	110: 	int operator /= (st st2 = st_object);		// ERROR
	111: 	int operator %= (st st2 = st_object);		// ERROR
	112: 	int operator ^= (st st2 = st_object);		// ERROR
	113: 	int operator &= (st st2 = st_object);		// ERROR
	114: 	int operator |= (st st2 = st_object);		// ERROR
	115: 	int operator >>= (st st2 = st_object);		// ERROR
	116: 	int operator <<= (st st2 = st_object);		// ERROR
	118: 	int operator [] (st st2 = st_object);		// ERROR
b063: FAILED

---------------------------------------------------------------------------
// Check that it is illegal to declare binary operators with
// either one or two formal parameters which have default values.
// In particular, check the subscripting operator [].

struct st {
	int member;
};

st st_object;

int operator + (st st1, st st2 = st_object);		// ERROR
int operator - (st st1, st st2 = st_object);		// ERROR
int operator & (st st1, st st2 = st_object);		// ERROR
int operator * (st st1, st st2 = st_object);		// ERROR

int operator / (st st1, st st2 = st_object);		// ERROR
int operator % (st st1, st st2 = st_object);		// ERROR
int operator ^ (st st1, st st2 = st_object);		// ERROR
int operator | (st st1, st st2 = st_object);		// ERROR
int operator >> (st st1, st st2 = st_object);		// ERROR
int operator << (st st1, st st2 = st_object);		// ERROR
int operator && (st st1, st st2 = st_object);		// ERROR
int operator || (st st1, st st2 = st_object);		// ERROR

// comparison operators (all 6)
int operator == (st st1, st st2 = st_object);		// ERROR
int operator != (st st1, st st2 = st_object);		// ERROR
int operator < (st st1, st st2 = st_object);		// ERROR
int operator > (st st1, st st2 = st_object);		// ERROR
int operator <= (st st1, st st2 = st_object);		// ERROR
int operator >= (st st1, st st2 = st_object);		// ERROR

int operator = (st st1, st st2 = st_object);		// ERROR
int operator += (st st1, st st2 = st_object);		// ERROR
int operator -= (st st1, st st2 = st_object);		// ERROR
int operator *= (st st1, st st2 = st_object);		// ERROR
int operator /= (st st1, st st2 = st_object);		// ERROR
int operator %= (st st1, st st2 = st_object);		// ERROR
int operator ^= (st st1, st st2 = st_object);		// ERROR
int operator &= (st st1, st st2 = st_object);		// ERROR
int operator |= (st st1, st st2 = st_object);		// ERROR
int operator >>= (st st1, st st2 = st_object);		// ERROR
int operator <<= (st st1, st st2 = st_object);		// ERROR

int operator [] (st st1, st st2 = st_object);		// ERROR

int operator + (st st1 = st_object, st st2 = st_object);		// ERROR
int operator - (st st1 = st_object, st st2 = st_object);		// ERROR
int operator & (st st1 = st_object, st st2 = st_object);		// ERROR
int operator * (st st1 = st_object, st st2 = st_object);		// ERROR

int operator / (st st1 = st_object, st st2 = st_object);		// ERROR
int operator % (st st1 = st_object, st st2 = st_object);		// ERROR
int operator ^ (st st1 = st_object, st st2 = st_object);		// ERROR
int operator | (st st1 = st_object, st st2 = st_object);		// ERROR
int operator >> (st st1 = st_object, st st2 = st_object);		// ERROR
int operator << (st st1 = st_object, st st2 = st_object);		// ERROR
int operator && (st st1 = st_object, st st2 = st_object);		// ERROR
int operator || (st st1 = st_object, st st2 = st_object);		// ERROR

// comparison operators (all 6)
int operator == (st st1 = st_object, st st2 = st_object);		// ERROR
int operator != (st st1 = st_object, st st2 = st_object);		// ERROR
int operator < (st st1 = st_object, st st2 = st_object);		// ERROR
int operator > (st st1 = st_object, st st2 = st_object);		// ERROR
int operator <= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator >= (st st1 = st_object, st st2 = st_object);		// ERROR

int operator = (st st1 = st_object, st st2 = st_object);		// ERROR
int operator += (st st1 = st_object, st st2 = st_object);		// ERROR
int operator -= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator *= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator /= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator %= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator ^= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator &= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator |= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator >>= (st st1 = st_object, st st2 = st_object);		// ERROR
int operator <<= (st st1 = st_object, st st2 = st_object);		// ERROR

int operator [] (st st1 = st_object, st st2 = st_object);		// ERROR

struct base {
	int operator + (st st2 = st_object);		// ERROR
	int operator - (st st2 = st_object);		// ERROR
	int operator & (st st2 = st_object);		// ERROR
	int operator * (st st2 = st_object);		// ERROR
	
	int operator / (st st2 = st_object);		// ERROR
	int operator % (st st2 = st_object);		// ERROR
	int operator ^ (st st2 = st_object);		// ERROR
	int operator | (st st2 = st_object);		// ERROR
	int operator >> (st st2 = st_object);		// ERROR
	int operator << (st st2 = st_object);		// ERROR
	int operator && (st st2 = st_object);		// ERROR
	int operator || (st st2 = st_object);		// ERROR
	
	// comparison operators (all 6)
	int operator == (st st2 = st_object);		// ERROR
	int operator != (st st2 = st_object);		// ERROR
	int operator < (st st2 = st_object);		// ERROR
	int operator > (st st2 = st_object);		// ERROR
	int operator <= (st st2 = st_object);		// ERROR
	int operator >= (st st2 = st_object);		// ERROR
	
	int operator = (st st2 = st_object);		// ERROR
	int operator += (st st2 = st_object);		// ERROR
	int operator -= (st st2 = st_object);		// ERROR
	int operator *= (st st2 = st_object);		// ERROR
	int operator /= (st st2 = st_object);		// ERROR
	int operator %= (st st2 = st_object);		// ERROR
	int operator ^= (st st2 = st_object);		// ERROR
	int operator &= (st st2 = st_object);		// ERROR
	int operator |= (st st2 = st_object);		// ERROR
	int operator >>= (st st2 = st_object);		// ERROR
	int operator <<= (st st2 = st_object);		// ERROR
	
	int operator [] (st st2 = st_object);		// ERROR
};
---------------------------------------------------------------------------
/usr/local/src/src/g++/build/sun3/1.35-.0-.0/g++ -B/usr/local/src/src/g++/build/sun3/1.35-.0-.0/ -Wall -Wwrite-strings -g -S -v b063.C
g++ version 1.35.0-.0
 /usr/local/src/src/g++/build/sun3/1.35-.0-.0/cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -Wall -D__HAVE_68881__ -Dmc68020 b063.C /tmp/cca22995.cpp
GNU CPP version 1.35.0-.0
 /usr/local/src/src/g++/build/sun3/1.35-.0-.0/c++ /tmp/cca22995.cpp -quiet -dumpbase b063.C -Wall -Wwrite-strings -noreg -version -G -o b063.s
GNU C++ version 1.35.0-.0 (68k, MIT syntax) compiled by GNU C version 1.34.1.
b063.C:81: warning: `int operator [] (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:79: warning: `int operator <<= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:78: warning: `int operator >>= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:77: warning: `int operator |= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:76: warning: `int operator &= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:75: warning: `int operator ^= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:74: warning: `int operator %= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:73: warning: `int operator /= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:72: warning: `int operator *= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:71: warning: `int operator -= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:70: warning: `int operator += (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:69: warning: `int operator = (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:67: warning: `int operator >= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:66: warning: `int operator <= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:65: warning: `int operator > (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:64: warning: `int operator < (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:63: warning: `int operator != (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:62: warning: `int operator == (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:59: warning: `int operator || (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:58: warning: `int operator && (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:57: warning: `int operator << (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:56: warning: `int operator >> (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:55: warning: `int operator | (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:54: warning: `int operator ^ (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:53: warning: `int operator % (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:52: warning: `int operator / (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:50: warning: `int operator * (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:49: warning: `int operator & (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:48: warning: `int operator - (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:47: warning: `int operator + (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:81: warning: `int operator [] (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:79: warning: `int operator <<= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:78: warning: `int operator >>= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:77: warning: `int operator |= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:76: warning: `int operator &= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:75: warning: `int operator ^= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:74: warning: `int operator %= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:73: warning: `int operator /= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:72: warning: `int operator *= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:71: warning: `int operator -= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:70: warning: `int operator += (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:69: warning: `int operator = (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:67: warning: `int operator >= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:66: warning: `int operator <= (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:65: warning: `int operator > (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:64: warning: `int operator < (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:63: warning: `int operator != (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:62: warning: `int operator == (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:59: warning: `int operator || (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:58: warning: `int operator && (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:57: warning: `int operator << (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:56: warning: `int operator >> (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:55: warning: `int operator | (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:54: warning: `int operator ^ (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:53: warning: `int operator % (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:52: warning: `int operator / (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:50: warning: `int operator * (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:49: warning: `int operator & (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:48: warning: `int operator - (struct st (=  st_object ), struct st (=  st_object ))' defined but not used
b063.C:47: warning: `int operator + (struct st (=  st_object ), struct st (=  st_object ))' defined but not used