This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
gcc 3.0.4 miscompiles cppexp.c (was Re: Mainline fails to build)
- From: Jason Merrill <jason at redhat dot com>
- To: Toon Moene <toon at moene dot indiv dot nluug dot nl>
- Cc: Janis Johnson <janis187 at us dot ibm dot com>, magfr at lysator dot liu dot se,gcc at gcc dot gnu dot org, Jason Merrill <jason at redhat dot com>
- Date: Thu, 06 Jun 2002 19:05:23 -0400
- Subject: gcc 3.0.4 miscompiles cppexp.c (was Re: Mainline fails to build)
- References: <20020531052306.GA13289@jenny.home><20020531090632.A1480@us.ibm.com><3CF7D07E.E375B6A6@moene.indiv.nluug.nl><3CF7D41E.6DA22863@moene.indiv.nluug.nl>
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