From 639bf191a04e597c90aabca3e05fa6fd489b185e Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 19 Jul 2010 14:50:52 +0000 Subject: [PATCH] PR c++/44969 * tree.c (cp_tree_equal): Compare type of *CAST_EXPR. * pt.c (iterative_hash_template_arg): Hash type of *CAST_EXPR. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162307 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/pt.c | 56 +++++++++++++++++++------------- gcc/cp/tree.c | 11 +++++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/template/sfinae24.C | 26 +++++++++++++++ 5 files changed, 82 insertions(+), 22 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/sfinae24.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 63d24a2ac12..9a7c1a48713 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-07-19 Jason Merrill + + 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 PR c++/44969 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 3259043f4ae..0ccd8d9df5d 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 d62f9d7acf6..2abd8dd1a2c 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3720357bf7f..fbe239847bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-19 Jason Merrill + + PR c++/44969 + * g++.dg/template/sfinae24.C: New. + 2010-07-19 H.J. Lu PR fortran/44353 diff --git a/gcc/testsuite/g++.dg/template/sfinae24.C b/gcc/testsuite/g++.dg/template/sfinae24.C new file mode 100644 index 00000000000..7138c96e66f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae24.C @@ -0,0 +1,26 @@ +// PR c++/44969 + +template struct enable_if { typedef T type; }; +template struct enable_if { }; + +template + class mini_is_constructible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template + static typename + enable_if<(sizeof(Tp1(Arg1_(), Arg2_()), 1) > 0), one>::type + test(int); + + template + static two test(...); + + public: + static const bool value = sizeof(test(0)) == 1; + }; + +class A { }; + +int Test[mini_is_constructible::value ? -1 : 1]; -- 2.11.4.GIT