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
This commit is contained in:
parent
f470196114
commit
79ba5e3b9e
5 changed files with 67 additions and 22 deletions
|
@ -1,3 +1,11 @@
|
|||
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>
|
||||
|
||||
* config/ia64/ia64.h (EXTRA_SPECS): Remove cpp_cpu.
|
||||
|
|
|
@ -166,10 +166,10 @@ struct tokenrun
|
|||
};
|
||||
|
||||
/* Accessor macros for struct cpp_context. */
|
||||
#define FIRST(c) (c->u.iso.first)
|
||||
#define LAST(c) (c->u.iso.last)
|
||||
#define CUR(c) (c->u.trad.cur)
|
||||
#define RLIMIT(c) (c->u.trad.rlimit)
|
||||
#define FIRST(c) ((c)->u.iso.first)
|
||||
#define LAST(c) ((c)->u.iso.last)
|
||||
#define CUR(c) ((c)->u.trad.cur)
|
||||
#define RLIMIT(c) ((c)->u.trad.rlimit)
|
||||
|
||||
typedef struct cpp_context cpp_context;
|
||||
struct cpp_context
|
||||
|
|
57
gcc/cpplib.c
57
gcc/cpplib.c
|
@ -1277,6 +1277,9 @@ 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;)
|
||||
|
@ -1288,7 +1291,40 @@ 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;
|
||||
|
||||
/* 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. */
|
||||
|
@ -1298,26 +1334,11 @@ _cpp_do__Pragma (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,
|
||||
"_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. */
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
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>
|
||||
|
||||
* objc/execute/nil_method-1.m: New testcase.
|
||||
|
|
12
gcc/testsuite/gcc.dg/cpp/_Pragma4.c
Normal file
12
gcc/testsuite/gcc.dg/cpp/_Pragma4.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
/* { 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" } }
|
||||
*/
|
Loading…
Add table
Reference in a new issue