mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-27 21:14:30 +08:00
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:
parent
b437f1a754
commit
ff94c74765
@ -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.
|
||||
|
13
gcc/cpplex.c
13
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)
|
||||
|
@ -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.
|
||||
|
15
gcc/testsuite/gcc.dg/cpp/paste10.c
Normal file
15
gcc/testsuite/gcc.dg/cpp/paste10.c
Normal 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))
|
Loading…
Reference in New Issue
Block a user