summaryrefslogtreecommitdiff
blob: f506a94d7f04fd7322dd4589b8139a6bc1e901c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2000-09-14  Neil Booth  <NeilB@earthling.net>

	* cpplex.c (ON_REST_ARG): Correct the test.
	(maybe_paste_with_next): Duplicate a token that fail pasting,
	and clear its PASTE_LEFT flag, so that nested pasting attempts
	do not occur.
	* gcc.dg/cpp/paste10.c: Testcase.

--- gcc/cpplex.c	2000/09/12 03:42:29	1.95
+++ gcc/cpplex.c	2000/09/14 22:28:32
@@ -201,9 +201,9 @@ TOKEN_LEN (token)
 #define IS_ARG_CONTEXT(c) ((c)->flags & CONTEXT_ARG)
 #define CURRENT_CONTEXT(pfile) ((pfile)->contexts + (pfile)->cur_context)
 #define ON_REST_ARG(c) \
- (((c)->flags & VAR_ARGS) \
-  && ((c)-1)->u.list->tokens[((c)-1)->posn - 1].val.aux \
-      == (unsigned int) (((c)-1)->u.list->paramc - 1))
+ (((c)->u.list->flags & VAR_ARGS) \
+  && (c)->u.list->tokens[(c)->posn - 1].val.aux \
+      == (unsigned int) ((c)->u.list->paramc - 1))
 
 #define ASSIGN_FLAGS_AND_POS(d, s) \
   do {(d)->flags = (s)->flags & (PREV_WHITE | BOL | PASTE_LEFT); \
@@ -2787,14 +2787,17 @@ maybe_paste_with_next (pfile, token)
 		     the special extended semantics (see above).  */
 		  if (token->type == CPP_COMMA
 		      && IS_ARG_CONTEXT (CURRENT_CONTEXT (pfile))
-		      && ON_REST_ARG (CURRENT_CONTEXT (pfile)))
+		      && ON_REST_ARG (CURRENT_CONTEXT (pfile) - 1))
 		    /* no warning */;
 		  else
 		    cpp_warning (pfile,
 			"pasting would not give a valid preprocessing token");
 		}
 	      _cpp_push_token (pfile, second);
-	      return token;
+	      /* A short term hack to safely clear the PASTE_LEFT flag.  */
+	      pasted = duplicate_token (pfile, token);
+	      pasted->flags &= ~PASTE_LEFT;
+	      return pasted;
 	    }
 
 	  if (type == CPP_NAME || type == CPP_NUMBER)
--- gcc/testsuite/gcc.dg/cpp/paste10.c	Tue May  5 13:32:27 1998
+++ gcc/testsuite/gcc.dg/cpp/paste10.c	Thu Sep 14 15:47:29 2000
@@ -0,0 +1,15 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess } */
+/* { dg-options "" } */
+
+/* This testcase used to produce a bogus "invalid paste" warning, owing
+   to not clearing a PASTE_LEFT flag.  */
+
+#define strcpy(src) __strcpy_small (src)
+
+#define __strcpy_small(src) src
+
+#define tprintf(format, args...) sprintf(format, ## args)
+
+strcpy(tprintf("<%s>", test))