diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 19666e04277b..78cac4853cae 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-04-16 Mark Mitchell + + PR c++/26365 + * typeck.c (finish_class_member_access_expr): Robustify + 2006-04-15 Kazu Hirata * Make-lang.in (cp/pt.o): Depend on vecprim.h. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index f68b48477151..e5763e7a8d34 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d02f439ae372..8aa7f6793e73 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-04-16 Mark Mitchell + + PR c++/26365 + * g++.dg/template/crash45.C: New test. + 2006-04-16 Paul Thomas 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 index 000000000000..f138e3d6169f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash45.C @@ -0,0 +1,13 @@ +// PR c++/26365 + +struct A {}; + +namespace N +{ + template void foo(); +} + +void bar(A *p) +{ + p->N::foo<0>; // { dg-error "not a member" } +}