From 7756db03751b73bee03c3a6cd9a61a30aea237c9 Mon Sep 17 00:00:00 2001
From: Mark Mitchell <mark@codesourcery.com>
Date: Mon, 2 Aug 2004 18:49:07 +0000
Subject: [PATCH] re PR c++/16707 (ICE with using)

	PR c++/16707
	* name-lookup.c (validate_nonmember_using_decl): Robustify.

	PR c++/16707
	* g++.dg/lookup/using12.C: New test.

From-SVN: r85446
---
 gcc/cp/ChangeLog                      |  5 +++++
 gcc/cp/name-lookup.c                  | 20 +++++++++++---------
 gcc/testsuite/ChangeLog               |  3 +++
 gcc/testsuite/g++.dg/lookup/using12.C |  4 ++++
 4 files changed, 23 insertions(+), 9 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/lookup/using12.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 81a819a79316..d87b4827aee2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2004-08-02  Mark Mitchell  <mark@codesourcery.com>
+
+	PR c++/16707
+	* name-lookup.c (validate_nonmember_using_decl): Robustify.
+
 2004-08-01  Mark Mitchell  <mark@codesourcery.com>
 
 	PR c++/16224
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index c44541285fb7..2859d8035b9f 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -2115,6 +2115,17 @@ push_overloaded_decl (tree decl, int flags)
 static tree
 validate_nonmember_using_decl (tree decl, tree scope, tree name)
 {
+  /* [namespace.udecl]
+       A using-declaration for a class member shall be a
+       member-declaration.  */
+  if (TYPE_P (scope))
+    {
+      error ("`%T' is not a namespace", scope);
+      return NULL_TREE;
+    }
+  else if (scope == error_mark_node)
+    return NULL_TREE;
+
   if (TREE_CODE (decl) == TEMPLATE_ID_EXPR)
     {
       /* 7.3.3/5
@@ -2142,15 +2153,6 @@ validate_nonmember_using_decl (tree decl, tree scope, tree name)
 
   my_friendly_assert (DECL_P (decl), 20020908);
 
-  /* [namespace.udecl]
-       A using-declaration for a class member shall be a
-       member-declaration.  */
-  if (TYPE_P (scope))
-    {
-      error ("`%T' is not a namespace", scope);
-      return NULL_TREE;
-    }
-
   /* Make a USING_DECL.  */
   return push_using_decl (scope, name);
 }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6a1dbc6d147f..4ae35e2c75de 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2004-08-02  Mark Mitchell  <mark@codesourcery.com>
 
+	PR c++/16707
+	* g++.dg/lookup/using12.C: New test.
+
 	* g++.dg/init/null1.C: Fix PR number.
 	* g++.dg/parse/namespace10.C: Likewise.
 
diff --git a/gcc/testsuite/g++.dg/lookup/using12.C b/gcc/testsuite/g++.dg/lookup/using12.C
new file mode 100644
index 000000000000..030385581a5e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using12.C
@@ -0,0 +1,4 @@
+// PR c++/16707
+
+int i;
+using N::i; // { dg-error "declared|expected" }
-- 
GitLab