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
This commit is contained in:
Tom Tromey 2008-05-06 17:15:07 +00:00 committed by Tom Tromey
parent 3c3f426502
commit 71c10038d1
6 changed files with 44 additions and 9 deletions

View file

@ -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;