diff options
author | Neil Booth <neilb@earthling.net> | 2000-09-15 05:55:36 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2000-09-15 05:55:36 +0000 |
commit | ff94c747653bba7f146f1f8304286d82f17d8ae9 (patch) | |
tree | 46b2b60f181bbf21ca0786fa960ec2f8d89df671 /gcc | |
parent | b437f1a754649a06bd783fc707b5bff14c9c5eed (diff) | |
download | gcc-ff94c747653bba7f146f1f8304286d82f17d8ae9.zip gcc-ff94c747653bba7f146f1f8304286d82f17d8ae9.tar.gz gcc-ff94c747653bba7f146f1f8304286d82f17d8ae9.tar.bz2 |
cpplex.c (ON_REST_ARG): Correct the test.
* 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.
From-SVN: r36424
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cpplex.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/paste10.c | 15 |
4 files changed, 34 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e6a9d8..4554224 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Fri 15-Sep-2000 06:49:07 BST 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. + 2000-09-14 Richard Henderson <rth@cygnus.com> * calls.c (precompute_register_parameters): Use COSTS_N_INSNS, not 2. diff --git a/gcc/cpplex.c b/gcc/cpplex.c index 5cb6b7f..56b8543 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 78eec45..54d0fa9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +Fri 15-Sep-2000 06:50:11 BST Neil Booth <NeilB@earthling.net> + + * gcc.dg/cpp/paste10.c: Testcase for PASTE_LEFT buglet. + Thu Sep 14 16:48:49 2000 Jeffrey A Law (law@cygnus.com) * gcc.c-torture/execute/20000914-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/cpp/paste10.c b/gcc/testsuite/gcc.dg/cpp/paste10.c new file mode 100644 index 0000000..ab3cb90 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/paste10.c @@ -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)) |