diff options
author | Jason Merrill <jason@redhat.com> | 2010-07-19 10:50:52 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-07-19 10:50:52 -0400 |
commit | ab73eba8bf38a703e40b5e5077b51408fb715d67 (patch) | |
tree | a050dcefcbee61a4d668171c611cf81d4716c07b /gcc/cp/pt.c | |
parent | 157be8f67b0ff8906b93ca4b7ee178f2e44fa725 (diff) | |
download | gcc-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/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 56 |
1 files changed, 34 insertions, 22 deletions
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; |