diff options
author | Jason Merrill <jason@redhat.com> | 2011-02-27 03:13:28 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-02-27 03:13:28 -0500 |
commit | e7dc5734a82ce4794027871556dfdd4bf1be2c25 (patch) | |
tree | 6bed5ed34eaae4d954a3959ec8c4f1d711e46720 | |
parent | acfd3fffee80262c74de0e4480b983d7bf7fbd8e (diff) | |
download | gcc-e7dc5734a82ce4794027871556dfdd4bf1be2c25.zip gcc-e7dc5734a82ce4794027871556dfdd4bf1be2c25.tar.gz gcc-e7dc5734a82ce4794027871556dfdd4bf1be2c25.tar.bz2 |
re PR c++/47904 (ICE with DECL_PARM_INDEX (this) in cp_tree_equal)
PR c++/47904
* tree.c (cp_tree_equal): Compare DECL_PARM_LEVEL.
* pt.c (iterative_hash_template_arg): And hash it.
From-SVN: r170533
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/cp/tree.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/this-targ1.C | 23 |
5 files changed, 46 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8283362..50e4b48 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-02-26 Jason Merrill <jason@redhat.com> + PR c++/47904 + * tree.c (cp_tree_equal): Compare DECL_PARM_LEVEL. + * pt.c (iterative_hash_template_arg): And hash it. + PR c++/47897 * semantics.c (non_const_var_error): Split out from... (cxx_eval_constant_expression): ...here. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ed9d28b..4b262d0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -1533,7 +1533,10 @@ iterative_hash_template_arg (tree arg, hashval_t val) case PARM_DECL: if (!DECL_ARTIFICIAL (arg)) - val = iterative_hash_object (DECL_PARM_INDEX (arg), val); + { + val = iterative_hash_object (DECL_PARM_INDEX (arg), val); + val = iterative_hash_object (DECL_PARM_LEVEL (arg), val); + } return iterative_hash_template_arg (TREE_TYPE (arg), val); case TARGET_EXPR: diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d62d242..ed4f67b 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2154,12 +2154,19 @@ 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_LEVEL (t1) == DECL_PARM_LEVEL (t2) + && 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 b23419a..8c5a379 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-02-26 Jason Merrill <jason@redhat.com> + * g++.dg/template/this-targ1.C: New. + * g++.dg/cpp0x/regress/template-const1.C: New. * g++.dg/cpp0x/regress/template-function1.C: Adjust. * g++.dg/template/function1.C: Adjust. 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 0000000..6864be5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/this-targ1.C @@ -0,0 +1,23 @@ +// PR c++/47904 + +template <bool> +struct S +{ +}; + +template <class T> +class U +{ + T t; + int foo () const + { + S <sizeof (t) == 1> s; + return 1; + } + int bar () const + { + S <sizeof (t) == 1> s; + return 1; + } +}; + |