From ff94c747653bba7f146f1f8304286d82f17d8ae9 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Fri, 15 Sep 2000 05:55:36 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/cpplex.c | 13 ++++++++----- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/cpp/paste10.c | 15 +++++++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/cpp/paste10.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e6a9d8d016..45542241124 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Fri 15-Sep-2000 06:49:07 BST Neil Booth + + * 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 * calls.c (precompute_register_parameters): Use COSTS_N_INSNS, not 2. diff --git a/gcc/cpplex.c b/gcc/cpplex.c index 5cb6b7f7611..56b8543f995 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 78eec457257..54d0fa9297b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +Fri 15-Sep-2000 06:50:11 BST Neil Booth + + * 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 00000000000..ab3cb9050be --- /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)) -- 2.30.2