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