diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-13 22:07:30 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-13 22:07:30 +0000 |
commit | 8fc043d8abaade620beadba15647f2977b78a0a6 (patch) | |
tree | a3d3d0ff70776f75d1e90655b7d95c53b16ab059 /gcc/cp | |
parent | c3fcfd44da367ae283e26a80c247c83278d484c1 (diff) | |
download | gcc-8fc043d8abaade620beadba15647f2977b78a0a6.tar.gz |
PR c++/65054
* pt.c (template_args_equal): Look through conversions here.
* tree.c (cp_tree_equal): Not here.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220697 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 1 | ||||
-rw-r--r-- | gcc/cp/pt.c | 17 | ||||
-rw-r--r-- | gcc/cp/tree.c | 19 |
4 files changed, 27 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e6d306e6f76..0738e8b7b14 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-02-13 Jason Merrill <jason@redhat.com> + + PR c++/65054 + * pt.c (template_args_equal): Look through conversions here. + * tree.c (cp_tree_equal): Not here. + 2015-02-13 Paolo Carlini <paolo.carlini@oracle.com> PR c++/60211 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 2b56cb2d62b..d415dd4e6d2 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -3638,7 +3638,6 @@ maybe_constant_value (tree t, tree decl) r = cxx_eval_outermost_constant_expr (t, true, true, decl); #ifdef ENABLE_CHECKING - /* cp_tree_equal looks through NOPs, so allow them. */ gcc_assert (r == t || CONVERT_EXPR_P (t) || TREE_CODE (t) == VIEW_CONVERT_EXPR diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 3317dad35d7..9a00d0d30e6 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7324,7 +7324,22 @@ template_args_equal (tree ot, tree nt) else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot)) return 0; else - return cp_tree_equal (ot, nt); + { + /* Try to treat a template non-type argument that has been converted + to the parameter type as equivalent to one that hasn't yet. */ + for (enum tree_code code1 = TREE_CODE (ot); + CONVERT_EXPR_CODE_P (code1) + || code1 == NON_LVALUE_EXPR; + code1 = TREE_CODE (ot)) + ot = TREE_OPERAND (ot, 0); + for (enum tree_code code2 = TREE_CODE (nt); + CONVERT_EXPR_CODE_P (code2) + || code2 == NON_LVALUE_EXPR; + code2 = TREE_CODE (nt)) + nt = TREE_OPERAND (nt, 0); + + return cp_tree_equal (ot, nt); + } } /* Returns 1 iff the OLDARGS and NEWARGS are in fact identical sets of diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index c51e42d2a40..c8e6f0c796f 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2745,20 +2745,8 @@ cp_tree_equal (tree t1, tree t2) if (!t1 || !t2) return false; - for (code1 = TREE_CODE (t1); - CONVERT_EXPR_CODE_P (code1) - || code1 == NON_LVALUE_EXPR; - code1 = TREE_CODE (t1)) - t1 = TREE_OPERAND (t1, 0); - for (code2 = TREE_CODE (t2); - CONVERT_EXPR_CODE_P (code2) - || code2 == NON_LVALUE_EXPR; - code2 = TREE_CODE (t2)) - t2 = TREE_OPERAND (t2, 0); - - /* They might have become equal now. */ - if (t1 == t2) - return true; + code1 = TREE_CODE (t1); + code2 = TREE_CODE (t2); if (code1 != code2) return false; @@ -2996,6 +2984,9 @@ cp_tree_equal (tree t1, tree t2) case DYNAMIC_CAST_EXPR: case IMPLICIT_CONV_EXPR: case NEW_EXPR: + CASE_CONVERT: + case NON_LVALUE_EXPR: + case VIEW_CONVERT_EXPR: if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))) return false; /* Now compare operands as usual. */ |