PR c++/9432, c++/9528
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Wed, 30 Apr 2003 17:51:41 +0000 (17:51 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Wed, 30 Apr 2003 17:51:41 +0000 (17:51 +0000)
PR c++/9432, c++/9528
* decl2.c (validate_nonmember_using_decl): Handle SCOPE_REF.

* g++.dg/lookup/using4.C: New test.

From-SVN: r66298

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/using4.C [new file with mode: 0644]

index d6fd395..eb5b26e 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-30  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/9432, c++/9528
+       * decl2.c (validate_nonmember_using_decl): Handle SCOPE_REF.
+
 2003-04-30  Garbiel Dos Reis  <gcc@integrable-solutions.net>
 
        * decl.c (check_previous_goto_1): Adjust prototype.
index cf63b38..4f0337d 100644 (file)
@@ -4236,6 +4236,14 @@ validate_nonmember_using_decl (tree decl, tree *scope, tree *name)
       return NULL_TREE;
     }
 
+  if (TREE_CODE (decl) == SCOPE_REF)
+    {
+      /* It's a nested name with template parameter dependent scope.
+        This can only be using-declaration for class member.  */
+      error ("`%T' is not a namespace", TREE_OPERAND (decl, 0));
+      return NULL_TREE;
+    }
+
   if (is_overloaded_fn (decl))
     decl = get_first_fn (decl);
 
index 5a7ddce..96ea0ab 100644 (file)
@@ -1,3 +1,8 @@
+2003-04-30  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/9432, c++/9528
+       * g++.dg/lookup/using4.C: New test.
+
 2003-04-29  Geoffrey Keating  <geoffk@apple.com>
 
        * gcc.dg/noreturn-5.c: New file.
diff --git a/gcc/testsuite/g++.dg/lookup/using4.C b/gcc/testsuite/g++.dg/lookup/using4.C
new file mode 100644 (file)
index 0000000..a6421c8
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Origin: Richard Guenther <rguenth@tat.physik.uni-tuebingen.de>
+
+// PR c++/9432: ICE in validate_nonmember_using_decl when decl is a 
+// SCOPE_REF.
+
+template <class T> struct Foo;
+template <class T>
+struct Bar : public Foo<T> {
+        void foo()
+        {
+                using Foo<T>::i;       // { dg-error "not a namespace" }
+        }
+};