diff options
author | Tom Tromey <tromey@redhat.com> | 2008-05-06 17:15:07 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2008-05-06 17:15:07 +0000 |
commit | 71c10038d1739414c587d2d88cd858b213bd1453 (patch) | |
tree | 9b75142790c70534d0c2159f221893eb16ef3402 /libcpp/expr.c | |
parent | 3c3f4265021e8940d6a57234b7f70b0dbbc05b3a (diff) | |
download | gcc-71c10038d1739414c587d2d88cd858b213bd1453.zip gcc-71c10038d1739414c587d2d88cd858b213bd1453.tar.gz gcc-71c10038d1739414c587d2d88cd858b213bd1453.tar.bz2 |
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) <QUERY, COMMA>: Set precedence to 4.
(reduce) <case CPP_QUERY>: Special case CPP_COMMA and CPP_COLON.
From-SVN: r134989
Diffstat (limited to 'libcpp/expr.c')
-rw-r--r-- | libcpp/expr.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/libcpp/expr.c b/libcpp/expr.c index 00149b2..af0e259 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; |