mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-02 06:40:25 +08:00
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
39
gcc/testsuite/gcc.dg/cpp/pragma-3.c
Normal file
39
gcc/testsuite/gcc.dg/cpp/pragma-3.c
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
{ dg-options "-fopenmp" }
|
||||
{ dg-do preprocess }
|
||||
*/
|
||||
|
||||
void foo (void)
|
||||
{
|
||||
int i1, j1, k1;
|
||||
#define p parallel
|
||||
#define P(x) private (x##1)
|
||||
#define S(x) shared (x##1)
|
||||
#define F(x) firstprivate (x##1)
|
||||
#pragma omp \
|
||||
p \
|
||||
P(i) \
|
||||
S(j) \
|
||||
F(k)
|
||||
;
|
||||
}
|
||||
|
||||
/*
|
||||
The bug here was that we had a line like:
|
||||
# 33554432 "../../gcc/testsuite/gcc.dg/cpp/pragma-3.c"
|
||||
|
||||
Before line:
|
||||
|
||||
#pragma omp parallel private (i1) shared (j1) firstprivate (k1)
|
||||
|
||||
Note the very big integer there. Normally we should just have
|
||||
this:
|
||||
|
||||
# 13 "../../gcc/testsuite/gcc.dg/cpp/pragma-3.c"
|
||||
#pragma omp parallel private (i1) shared (j1) firstprivate (k1)
|
||||
|
||||
So let's check that we have no line with a number of 3 or more
|
||||
digit after #:
|
||||
|
||||
{ dg-final { scan-file-not pragma-3.i "# \[0-9\]{3} \[^\n\r\]*pragma-3.c" } }
|
||||
*/
|
@ -1,3 +1,9 @@
|
||||
2011-06-06 Dodji Seketeli <dodji@redhat.com>
|
||||
|
||||
PR preprocessor/48532
|
||||
* directives.c (do_pragma): Don't forget the invocation location
|
||||
when parsing the pragma name of a namespaced pragma directive.
|
||||
|
||||
2011-05-29 John Tytgat <John.Tytgat@aaug.net>
|
||||
|
||||
* files.c (read_file_guts): Add test on non-zero value of S_ISREG.
|
||||
|
@ -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…
x
Reference in New Issue
Block a user