aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Booth <neil@daikokuya.co.uk>2002-11-18 20:43:40 +0000
committerNeil Booth <neil@gcc.gnu.org>2002-11-18 20:43:40 +0000
commit8128cccfcf38a5b55f4f2a9fce020609fe997c09 (patch)
tree3d1d5d6ac428187c5574b5b150f66ff68b5f2568
parent951992020587ab735079e9c4d8706a16ffeba84f (diff)
downloadgcc-8128cccfcf38a5b55f4f2a9fce020609fe997c09.zip
gcc-8128cccfcf38a5b55f4f2a9fce020609fe997c09.tar.gz
gcc-8128cccfcf38a5b55f4f2a9fce020609fe997c09.tar.bz2
re PR preprocessor/8524 (_Pragma within macros is improperly expanded)
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. From-SVN: r59232
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cpplib.c46
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/cpp/_Pragma5.c14
4 files changed, 49 insertions, 22 deletions
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 <neil@daikokuya.co.uk>
+
+ 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 <jh@suse.cz>
* 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 <neil@daikokuya.co.uk>
+
+ * gcc.dg/cpp/_Pragma5.c: New test.
+
2002-11-18 Richard Sandiford <rsandifo@redhat.com>
* 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" } }
+*/