diff options
author | Mark Mitchell <mark@codesourcery.com> | 2006-04-16 18:12:41 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2006-04-16 18:12:41 +0000 |
commit | e13d2b4e53067e117eb250bbf39c948ec6bd48e6 (patch) | |
tree | a03a1b83baed977b18a6063a3f851c38d4b4d907 /gcc | |
parent | 8a9b2875db44f9b611122e8d9e8f4087db7feaa1 (diff) | |
download | gcc-e13d2b4e53067e117eb250bbf39c948ec6bd48e6.zip gcc-e13d2b4e53067e117eb250bbf39c948ec6bd48e6.tar.gz gcc-e13d2b4e53067e117eb250bbf39c948ec6bd48e6.tar.bz2 |
re PR c++/26365 (ICE in finish_class_member_access_expr, at cp/typeck.c)
PR c++/26365
* typeck.c (finish_class_member_access_expr): Robustify
PR c++/26365
* g++.dg/template/crash45.C: New test.
From-SVN: r112986
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash45.C | 13 |
4 files changed, 30 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 19666e0..78cac48 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index f68b484..e5763e7 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 d02f439..8aa7f67 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..f138e3d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash45.C @@ -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" } +} |