gcc 3.0.4 miscompiles cppexp.c (was Re: Mainline fails to build)
Jason Merrill
jason@redhat.com
Thu Jun 6 16:25:00 GMT 2002
Here's a small testcase illustrating the bug.
typedef struct cpp_num cpp_num;
struct cpp_num
{
long high;
long low;
char overflow;
};
#define num_eq(num1, num2) (num1.low == num2.low && num1.high == num2.high)
static cpp_num
num_equality_op (lhs, rhs)
cpp_num lhs, rhs;
{
lhs.low = num_eq (lhs, rhs);
lhs.high = 0;
lhs.overflow = 0;
return lhs;
}
int main()
{
cpp_num a = { 1, 2 };
cpp_num b = { 3, 4 };
cpp_num result = num_equality_op (a, b);
if (result.low)
return 1;
result = num_equality_op (a, a);
if (!result.low)
return 2;
return 0;
}
gcc 3.1 does not have this bug; neither do 2.95 or Red Hat 2.96. Using a
temporary variable to store the result of num_eq works around the bug; I'll
check in such a patch soon.
Jason
More information about the Gcc
mailing list