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:
parent
3bfc61cf25
commit
38fbfaf6fb
3 changed files with 75 additions and 1 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue