From: Tom Tromey Date: Tue, 6 May 2008 17:15:07 +0000 (+0000) Subject: PR preprocessor/35313, PR preprocessor/36088: X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=71c10038d1739414c587d2d88cd858b213bd1453;p=gcc.git PR preprocessor/35313, PR preprocessor/36088: gcc/testsuite PR preprocessor/35313, PR preprocessor/36088: * gcc.dg/cpp/pr35313.c: New file. * gcc.dg/cpp/if-oppr.c: Remove test for ',' in a conditional expression. * gcc.dg/cpp/if-oppr2.c: New file. libcpp PR preprocessor/35313, PR preprocessor/36088: * expr.c (optab) : Set precedence to 4. (reduce) : Special case CPP_COMMA and CPP_COLON. From-SVN: r134989 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e5bf09b744e..4aacdf2112b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2008-05-06 Tom Tromey + + PR preprocessor/35313, PR preprocessor/36088: + * gcc.dg/cpp/pr35313.c: New file. + * gcc.dg/cpp/if-oppr.c: Remove test for ',' in a conditional + expression. + * gcc.dg/cpp/if-oppr2.c: New file. + 2008-05-06 Tobias Burnus PR fortran/36117 diff --git a/gcc/testsuite/gcc.dg/cpp/if-oppr.c b/gcc/testsuite/gcc.dg/cpp/if-oppr.c index 9c4910f6a20..a46a815cf99 100644 --- a/gcc/testsuite/gcc.dg/cpp/if-oppr.c +++ b/gcc/testsuite/gcc.dg/cpp/if-oppr.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 Free Software Foundation, Inc. */ +/* Copyright (C) 2000, 2008 Free Software Foundation, Inc. */ /* Test the full range of preprocessor operator precedence. Each operator is tested with one of immediately higher precedence to @@ -19,11 +19,6 @@ #else #endif -/* , not higher than ?. This is not a syntax error if it is. */ -#if 1 ? 0, 1: 1 /* { dg-error "without" "? higher precedence than ," } */ -#error -#endif - /* : strictly higher than ?. This would give a syntax error otherwise. */ #if 0 ? 0 : 1 ? 1 : 1 #endif diff --git a/gcc/testsuite/gcc.dg/cpp/if-oppr2.c b/gcc/testsuite/gcc.dg/cpp/if-oppr2.c new file mode 100644 index 00000000000..bcfe7cca2f0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/if-oppr2.c @@ -0,0 +1,10 @@ +/* Copyright (C) 2008 Free Software Foundation, Inc. */ + +/* Another test of operator precedence. */ + +/* { dg-do preprocess } */ +/* { dg-options "" } */ + +#if 1 ? 2 : 3 , 0 +#error +#endif diff --git a/gcc/testsuite/gcc.dg/cpp/pr35313.c b/gcc/testsuite/gcc.dg/cpp/pr35313.c new file mode 100644 index 00000000000..e12636e0b70 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/pr35313.c @@ -0,0 +1,11 @@ +/* Test two failing cases for libcpp parser. From PRs 35313, 36088*/ +/* { dg-do preprocess } */ +/* { dg-options "-std=c99 -pedantic-errors" } */ + +extern int x; + +#if 0 ? 3,4 : 2 +#endif + +#if 1 ? 0 : 1 ? 1/0 : 1/0 +#endif diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 25fc09dcf77..b86e22e613d 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,9 @@ +2008-05-06 Tom Tromey + + PR preprocessor/35313, PR preprocessor/36088: + * expr.c (optab) : Set precedence to 4. + (reduce) : Special case CPP_COMMA and CPP_COLON. + 2008-05-04 David S. Miller * configure.ac (sparc*-*-*): Always set need_64bit_hwint to yes. diff --git a/libcpp/expr.c b/libcpp/expr.c index 00149b2422d..af0e2590ee4 100644 --- a/libcpp/expr.c +++ b/libcpp/expr.c @@ -1,6 +1,6 @@ /* Parse C expressions for cpplib. Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001, - 2002, 2004 Free Software Foundation. + 2002, 2004, 2008 Free Software Foundation. Contributed by Per Bothner, 1994. This program is free software; you can redistribute it and/or modify it @@ -809,9 +809,11 @@ static const struct cpp_operator /* COMPL */ {16, NO_L_OPERAND}, /* AND_AND */ {6, LEFT_ASSOC}, /* OR_OR */ {5, LEFT_ASSOC}, - /* QUERY */ {3, 0}, + /* Note that QUERY, COLON, and COMMA must have the same precedence. + However, there are some special cases for these in reduce(). */ + /* QUERY */ {4, 0}, /* COLON */ {4, LEFT_ASSOC | CHECK_PROMOTION}, - /* COMMA */ {2, LEFT_ASSOC}, + /* COMMA */ {4, LEFT_ASSOC}, /* OPEN_PAREN */ {1, NO_L_OPERAND}, /* CLOSE_PAREN */ {0, 0}, /* EOF */ {0, 0}, @@ -1101,6 +1103,9 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op) continue; case CPP_QUERY: + /* COMMA and COLON should not reduce a QUERY operator. */ + if (op == CPP_COMMA || op == CPP_COLON) + return top; cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'"); return 0;