re PR c++/10554 (ICE with illegal using declaration)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Thu, 1 May 2003 15:02:13 +0000 (15:02 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Thu, 1 May 2003 15:02:13 +0000 (15:02 +0000)
PR c++/10554
* decl2.c (do_class_using_decl): Check if operand 0 of SCOPE_REF
is not NULL.

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

From-SVN: r66329

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

index 15cca9a72ad9544ae21613d7bbb2a8315bf7d16d..2f58d2eb650f0f172a8ef23eb5763c04d6f62557 100644 (file)
@@ -1,3 +1,9 @@
+2003-05-01  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/10554
+       * decl2.c (do_class_using_decl): Check if operand 0 of SCOPE_REF
+       is not NULL.
+
 2003-05-01  Steven Bosscher  <steven@gcc.gnu.org>
 
        * cp-tree.h (struct lang_id2): Remove.  Move fields from here...
index 4f0337d40f0e65f7539adf513262e06d92caf9b5..ec5ff717eeaeaf1434d4a71d31ec4c572f6a50e7 100644 (file)
@@ -4458,6 +4458,7 @@ do_class_using_decl (tree decl)
   tree name, value;
 
   if (TREE_CODE (decl) != SCOPE_REF
+      || !TREE_OPERAND (decl, 0)
       || !TYPE_P (TREE_OPERAND (decl, 0)))
     {
       error ("using-declaration for non-member at class scope");
index 6dcbe62d272c3674b77657b38ecc8a0cca41e61c..8dc9753df909237ae58eb2da190c43a1393cf903 100644 (file)
@@ -1,3 +1,8 @@
+2003-05-01  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/10554
+       * g++.dg/lookup/using5.C: New test.
+
 2003-05-01  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/8772
diff --git a/gcc/testsuite/g++.dg/lookup/using5.C b/gcc/testsuite/g++.dg/lookup/using5.C
new file mode 100644 (file)
index 0000000..0c73187
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10554: ICE for member using declaration with failed
+// scope name lookup.
+
+template <typename> struct A
+{
+    typedef A X;
+    void foo();
+};
+
+template <typename T> struct B : A<T>
+{
+    using X::foo; { dg-error "not a class-name|expected|non-member" }
+};