On Mon, Aug 27, 2012 at 09:52:04AM +0200, Dodji Seketeli wrote: > PING^2.
This is ok for trunk. Thanks. > > Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk. > > > > libcpp/ > > > > PR preprocessor/53469 > > * directives.c (do_pragma): Use the virtual location for the > > pragma token, instead of its spelling location. > > > > gcc/testsuite/ > > > > PR preprocessor/53469 > > * gcc.dg/cpp/_Pragma7.c: New test case. > > --- > > gcc/testsuite/ChangeLog | 5 +++++ > > gcc/testsuite/gcc.dg/cpp/_Pragma7.c | 14 ++++++++++++++ > > libcpp/ChangeLog | 6 ++++++ > > libcpp/directives.c | 8 +++++--- > > 4 files changed, 30 insertions(+), 3 deletions(-) > > create mode 100644 gcc/testsuite/gcc.dg/cpp/_Pragma7.c > > > > diff --git a/gcc/testsuite/gcc.dg/cpp/_Pragma7.c > > b/gcc/testsuite/gcc.dg/cpp/_Pragma7.c > > new file mode 100644 > > index 0000000..a7a5b1b > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/cpp/_Pragma7.c > > @@ -0,0 +1,14 @@ > > +/* > > + Origin: PR preprocessor/53469 > > + { dg-do compile } > > + */ > > + > > +#define STRINGIFY(x) #x > > +#define TEST(x) \ > > + _Pragma(STRINGIFY(GCC diagnostic ignored "-Wunused-local-typedefs")) \ > > + typedef int myint; > > + > > +void bar () > > +{ > > + TEST(myint) > > +} > > diff --git a/libcpp/directives.c b/libcpp/directives.c > > index e46280e..cd880f1 100644 > > --- a/libcpp/directives.c > > +++ b/libcpp/directives.c > > @@ -1347,13 +1347,15 @@ static void > > do_pragma (cpp_reader *pfile) > > { > > const struct pragma_entry *p = NULL; > > - const cpp_token *token, *pragma_token = pfile->cur_token; > > + const cpp_token *token, *pragma_token; > > + source_location pragma_token_virt_loc = 0; > > cpp_token ns_token; > > unsigned int count = 1; > > > > pfile->state.prevent_expansion++; > > > > - token = cpp_get_token (pfile); > > + pragma_token = token = cpp_get_token_with_location (pfile, > > + &pragma_token_virt_loc); > > ns_token = *token; > > if (token->type == CPP_NAME) > > { > > @@ -1407,7 +1409,7 @@ do_pragma (cpp_reader *pfile) > > { > > if (p->is_deferred) > > { > > - pfile->directive_result.src_loc = pragma_token->src_loc; > > + pfile->directive_result.src_loc = pragma_token_virt_loc; > > pfile->directive_result.type = CPP_PRAGMA; > > pfile->directive_result.flags = pragma_token->flags; > > pfile->directive_result.val.pragma = p->u.ident; > > -- > Dodji Jakub