re PR preprocessor/27746 (ICE on openmp code when using _Pragma from macro)

PR preprocessor/27746
	* directives.c (do_pragma): Handle pragma with valid namespace
	and invalid name coming from macro expansion.
	* directives.c (destringize_and_run): Initialize next field in
	context.

	PR c/27747
	PR c++/27748
	* directives.c (destringize_and_run): Set NO_EXPAND on the
	tokens.

	* macro.c (_cpp_backup_tokens): Fix comment typo.
testsuite/
	PR c/27747
	* gcc.dg/cpp/_Pragma6.c: New test.

	PR c++/27748
	* g++.dg/cpp/_Pragma1.C: New test.

	PR preprocessor/27746
	* gcc.dg/gomp/macro-3.c: New test.
	* gcc.dg/gomp/macro-4.c: New test.
	* g++.dg/gomp/macro-3.C: New test.
	* g++.dg/gomp/macro-4.C: New test.

From-SVN: r114519
This commit is contained in:
Jakub Jelinek 2006-06-09 23:13:25 +02:00 committed by Jakub Jelinek
parent 549fb079d3
commit 1c90c6f9c0
10 changed files with 181 additions and 3 deletions

View File

@ -1,3 +1,17 @@
2006-06-09 Jakub Jelinek <jakub@redhat.com>
PR c/27747
* gcc.dg/cpp/_Pragma6.c: New test.
PR c++/27748
* g++.dg/cpp/_Pragma1.C: New test.
PR preprocessor/27746
* gcc.dg/gomp/macro-3.c: New test.
* gcc.dg/gomp/macro-4.c: New test.
* g++.dg/gomp/macro-3.C: New test.
* g++.dg/gomp/macro-4.C: New test.
2006-06-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/26998

View File

@ -0,0 +1,10 @@
// PR c++/27748
// This is supposed to succeed only if
// the target doesn't define HANDLE_PRAGMA_PACK_WITH_EXPANSION.
// { dg-do compile { target { ! *-*-solaris2* } } }
#define push bar
#define foo _Pragma ("pack(push)")
foo
int i;
#pragma pack(pop)

View File

@ -0,0 +1,25 @@
// PR preprocessor/27746
// { dg-do compile }
// { dg-options "-fopenmp -fdump-tree-omplower" }
#define omp FOO
#define p parallel
#define omp_parallel _Pragma ("omp parallel")
#define omp_p _Pragma ("omp p")
void bar (void);
void
foo (void)
{
#pragma omp parallel
bar ();
#pragma omp p
bar ();
omp_parallel
bar ();
omp_p
bar ();
}
// { dg-final { scan-tree-dump-times "#pragma omp parallel" 4 "omplower" } }

View File

@ -0,0 +1,29 @@
// PR preprocessor/27746
// { dg-do compile }
// { dg-options "-fopenmp -Wunknown-pragmas" }
#define p _Pragma ("omp parallel")
#define omp_p _Pragma ("omp p")
void bar (void);
void
foo (void)
{
#pragma omp p // { dg-warning "ignoring #pragma omp _Pragma" }
bar ();
omp_p // { dg-warning "ignoring #pragma omp _Pragma" }
bar ();
}
#define parallel serial
#define omp_parallel _Pragma ("omp parallel")
void
baz (void)
{
#pragma omp parallel // { dg-warning "ignoring #pragma omp serial" }
bar ();
omp_parallel // { dg-warning "ignoring #pragma omp serial" }
bar ();
}

View File

@ -0,0 +1,10 @@
/* PR c/27747 */
/* This is supposed to succeed only if
the target doesn't define HANDLE_PRAGMA_PACK_WITH_EXPANSION. */
/* { dg-do compile { target { ! *-*-solaris2* } } } */
#define push bar
#define foo _Pragma ("pack(push)")
foo
int i;
#pragma pack(pop)

View File

@ -0,0 +1,25 @@
/* PR preprocessor/27746 */
/* { dg-do compile } */
/* { dg-options "-fopenmp -fdump-tree-omplower" } */
#define omp FOO
#define p parallel
#define omp_parallel _Pragma ("omp parallel")
#define omp_p _Pragma ("omp p")
void bar (void);
void
foo (void)
{
#pragma omp parallel
bar ();
#pragma omp p
bar ();
omp_parallel
bar ();
omp_p
bar ();
}
/* { dg-final { scan-tree-dump-times "#pragma omp parallel" 4 "omplower" } } */

