Commit 79ba5e3b by Neil Booth Committed by Neil Booth

Debian BTS Bug #

	Debian BTS Bug #
	* cpphash.h (FIRST, LAST, CUR, RLIMIT): Fix definitions.
	* cpplib.c (destringize_and_run): Kludge around getting
	tokens from in-progress macros.
	(_cpp_do__Pragma): Simplify.
testsuite:
	* gcc.dg/cpp/_Pragma4.c: New test.

From-SVN: r56773
parent f4701961
2002-09-03 Neil Booth <neil@daikokuya.co.uk>
Debian BTS Bug #157416
* cpphash.h (FIRST, LAST, CUR, RLIMIT): Fix definitions.
* cpplib.c (destringize_and_run): Kludge around getting
tokens from in-progress macros.
(_cpp_do__Pragma): Simplify.
2002-09-03 Steve Ellcey <sje@cup.hp.com> 2002-09-03 Steve Ellcey <sje@cup.hp.com>
* config/ia64/ia64.h (EXTRA_SPECS): Remove cpp_cpu. * config/ia64/ia64.h (EXTRA_SPECS): Remove cpp_cpu.
......
...@@ -166,10 +166,10 @@ struct tokenrun ...@@ -166,10 +166,10 @@ struct tokenrun
}; };
/* Accessor macros for struct cpp_context. */ /* Accessor macros for struct cpp_context. */
#define FIRST(c) (c->u.iso.first) #define FIRST(c) ((c)->u.iso.first)
#define LAST(c) (c->u.iso.last) #define LAST(c) ((c)->u.iso.last)
#define CUR(c) (c->u.trad.cur) #define CUR(c) ((c)->u.trad.cur)
#define RLIMIT(c) (c->u.trad.rlimit) #define RLIMIT(c) ((c)->u.trad.rlimit)
typedef struct cpp_context cpp_context; typedef struct cpp_context cpp_context;
struct cpp_context struct cpp_context
......
...@@ -1277,6 +1277,9 @@ destringize_and_run (pfile, in) ...@@ -1277,6 +1277,9 @@ destringize_and_run (pfile, in)
{ {
const unsigned char *src, *limit; const unsigned char *src, *limit;
char *dest, *result; char *dest, *result;
cpp_context saved_context;
cpp_context *saved_cur_context;
unsigned int saved_line;
dest = result = alloca (in->len + 1); dest = result = alloca (in->len + 1);
for (src = in->text, limit = src + in->len; src < limit;) for (src = in->text, limit = src + in->len; src < limit;)
...@@ -1288,7 +1291,40 @@ destringize_and_run (pfile, in) ...@@ -1288,7 +1291,40 @@ destringize_and_run (pfile, in)
} }
*dest = '\0'; *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); run_directive (pfile, T_PRAGMA, result, dest - result);
pfile->context = saved_cur_context;
pfile->base_context = saved_context;
pfile->line = saved_line;
/* See above comment. For the moment, we'd like
token1 _Pragma ("foo") token2
to be output as
token1
# 7 "file.c"
#pragma foo
# 7 "file.c"
token2
Getting the line markers is a little tricky. */
if (pfile->cb.line_change)
(*pfile->cb.line_change) (pfile, pfile->cur_token, false);
} }
/* Handle the _Pragma operator. */ /* Handle the _Pragma operator. */
...@@ -1298,26 +1334,11 @@ _cpp_do__Pragma (pfile) ...@@ -1298,26 +1334,11 @@ _cpp_do__Pragma (pfile)
{ {
const cpp_token *string = get__Pragma_string (pfile); const cpp_token *string = get__Pragma_string (pfile);
if (!string) if (string)
destringize_and_run (pfile, &string->val.str);
else
cpp_error (pfile, DL_ERROR, cpp_error (pfile, DL_ERROR,
"_Pragma takes a parenthesized string literal"); "_Pragma takes a parenthesized string literal");
else
{
/* Ideally, we'd like
token1 _Pragma ("foo") token2
to be output as
token1
# 7 "file.c"
#pragma foo
# 7 "file.c"
token2
Getting these correct line markers is a little tricky. */
unsigned int orig_line = pfile->line;
destringize_and_run (pfile, &string->val.str);
pfile->line = orig_line;
pfile->buffer->saved_flags = BOL;
}
} }
/* Just ignore #sccs on all systems. */ /* Just ignore #sccs on all systems. */
......
2002-09-03 Neil Booth <neil@daikokuya.co.uk>
* gcc.dg/cpp/_Pragma4.c: New test.
Tue Sep 3 11:04:26 2002 Nicola Pero <n.pero@mi.flashnet.it> Tue Sep 3 11:04:26 2002 Nicola Pero <n.pero@mi.flashnet.it>
* objc/execute/nil_method-1.m: New testcase. * objc/execute/nil_method-1.m: New testcase.
......
/* { dg-do preprocess } */
/* Based on Debian GNATS PR 157416. 3 Sep 2002. */
#define b foo _Pragma ("bar") baz
a b c
/*
{ dg-final { if ![file exists _Pragma4.i] { return } } }
{ dg-final { if { [grep _Pragma4.i "#pragma bat "] != "" } { return } } }
{ dg-final { fail "_Pragma4.c: #pragma appearing on its own line" } }
*/
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