Commit 71c10038 by Tom Tromey Committed by Tom Tromey

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
parent 3c3f4265
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> 2008-05-06 Tobias Burnus <burnus@net-b.de>
PR fortran/36117 PR fortran/36117
/* Copyright (C) 2000 Free Software Foundation, Inc. */ /* Copyright (C) 2000, 2008 Free Software Foundation, Inc. */
/* Test the full range of preprocessor operator precedence. Each /* Test the full range of preprocessor operator precedence. Each
operator is tested with one of immediately higher precedence to operator is tested with one of immediately higher precedence to
...@@ -19,11 +19,6 @@ ...@@ -19,11 +19,6 @@
#else #else
#endif #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. */ /* : strictly higher than ?. This would give a syntax error otherwise. */
#if 0 ? 0 : 1 ? 1 : 1 #if 0 ? 0 : 1 ? 1 : 1
#endif #endif
......
/* Copyright (C) 2008 Free Software Foundation, Inc. */
/* Another test of operator precedence. */
/* { dg-do preprocess } */
/* { dg-options "" } */
#if 1 ? 2 : 3 , 0
#error
#endif
/* 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
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> 2008-05-04 David S. Miller <davem@davemloft.net>
* configure.ac (sparc*-*-*): Always set need_64bit_hwint to yes. * configure.ac (sparc*-*-*): Always set need_64bit_hwint to yes.
......
/* Parse C expressions for cpplib. /* Parse C expressions for cpplib.
Copyright (C) 1987, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 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. Contributed by Per Bothner, 1994.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
...@@ -809,9 +809,11 @@ static const struct cpp_operator ...@@ -809,9 +809,11 @@ static const struct cpp_operator
/* COMPL */ {16, NO_L_OPERAND}, /* COMPL */ {16, NO_L_OPERAND},
/* AND_AND */ {6, LEFT_ASSOC}, /* AND_AND */ {6, LEFT_ASSOC},
/* OR_OR */ {5, 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}, /* COLON */ {4, LEFT_ASSOC | CHECK_PROMOTION},
/* COMMA */ {2, LEFT_ASSOC}, /* COMMA */ {4, LEFT_ASSOC},
/* OPEN_PAREN */ {1, NO_L_OPERAND}, /* OPEN_PAREN */ {1, NO_L_OPERAND},
/* CLOSE_PAREN */ {0, 0}, /* CLOSE_PAREN */ {0, 0},
/* EOF */ {0, 0}, /* EOF */ {0, 0},
...@@ -1101,6 +1103,9 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op) ...@@ -1101,6 +1103,9 @@ reduce (cpp_reader *pfile, struct op *top, enum cpp_ttype op)
continue; continue;
case CPP_QUERY: 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 ':'"); cpp_error (pfile, CPP_DL_ERROR, "'?' without following ':'");
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment