From 3e2a04b5eaabe5eab46f35bb0ea4a06804c44f7d Mon Sep 17 00:00:00 2001
From: tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 12 Jan 2007 19:46:49 +0000
Subject: [PATCH] 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120731 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/testsuite/ChangeLog            |  5 +++++
 gcc/testsuite/gcc.dg/cpp/pr28227.c | 10 ++++++++++
 libcpp/ChangeLog                   | 10 ++++++++++
 libcpp/directives.c                | 18 ++++++++++--------
 4 files changed, 35 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/cpp/pr28227.c

diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1ad561da6c74..22158f2b4ccf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/cpp/pr28227.c b/gcc/testsuite/gcc.dg/cpp/pr28227.c
new file mode 100644
index 000000000000..3b70dd539202
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/pr28227.c
@@ -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;
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index ab548bb2b02c..f39408145358 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -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.
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 2ef914a435e9..d67cb5fd6d18 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -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)
 	{
-- 
GitLab