[gnu.g++.bug] BUG in G++ 1.35.0/sun3

rfg@MCC.COM (Ron Guilmette) (06/26/89)

The following code fails to elicit an error on line 31 from
G++ 1.35.0/sun3.  Also, the error messages that *are* issued
are sometimes misleading because this code (obviously) involves no
"variable-size" objects.

----------------------------------------------------------------------------
// Check that a constant integer expression (which may include declared
// constant objects) cannot be used in contexts which require a static
// integer constant expression if any of the declared integer constant
// objects only have tenative declarations, and not value definitions.
//
// Cases:
//	array length specifications
//	bitfield length specifications

extern const int k2;		// tenative declaration
const int k4;			// tenative declaration
const int k8;			// tenative declaration

char global_array[((k2+7)*k4)/(k8-1)];			// ERROR

struct base
{
	char member_array[((k2+7)*k4)/(k8-1)];		// ERROR
	unsigned int	bit_field_1:k2;			// ERROR
	unsigned int	bit_field_2:k2+k4;		// ERROR
	unsigned int	bit_field_3:7+k4;		// ERROR
	unsigned int	bit_field_4:7+(k4+k2);		// ERROR
	unsigned int	bit_field_5:(3+k4);		// ERROR
};

base global_base_object;

int main ()
{
	base local_base_object;
	char local_array[((k2+7)*k4)/(k8-1)];		// ERROR - missed

	local_array[0] = 'x';
	local_base_object.bit_field_5 = 0x7f;
	return 0;
}

const int k4 = 4;
const int k8 = 8;
----------------------------------------------------------------------------
g++-1.35.0.0 -g -Wall -Wwrite-strings -v -S b077.C
g++ version 1.35.0
 /usr/local/src/lib/sun3/g++-1.35.0.0/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -Wall -D__HAVE_68881__ -Dmc68020 b077.C /tmp/cca20716.cpp
GNU CPP version 1.35
 /usr/local/src/lib/sun3/g++-1.35.0.0/gcc-cc1plus /tmp/cca20716.cpp -quiet -dumpbase b077.C -Wall -Wwrite-strings -noreg -version -G -o b077.s
GNU C++ version 1.35.0 (68k, MIT syntax) compiled by GNU C version 1.35.
b077.C:14: variable-size type declared outside of any function
b077.C:18: variable-size type declared outside of any function
b077.C:19: structure field `bit_field_1' width not an integer constant
b077.C:20: structure field `bit_field_2' width not an integer constant
b077.C:21: structure field `bit_field_3' width not an integer constant
b077.C:22: structure field `bit_field_4' width not an integer constant
b077.C:23: structure field `bit_field_5' width not an integer constant


b077 had missed error(s) as follows:
	  31: 	char local_array[((k2+7)*k4)/(k8-1)];		// ERROR

rfg@MCC.COM (Ron Guilmette) (06/26/89)

The following code fails to elicit an error message on line 9
from G++ 1.35.0/sun3.

----------------------------------------------------------------------
// Check that if a constant object is declared as external, it may not
// also be initialized to a value in the same declarative statement.
//
// Cases:
//	file scope
//	function local scope
//	block scope

extern const int global_int_const = 11;			// ERROR

int j;
void fake (int i) { j = i; }

int main ()
{
	extern const int local_int_const = 33;		// ERROR

	fake (local_int_const);
	if (j)
	{
		extern const int block_local = 55;	// ERROR

		fake (block_local);
	}
	fake (global_int_const);
	return 0;
}
-------------------------------------------------------------------------
g++-1.35.0.0 -g -Wall -Wwrite-strings -v -S b079.C
g++ version 1.35.0
 /usr/local/src/lib/sun3/g++-1.35.0.0/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -Wall -D__HAVE_68881__ -Dmc68020 b079.C /tmp/cca20766.cpp
GNU CPP version 1.35
 /usr/local/src/lib/sun3/g++-1.35.0.0/gcc-cc1plus /tmp/cca20766.cpp -quiet -dumpbase b079.C -Wall -Wwrite-strings -noreg -version -G -o b079.s
GNU C++ version 1.35.0 (68k, MIT syntax) compiled by GNU C version 1.35.
In function int main ():
b079.C:16: `local_int_const' has both `extern' and initializer
b079.C:21: `block_local' has both `extern' and initializer


b079 had missed error(s) as follows:
	   9: extern const int global_int_const = 11;			// ERROR