re PR preprocessor/48532 (Wrong location of namespaced pragma involving macros)

PR preprocessor/48532

libcpp/

	* directives.c (do_pragma): Don't forget the invocation location
	when parsing the pragma name of a namespaced pragma directive.

gcc/testsuite/

	* gcc.dg/cpp/pragma-3.c: New test case.

From-SVN: r174694
This commit is contained in:
Dodji Seketeli 2011-06-06 11:33:42 +00:00 committed by Dodji Seketeli
parent 3bfc61cf25
commit 38fbfaf6fb
3 changed files with 75 additions and 1 deletions

View file

@ -1360,7 +1360,36 @@ do_pragma (cpp_reader *pfile)
{
bool allow_name_expansion = p->allow_expansion;
if (allow_name_expansion)
pfile->state.prevent_expansion--;
{
pfile->state.prevent_expansion--;
/*
Kludge ahead.
Consider this code snippet:
#define P parallel
#pragma omp P for
... a for loop ...
Once we parsed the 'omp' namespace of the #pragma
directive, we then parse the 'P' token that represents the
pragma name. P being a macro, it is expanded into the
resulting 'parallel' token.
At this point the 'p' variable contains the 'parallel'
pragma name. And pfile->context->macro is non-null
because we are still right at the end of the macro
context of 'P'. The problem is, if we are being
(indirectly) called by cpp_get_token_with_location,
that function might test pfile->context->macro to see
if we are in the context of a macro expansion, (and we
are) and then use pfile->invocation_location as the
location of the macro invocation. So we must instruct
cpp_get_token below to set
pfile->invocation_location. */
pfile->set_invocation_location = true;
}
token = cpp_get_token (pfile);
if (token->type == CPP_NAME)
p = lookup_pragma_entry (p->u.space, token->val.node.node);