aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-07-19 10:50:52 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-07-19 10:50:52 -0400
commitab73eba8bf38a703e40b5e5077b51408fb715d67 (patch)
treea050dcefcbee61a4d668171c611cf81d4716c07b /gcc/cp
parent157be8f67b0ff8906b93ca4b7ee178f2e44fa725 (diff)
downloadgcc-ab73eba8bf38a703e40b5e5077b51408fb715d67.zip
gcc-ab73eba8bf38a703e40b5e5077b51408fb715d67.tar.gz
gcc-ab73eba8bf38a703e40b5e5077b51408fb715d67.tar.bz2
re PR c++/44969 ([C++0x] <type_traits> std::is_constructible broken for fundamental types.)
PR c++/44969 * tree.c (cp_tree_equal): Compare type of *CAST_EXPR. * pt.c (iterative_hash_template_arg): Hash type of *CAST_EXPR. From-SVN: r162307
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c56
-rw-r--r--gcc/cp/tree.c11
3 files changed, 51 insertions, 22 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 63d24a2..9a7c1a4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-19 Jason Merrill <jason@redhat.com>
+
+ PR c++/44969
+ * tree.c (cp_tree_equal): Compare type of *CAST_EXPR.
+ * pt.c (iterative_hash_template_arg): Hash type of *CAST_EXPR.
+
2010-07-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/44969
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 3259043..0ccd8d9 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -1566,31 +1566,43 @@ iterative_hash_template_arg (tree arg, hashval_t val)
gcc_assert (seen_error ());
return val;
+ case CAST_EXPR:
+ case STATIC_CAST_EXPR:
+ case REINTERPRET_CAST_EXPR:
+ case CONST_CAST_EXPR:
+ case DYNAMIC_CAST_EXPR:
+ case NEW_EXPR:
+ val = iterative_hash_template_arg (TREE_TYPE (arg), val);
+ /* Now hash operands as usual. */
+ break;
+
default:
- switch (tclass)
- {
- case tcc_type:
- if (TYPE_CANONICAL (arg))
- return iterative_hash_object (TYPE_HASH (TYPE_CANONICAL (arg)),
- val);
- else if (TREE_CODE (arg) == DECLTYPE_TYPE)
- return iterative_hash_template_arg (DECLTYPE_TYPE_EXPR (arg), val);
- /* Otherwise just compare the types during lookup. */
- return val;
+ break;
+ }
- case tcc_declaration:
- case tcc_constant:
- return iterative_hash_expr (arg, val);
+ switch (tclass)
+ {
+ case tcc_type:
+ if (TYPE_CANONICAL (arg))
+ return iterative_hash_object (TYPE_HASH (TYPE_CANONICAL (arg)),
+ val);
+ else if (TREE_CODE (arg) == DECLTYPE_TYPE)
+ return iterative_hash_template_arg (DECLTYPE_TYPE_EXPR (arg), val);
+ /* Otherwise just compare the types during lookup. */
+ return val;
- default:
- gcc_assert (IS_EXPR_CODE_CLASS (tclass));
- {
- unsigned n = TREE_OPERAND_LENGTH (arg);
- for (i = 0; i < n; ++i)
- val = iterative_hash_template_arg (TREE_OPERAND (arg, i), val);
- return val;
- }
- }
+ case tcc_declaration:
+ case tcc_constant:
+ return iterative_hash_expr (arg, val);
+
+ default:
+ gcc_assert (IS_EXPR_CODE_CLASS (tclass));
+ {
+ unsigned n = TREE_OPERAND_LENGTH (arg);
+ for (i = 0; i < n; ++i)
+ val = iterative_hash_template_arg (TREE_OPERAND (arg, i), val);
+ return val;
+ }
}
gcc_unreachable ();
return 0;
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index d62f9d7..2abd8dd 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2191,6 +2191,17 @@ cp_tree_equal (tree t1, tree t2)
return same_type_p (TRAIT_EXPR_TYPE1 (t1), TRAIT_EXPR_TYPE1 (t2))
&& same_type_p (TRAIT_EXPR_TYPE2 (t1), TRAIT_EXPR_TYPE2 (t2));
+ case CAST_EXPR:
+ case STATIC_CAST_EXPR:
+ case REINTERPRET_CAST_EXPR:
+ case CONST_CAST_EXPR:
+ case DYNAMIC_CAST_EXPR:
+ case NEW_EXPR:
+ if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
+ return false;
+ /* Now compare operands as usual. */
+ break;
+
default:
break;
}