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,3 +1,11 @@
2008-05-06 Tom Tromey <tromey@redhat.com>
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 <burnus@net-b.de>
PR fortran/36117

View File

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

View File

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

View File

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

View File

@ -1,3 +1,9 @@
2008-05-06 Tom Tromey <tromey@redhat.com>
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.
2008-05-04 David S. Miller <davem@davemloft.net>
* configure.ac (sparc*-*-*): Always set need_64bit_hwint to yes.

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;