aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Martin <simartin@users.sourceforge.net>2007-01-11 19:46:03 +0000
committerSimon Martin <simartin@gcc.gnu.org>2007-01-11 19:46:03 +0000
commit6f9f76e336e9ce7a1c070351e4d21e6b84c0e82c (patch)
tree0f3c51fe1f2b8c17b0a809798e495fd93772cedd
parentad4fe825e2765e2630c6d3c2505900c159e2e446 (diff)
downloadgcc-6f9f76e336e9ce7a1c070351e4d21e6b84c0e82c.zip
gcc-6f9f76e336e9ce7a1c070351e4d21e6b84c0e82c.tar.gz
gcc-6f9f76e336e9ce7a1c070351e4d21e6b84c0e82c.tar.bz2
re PR c++/29573 (ICE after parse error in template argument)
2007-01-11 Simon Martin <simartin@users.sourceforge.net> PR c++/29573 * tree.c (cp_tree_equal): Properly handle MODOP_EXPR trees. From-SVN: r120683
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/tree.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/sizeof-template-argument.C15
4 files changed, 40 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 74af04c..12a3cc6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-11 Simon Martin <simartin@users.sourceforge.net>
+
+ PR c++/29573
+ * tree.c (cp_tree_equal): Properly handle MODOP_EXPR trees.
+
2007-01-10 Mark Mitchell <mark@codesourcery.com>
PR c++/28999
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index ae3dc4c..742e090 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1709,6 +1709,21 @@ cp_tree_equal (tree t1, tree t2)
return cp_tree_equal (o1, o2);
}
+ case MODOP_EXPR:
+ {
+ tree t1_op1, t2_op1;
+
+ if (!cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)))
+ return false;
+
+ t1_op1 = TREE_OPERAND (t1, 1);
+ t2_op1 = TREE_OPERAND (t2, 1);
+ if (TREE_CODE (t1_op1) != TREE_CODE (t2_op1))
+ return false;
+
+ return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t2, 2));
+ }
+
case PTRMEM_CST:
/* Two pointer-to-members are the same if they point to the same
field or function in the same class. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c63f074..7b9b375 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-11 Simon Martin <simartin@users.sourceforge.net>
+
+ PR c++/29573
+ * g++.dg/template/sizeof-template-argument.C: New test.
+
2007-01-11 Jan Hubicka <jh@suse.cz>
* gcc.dg/tree-ssa/tailrecursion-4.c: Update dump file.
diff --git a/gcc/testsuite/g++.dg/template/sizeof-template-argument.C b/gcc/testsuite/g++.dg/template/sizeof-template-argument.C
new file mode 100644
index 0000000..f7472c3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/sizeof-template-argument.C
@@ -0,0 +1,15 @@
+/* This used to ICE (PR c++/29573) */
+/* { dg-do "compile" } */
+
+template<int> struct A {};
+
+template<typename> struct B : A <sizeof(=)> {}; /* { dg-error "parse error in template argument list" } */
+
+template<typename> struct C : A <sizeof(=)> {}; /* { dg-error "parse error in template argument list" } */
+
+int a;
+
+template<typename> struct D : A <sizeof(a=1)> {}; /* This used to ICE as well. */
+
+template<typename> struct E : A <sizeof(a=1)> {}; /* This used to ICE as well. */
+