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
This commit is contained in:
Neil Booth 2000-09-15 05:55:36 +00:00 committed by Neil Booth
parent b437f1a754
commit ff94c74765
4 changed files with 34 additions and 5 deletions

View File

@ -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.

View File

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

View File

@ -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.

View File

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