PR c++/26365
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 16 Apr 2006 18:12:41 +0000 (18:12 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 16 Apr 2006 18:12:41 +0000 (18:12 +0000)
* typeck.c (finish_class_member_access_expr): Robustify
PR c++/26365
* g++.dg/template/crash45.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112986 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/crash45.C [new file with mode: 0644]

index 19666e0..78cac48 100644 (file)
@@ -1,3 +1,8 @@
+2006-04-16  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/26365
+       * typeck.c (finish_class_member_access_expr): Robustify
+
 2006-04-15  Kazu Hirata  <kazu@codesourcery.com>
 
        * Make-lang.in (cp/pt.o): Depend on vecprim.h.
index f68b484..e5763e7 100644 (file)
@@ -2046,16 +2046,11 @@ finish_class_member_access_expr (tree object, tree name, bool template_p)
 
       if (TREE_CODE (name) == SCOPE_REF)
        {
-         /* A qualified name.  The qualifying class or namespace `S' has
-            already been looked up; it is either a TYPE or a
-            NAMESPACE_DECL.  The member name is either an IDENTIFIER_NODE
-            or a BIT_NOT_EXPR.  */
+         /* A qualified name.  The qualifying class or namespace `S'
+            has already been looked up; it is either a TYPE or a
+            NAMESPACE_DECL.  */
          scope = TREE_OPERAND (name, 0);
          name = TREE_OPERAND (name, 1);
-         gcc_assert (CLASS_TYPE_P (scope)
-                     || TREE_CODE (scope) == NAMESPACE_DECL);
-         gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE
-                     || TREE_CODE (name) == BIT_NOT_EXPR);
 
          /* If SCOPE is a namespace, then the qualified name does not
             name a member of OBJECT_TYPE.  */
@@ -2066,6 +2061,10 @@ finish_class_member_access_expr (tree object, tree name, bool template_p)
              return error_mark_node;
            }
 
+         gcc_assert (CLASS_TYPE_P (scope));
+         gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE
+                     || TREE_CODE (name) == BIT_NOT_EXPR);
+
          /* Find the base of OBJECT_TYPE corresponding to SCOPE.  */
          access_path = lookup_base (object_type, scope, ba_check, NULL);
          if (access_path == error_mark_node)
index d02f439..8aa7f67 100644 (file)
@@ -1,3 +1,8 @@
+2006-04-16  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/26365
+       * g++.dg/template/crash45.C: New test.
+
 2006-04-16  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/26787
diff --git a/gcc/testsuite/g++.dg/template/crash45.C b/gcc/testsuite/g++.dg/template/crash45.C
new file mode 100644 (file)
index 0000000..f138e3d
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/26365
+
+struct A {};
+
+namespace N
+{
+  template<int> void foo();
+}
+
+void bar(A *p)
+{
+  p->N::foo<0>; // { dg-error "not a member" } 
+}