aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2006-04-16 18:12:41 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2006-04-16 18:12:41 +0000
commite13d2b4e53067e117eb250bbf39c948ec6bd48e6 (patch)
treea03a1b83baed977b18a6063a3f851c38d4b4d907 /gcc
parent8a9b2875db44f9b611122e8d9e8f4087db7feaa1 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/typeck.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/crash45.C13
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" }
+}