This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: FYI: PRs preprocessor/35313 and preprocessor/36088


I'm checking this in.

This patch fixes PR preprocessor/35313 and PR preprocessor/36088.
These both have to do with buglets in libcpp's operator precedence
parser.

I removed a test from if-oppr.c since I think it is just wrong.  I
also made a couple new test cases; if-oppr2.c is separate from
if-oppr.c because we need to compile this without options to avoid
errors about an evaluated comma operator.

Bootstrapped and regtested on the compile farm (x86-64).

Tom

gcc/testsuite/ChangeLog:
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.

libcpp/ChangeLog:
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.

Index: gcc/testsuite/gcc.dg/cpp/if-oppr.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/if-oppr.c	(revision 134961)
+++ gcc/testsuite/gcc.dg/cpp/if-oppr.c	(working copy)
@@ -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
Index: gcc/testsuite/gcc.dg/cpp/if-oppr2.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/if-oppr2.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/if-oppr2.c	(revision 0)
@@ -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
Index: gcc/testsuite/gcc.dg/cpp/pr35313.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/pr35313.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/pr35313.c	(revision 0)
@@ -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
Index: libcpp/expr.c
===================================================================
--- libcpp/expr.c	(revision 134961)
+++ libcpp/expr.c	(working copy)
@@ -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 @@
   /* 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 @@
 	  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;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]