[PATCH] Fix error message about invalid token pasting (PR preprocessor/28709)

Jakub Jelinek jakub@redhat.com
Wed Aug 16 17:42:00 GMT 2006


Hi!

When pasting e.g. - ## >> or = ## ==, the error message is wrong.
libcpp first grabs first token from the concatenated lhs and rhs token
spellings (so -> or == in these cases), and after it checks if all
of the temporary buffer has been consumed, if not, issues the error,
but with the token from the previous step on the lhs.
The following patch fixes it by using the spelling of lhs already
stored in the temporary buffer.

Ok for trunk?

2006-08-16  Jakub Jelinek  <jakub@redhat.com>

	PR preprocessor/28709
	* macro.c (paste_tokens): Do error reporting here, use BUF with the
	spelled LHS token as opposed to spelling it again.
	(paste_all_tokens): Don't report errors here, just break on failure.

	* gcc.dg/cpp/paste14.c: New test.

--- libcpp/macro.c.jj	2006-06-09 23:07:54.000000000 +0200
+++ libcpp/macro.c	2006-08-16 17:30:17.000000000 +0200
@@ -430,15 +430,14 @@ stringify_arg (cpp_reader *pfile, macro_
 static bool
 paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs)
 {
-  unsigned char *buf, *end;
+  unsigned char *buf, *end, *lhsend;
   const cpp_token *lhs;
   unsigned int len;
-  bool valid;
 
   lhs = *plhs;
   len = cpp_token_len (lhs) + cpp_token_len (rhs) + 1;
   buf = (unsigned char *) alloca (len);
-  end = cpp_spell_token (pfile, lhs, buf, false);
+  end = lhsend = cpp_spell_token (pfile, lhs, buf, false);
 
   /* Avoid comment headers, since they are still processed in stage 3.
      It is simpler to insert a space here, rather than modifying the
@@ -455,10 +454,22 @@ paste_tokens (cpp_reader *pfile, const c
   /* Set pfile->cur_token as required by _cpp_lex_direct.  */
   pfile->cur_token = _cpp_temp_token (pfile);
   *plhs = _cpp_lex_direct (pfile);
-  valid = pfile->buffer->cur == pfile->buffer->rlimit;
-  _cpp_pop_buffer (pfile);
+  if (pfile->buffer->cur != pfile->buffer->rlimit)
+    {
+      _cpp_pop_buffer (pfile);
+      _cpp_backup_tokens (pfile, 1);
+      *lhsend = '\0';
 
-  return valid;
+      /* Mandatory error for all apart from assembler.  */
+      if (CPP_OPTION (pfile, lang) != CLK_ASM)
+	cpp_error (pfile, CPP_DL_ERROR,
+	 "pasting \"%s\" and \"%s\" does not give a valid preprocessing token",
+		   buf, cpp_token_as_text (pfile, rhs));
+      return false;
+    }
+
+  _cpp_pop_buffer (pfile);
+  return true;
 }
 
 /* Handles an arbitrarily long sequence of ## operators, with initial
@@ -490,17 +501,7 @@ paste_all_tokens (cpp_reader *pfile, con
 	abort ();
 
       if (!paste_tokens (pfile, &lhs, rhs))
-	{
-	  _cpp_backup_tokens (pfile, 1);
-
-	  /* Mandatory error for all apart from assembler.  */
-	  if (CPP_OPTION (pfile, lang) != CLK_ASM)
-	    cpp_error (pfile, CPP_DL_ERROR,
-	 "pasting \"%s\" and \"%s\" does not give a valid preprocessing token",
-		       cpp_token_as_text (pfile, lhs),
-		       cpp_token_as_text (pfile, rhs));
-	  break;
-	}
+	break;
     }
   while (rhs->flags & PASTE_LEFT);
 
--- gcc/testsuite/gcc.dg/cpp/paste14.c.jj	2006-08-16 16:51:45.000000000 +0200
+++ gcc/testsuite/gcc.dg/cpp/paste14.c	2006-08-16 16:53:30.000000000 +0200
@@ -0,0 +1,7 @@
+/* PR preprocessor/28709 */
+/* { dg-do preprocess } */
+
+#define foo - ## >>
+foo		/* { dg-error "pasting \"-\" and \">>\"" } */
+#define bar = ## ==
+bar		/* { dg-error "pasting \"=\" and \"==\"" } */

	Jakub



More information about the Gcc-patches mailing list