From 6e5ef531228d0f6b8c9f03e26651fa93a01064fe Mon Sep 17 00:00:00 2001 From: neil Date: Mon, 18 Nov 2002 20:43:40 +0000 Subject: [PATCH] PR preprocessor/8524 * cpplib.c (run_directive): Remove previous kludge to _Pragma. Add a new one in its place, which hopefully works. (skip_rest_of_line): Change test for bottom-of-context-stack. testsuite: * gcc.dg/cpp/_Pragma5.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59232 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 ++++++ gcc/cpplib.c | 46 +++++++++++++++++++------------------ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/cpp/_Pragma5.c | 14 +++++++++++ 4 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/cpp/_Pragma5.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a283340..13371e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-11-18 Neil Booth + + PR preprocessor/8524 + * cpplib.c (run_directive): Remove previous kludge to _Pragma. + Add a new one in its place, which hopefully works. + (skip_rest_of_line): Change test for bottom-of-context-stack. + Mon Nov 18 21:29:03 CET 2002 Jan Hubicka * i386.md (addqi_1_slp): Fix output template. diff --git a/gcc/cpplib.c b/gcc/cpplib.c index c954448..7092cc0 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -207,7 +207,7 @@ skip_rest_of_line (pfile) cpp_reader *pfile; { /* Discard all stacked contexts. */ - while (pfile->context != &pfile->base_context) + while (pfile->context->prev) _cpp_pop_context (pfile); /* Sweep up all tokens remaining on the line. */ @@ -1277,9 +1277,6 @@ destringize_and_run (pfile, in) { const unsigned char *src, *limit; char *dest, *result; - cpp_context saved_context; - cpp_context *saved_cur_context; - unsigned int saved_line; dest = result = alloca (in->len + 1); for (src = in->text, limit = src + in->len; src < limit;) @@ -1291,24 +1288,29 @@ destringize_and_run (pfile, in) } *dest = '\0'; - /* FIXME. All this saving is a horrible kludge to handle the case - when we're in a macro expansion. - - A better strategy it to not convert _Pragma to #pragma if doing - preprocessed output, but to just pass it through as-is, unless it - is a CPP pragma in which case is should be processed normally. - When compiling the preprocessed output the _Pragma should be - handled. This will be become necessary when we move to - line-at-a-time lexing since we will be macro-expanding the line - before outputting / compiling it. */ - saved_line = pfile->line; - saved_context = pfile->base_context; - saved_cur_context = pfile->context; - pfile->context = &pfile->base_context; - run_directive (pfile, T_PRAGMA, result, dest - result); - pfile->context = saved_cur_context; - pfile->base_context = saved_context; - pfile->line = saved_line; + /* Ugh; an awful kludge. We are really not set up to be lexing + tokens when in the middle of a macro expansion. Use a new + context to force cpp_get_token to lex, and so skip_rest_of_line + doesn't go beyond the end of the text. Also, remember the + current lexing position so we can return to it later. + + Something like line-at-a-time lexing should remove the need for + this. */ + { + cpp_context *saved_context = pfile->context; + cpp_token *saved_cur_token = pfile->cur_token; + tokenrun *saved_cur_run = pfile->cur_run; + + pfile->context = xnew (cpp_context); + pfile->context->macro = 0; + pfile->context->prev = 0; + run_directive (pfile, T_PRAGMA, result, dest - result); + free (pfile->context); + pfile->context = saved_context; + pfile->cur_token = saved_cur_token; + pfile->cur_run = saved_cur_run; + pfile->line--; + } /* See above comment. For the moment, we'd like diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 481a5f7..b1448b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-11-18 Neil Booth + + * gcc.dg/cpp/_Pragma5.c: New test. + 2002-11-18 Richard Sandiford * gcc.c-torture/execute/20021118-2.c: New test. diff --git a/gcc/testsuite/gcc.dg/cpp/_Pragma5.c b/gcc/testsuite/gcc.dg/cpp/_Pragma5.c new file mode 100644 index 0000000..ace5041 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/_Pragma5.c @@ -0,0 +1,14 @@ +/* { dg-do preprocess } */ + +/* Based on Debian GNATS PR 8524. 17 Nov 2002. */ + +#define ALPHA(A) alpha_ ## A +#define BETA(B) beta_ ## B +#define GAMMA(C) _Pragma("moose") ALPHA(C) BETA(C) +GAMMA(baz); + +/* + { dg-final { if ![file exists _Pragma5.i] { return } } } + { dg-final { if { [grep _Pragma5.i "alpha_baz beta_baz;"] != "" } { return } } } + { dg-final { fail "_Pragma5.c: _Pragma in macro" } } +*/ -- 2.7.4