View File

@ -0,0 +1,29 @@
/* PR preprocessor/27746 */
/* { dg-do compile } */
/* { dg-options "-fopenmp -Wunknown-pragmas" } */
#define p _Pragma ("omp parallel")
#define omp_p _Pragma ("omp p")
void bar (void);
void
foo (void)
{
#pragma omp p /* { dg-warning "ignoring #pragma omp _Pragma" } */
bar ();
omp_p /* { dg-warning "ignoring #pragma omp _Pragma" } */
bar ();
}
#define parallel serial
#define omp_parallel _Pragma ("omp parallel")
void
baz (void)
{
#pragma omp parallel /* { dg-warning "ignoring #pragma omp serial" } */
bar ();
omp_parallel /* { dg-warning "ignoring #pragma omp serial" } */
bar ();
}

View File

@ -1,3 +1,18 @@
2006-06-09 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/27746
* directives.c (do_pragma): Handle pragma with valid namespace
and invalid name coming from macro expansion.
* directives.c (destringize_and_run): Initialize next field in
context.
PR c/27747
PR c++/27748
* directives.c (destringize_and_run): Set NO_EXPAND on the
tokens.
* macro.c (_cpp_backup_tokens): Fix comment typo.
2006-05-31 Daniel Jacobowitz <dan@codesourcery.com>
* Makefile.in (CATALOGS): Add po/ prefix.

View File

@ -1265,11 +1265,13 @@ do_pragma (cpp_reader *pfile)
{
const struct pragma_entry *p = NULL;
const cpp_token *token, *pragma_token = pfile->cur_token;
cpp_token ns_token;
unsigned int count = 1;
pfile->state.prevent_expansion++;
token = cpp_get_token (pfile);
ns_token = *token;
if (token->type == CPP_NAME)
{
p = lookup_pragma_entry (pfile->pragmas, token->val.node);
@ -1318,7 +1320,22 @@ do_pragma (cpp_reader *pfile)
}
else if (pfile->cb.def_pragma)
{
_cpp_backup_tokens (pfile, count);
if (count == 1 || pfile->context->prev == NULL)
_cpp_backup_tokens (pfile, count);
else
{
/* Invalid name comes from macro expansion, _cpp_backup_tokens
won't allow backing 2 tokens. */
/* ??? The token buffer is leaked. Perhaps if def_pragma hook
reads both tokens, we could perhaps free it, but if it doesn't,
we don't know the exact lifespan. */
cpp_token *toks = XNEWVEC (cpp_token, 2);
toks[0] = ns_token;
toks[0].flags |= NO_EXPAND;
toks[1] = *token;
toks[1].flags |= NO_EXPAND;
_cpp_push_token_context (pfile, NULL, toks, 2);
}
pfile->cb.def_pragma (pfile, pfile->directive_line);
}
@ -1494,6 +1511,7 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in)
pfile->context = XNEW (cpp_context);
pfile->context->macro = 0;
pfile->context->prev = 0;
pfile->context->next = 0;
/* Inline run_directive, since we need to delay the _cpp_pop_buffer
until we've read all of the tokens that we want. */
@ -1534,7 +1552,10 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in)
maxcount = maxcount * 3 / 2;
toks = XRESIZEVEC (cpp_token, toks, maxcount);
}
toks[count++] = *cpp_get_token (pfile);
toks[count] = *cpp_get_token (pfile);
/* Macros have been already expanded by cpp_get_token
if the pragma allowed expansion. */
toks[count++].flags |= NO_EXPAND;
}
while (toks[count-1].type != CPP_PRAGMA_EOL);
}

View File

@ -1180,7 +1180,7 @@ cpp_scan_nooutput (cpp_reader *pfile)
pfile->state.prevent_expansion--;
}
/* Step back one (or more) tokens. Can only step mack more than 1 if
/* Step back one (or more) tokens. Can only step back more than 1 if
they are from the lexer, and not from macro expansion. */
void
_cpp_backup_tokens (cpp_reader *pfile, unsigned int count)