From 6f9f76e336e9ce7a1c070351e4d21e6b84c0e82c Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Thu, 11 Jan 2007 19:46:03 +0000 Subject: [PATCH] re PR c++/29573 (ICE after parse error in template argument) 2007-01-11 Simon Martin PR c++/29573 * tree.c (cp_tree_equal): Properly handle MODOP_EXPR trees. From-SVN: r120683 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/tree.c | 15 +++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/sizeof-template-argument.C | 15 +++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/sizeof-template-argument.C 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 + + PR c++/29573 + * tree.c (cp_tree_equal): Properly handle MODOP_EXPR trees. + 2007-01-10 Mark Mitchell 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 + + PR c++/29573 + * g++.dg/template/sizeof-template-argument.C: New test. + 2007-01-11 Jan Hubicka * 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 struct A {}; + +template struct B : A {}; /* { dg-error "parse error in template argument list" } */ + +template struct C : A {}; /* { dg-error "parse error in template argument list" } */ + +int a; + +template struct D : A {}; /* This used to ICE as well. */ + +template struct E : A {}; /* This used to ICE as well. */ + -- 2.7.4