This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gcc 3.0.4 miscompiles cppexp.c (was Re: Mainline fails to build)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]