re PR preprocessor/28227 (valid #ifdef rejected)

libcpp
	PR preprocessor/28227:
	* directives.c (lex_macro_node): Added 'is_def_or_undef'
	argument.
	(do_define): Update.
	(do_undef): Update.
	(do_ifdef): Update.
	(do_ifndef): Update.
gcc/testsuite
	PR preprocessor/28227:
	* gcc.dg/cpp/pr28227.c: New file.

From-SVN: r120731
This commit is contained in:
Tom Tromey 2007-01-12 19:46:49 +00:00 committed by Tom Tromey
parent 3d283195f7
commit ee1c2a100a
4 changed files with 35 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2007-01-12 Tom Tromey <tromey@redhat.com>
PR preprocessor/28227:
* gcc.dg/cpp/pr28227.c: New file.
2007-01-11 Zdenek Dvorak <dvorakz@suse.cz>
* gcc.dg/tree-ssa/loop-22.c: New test.

View File

@ -0,0 +1,10 @@
/* Copyright (C) 2007 Free Software Foundation, Inc. */
/* PR preprocessor/28227 */
/* { dg-do preprocess } */
#ifdef defined
#endif
#ifndef defined
#endif
int x;

View File

@ -1,3 +1,13 @@
2007-01-12 Tom Tromey <tromey@redhat.com>
PR preprocessor/28227:
* directives.c (lex_macro_node): Added 'is_def_or_undef'
argument.
(do_define): Update.
(do_undef): Update.
(do_ifdef): Update.
(do_ifndef): Update.
2007-01-11 Paolo Bonzini <bonzini@gnu.org>
* configure: Regenerate.

View File

@ -103,7 +103,7 @@ static void push_conditional (cpp_reader *, int, int, const cpp_hashnode *);
static unsigned int read_flag (cpp_reader *, unsigned int);
static int strtoul_for_line (const uchar *, unsigned int, unsigned long *);
static void do_diagnostic (cpp_reader *, int, int);
static cpp_hashnode *lex_macro_node (cpp_reader *);
static cpp_hashnode *lex_macro_node (cpp_reader *, bool);
static int undefine_macros (cpp_reader *, cpp_hashnode *, void *);
static void do_include_common (cpp_reader *, enum include_type);
static struct pragma_entry *lookup_pragma_entry (struct pragma_entry *,
@ -503,9 +503,11 @@ run_directive (cpp_reader *pfile, int dir_no, const char *buf, size_t count)
}
/* Checks for validity the macro name in #define, #undef, #ifdef and
#ifndef directives. */
#ifndef directives. IS_DEF_OR_UNDEF is true if this call is
processing a #define or #undefine directive, and false
otherwise. */
static cpp_hashnode *
lex_macro_node (cpp_reader *pfile)
lex_macro_node (cpp_reader *pfile, bool is_def_or_undef)
{
const cpp_token *token = _cpp_lex_token (pfile);
@ -520,7 +522,7 @@ lex_macro_node (cpp_reader *pfile)
{
cpp_hashnode *node = token->val.node;
if (node == pfile->spec_nodes.n_defined)
if (is_def_or_undef && node == pfile->spec_nodes.n_defined)
cpp_error (pfile, CPP_DL_ERROR,
"\"defined\" cannot be used as a macro name");
else if (! (node->flags & NODE_POISONED))
@ -543,7 +545,7 @@ lex_macro_node (cpp_reader *pfile)
static void
do_define (cpp_reader *pfile)
{
cpp_hashnode *node = lex_macro_node (pfile);
cpp_hashnode *node = lex_macro_node (pfile, true);
if (node)
{
@ -562,7 +564,7 @@ do_define (cpp_reader *pfile)
static void
do_undef (cpp_reader *pfile)
{
cpp_hashnode *node = lex_macro_node (pfile);
cpp_hashnode *node = lex_macro_node (pfile, true);
if (node)
{
@ -1606,7 +1608,7 @@ do_ifdef (cpp_reader *pfile)
if (! pfile->state.skipping)
{
const cpp_hashnode *node = lex_macro_node (pfile);
const cpp_hashnode *node = lex_macro_node (pfile, false);
if (node)
{
@ -1628,7 +1630,7 @@ do_ifndef (cpp_reader *pfile)
if (! pfile->state.skipping)
{
node = lex_macro_node (pfile);
node = lex_macro_node (pfile, false);
if (node)
{