aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-02-27 03:13:28 -0500
committerJason Merrill <jason@gcc.gnu.org>2011-02-27 03:13:28 -0500
commite7dc5734a82ce4794027871556dfdd4bf1be2c25 (patch)
tree6bed5ed34eaae4d954a3959ec8c4f1d711e46720
parentacfd3fffee80262c74de0e4480b983d7bf7fbd8e (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/cp/tree.c19
-rw-r--r--gcc/testsuite/ChangeLog2
-rw-r--r--gcc/testsuite/g++.dg/template/this-targ1.C23
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;
+ }
+};
+