From 7b3a85be33a118ca58e07f172a8f4de4af84934d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sun, 27 Feb 2011 12:11:19 -0500 Subject: [PATCH] re PR c++/47904 (ICE with DECL_PARM_INDEX (this) in cp_tree_equal) PR c++/47904 * tree.c (cp_tree_equal) [PARM_DECL]: Don't crash on DECL_ARTIFICIAL parms. From-SVN: r170544 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/tree.c | 18 +++++++++++------ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/template/this-targ1.C | 23 ++++++++++++++++++++++ 4 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/this-targ1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ac768737bd18..663d4caaaa6f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-02-26 Jason Merrill + + PR c++/47904 + * tree.c (cp_tree_equal) [PARM_DECL]: Don't crash on + DECL_ARTIFICIAL parms. + 2010-12-16 Release Manager * GCC 4.5.2 released. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 54b76a850307..994056d9ca3d 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2089,12 +2089,18 @@ cp_tree_equal (tree t1, tree t2) case PARM_DECL: /* For comparing uses of parameters in late-specified return types - with an out-of-class definition of the function. */ - if (same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)) - && DECL_PARM_INDEX (t1) == DECL_PARM_INDEX (t2)) - return true; - else - return false; + with an out-of-class definition of the function, but can also come + up for expressions that involve 'this' in a member function + template. */ + if (same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))) + { + if (DECL_ARTIFICIAL (t1) ^ DECL_ARTIFICIAL (t2)) + return false; + if (DECL_ARTIFICIAL (t1) + || DECL_PARM_INDEX (t1) == DECL_PARM_INDEX (t2)) + return true; + } + return false; case VAR_DECL: case CONST_DECL: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ccda4effcd00..5055e516c98c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-02-26 Jason Merrill + + * g++.dg/template/this-targ1.C: New. + 2011-02-19 Alexandre Oliva PR tree-optimization/46620 diff --git a/gcc/testsuite/g++.dg/template/this-targ1.C b/gcc/testsuite/g++.dg/template/this-targ1.C new file mode 100644 index 000000000000..6864be5abbc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/this-targ1.C @@ -0,0 +1,23 @@ +// PR c++/47904 + +template +struct S +{ +}; + +template +class U +{ + T t; + int foo () const + { + S s; + return 1; + } + int bar () const + { + S s; + return 1; + } +}; + -- 2.47.2