Commit ff94c747 by Neil Booth Committed by Neil Booth

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
parent b437f1a7
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> 2000-09-14 Richard Henderson <rth@cygnus.com>
* calls.c (precompute_register_parameters): Use COSTS_N_INSNS, not 2. * calls.c (precompute_register_parameters): Use COSTS_N_INSNS, not 2.
......
...@@ -201,9 +201,9 @@ TOKEN_LEN (token) ...@@ -201,9 +201,9 @@ TOKEN_LEN (token)
#define IS_ARG_CONTEXT(c) ((c)->flags & CONTEXT_ARG) #define IS_ARG_CONTEXT(c) ((c)->flags & CONTEXT_ARG)
#define CURRENT_CONTEXT(pfile) ((pfile)->contexts + (pfile)->cur_context) #define CURRENT_CONTEXT(pfile) ((pfile)->contexts + (pfile)->cur_context)
#define ON_REST_ARG(c) \ #define ON_REST_ARG(c) \
(((c)->flags & VAR_ARGS) \ (((c)->u.list->flags & VAR_ARGS) \
&& ((c)-1)->u.list->tokens[((c)-1)->posn - 1].val.aux \ && (c)->u.list->tokens[(c)->posn - 1].val.aux \
== (unsigned int) (((c)-1)->u.list->paramc - 1)) == (unsigned int) ((c)->u.list->paramc - 1))
#define ASSIGN_FLAGS_AND_POS(d, s) \ #define ASSIGN_FLAGS_AND_POS(d, s) \
do {(d)->flags = (s)->flags & (PREV_WHITE | BOL | PASTE_LEFT); \ do {(d)->flags = (s)->flags & (PREV_WHITE | BOL | PASTE_LEFT); \
...@@ -2787,14 +2787,17 @@ maybe_paste_with_next (pfile, token) ...@@ -2787,14 +2787,17 @@ maybe_paste_with_next (pfile, token)
the special extended semantics (see above). */ the special extended semantics (see above). */
if (token->type == CPP_COMMA if (token->type == CPP_COMMA
&& IS_ARG_CONTEXT (CURRENT_CONTEXT (pfile)) && IS_ARG_CONTEXT (CURRENT_CONTEXT (pfile))
&& ON_REST_ARG (CURRENT_CONTEXT (pfile))) && ON_REST_ARG (CURRENT_CONTEXT (pfile) - 1))
/* no warning */; /* no warning */;
else else
cpp_warning (pfile, cpp_warning (pfile,
"pasting would not give a valid preprocessing token"); "pasting would not give a valid preprocessing token");
} }
_cpp_push_token (pfile, second); _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) if (type == CPP_NAME || type == CPP_NUMBER)
......
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) Thu Sep 14 16:48:49 2000 Jeffrey A Law (law@cygnus.com)
* gcc.c-torture/execute/20000914-1.c: New test. * gcc.c-torture/execute/20000914-1.c: New test.
......
/* 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))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment