re PR c++/64297 (ICE: canonical types differ for identical types)

PR c++/64297
	* typeck.c (apply_memfn_quals): Correct wrong TYPE_CANONICAL.

From-SVN: r218763
This commit is contained in:
Jason Merrill 2014-12-15 15:19:51 -05:00 committed by Jason Merrill
parent 3202dcccb9
commit b07891da2e
3 changed files with 21 additions and 0 deletions

View File

@ -1,5 +1,8 @@
2014-12-15 Jason Merrill <jason@redhat.com>
PR c++/64297
* typeck.c (apply_memfn_quals): Correct wrong TYPE_CANONICAL.
N3778: Sized Deallocation
* call.c (non_placement_deallocation_fn_p): A global sized
operator delete is not a usual deallocation function until C++14.

View File

@ -8945,6 +8945,12 @@ apply_memfn_quals (tree type, cp_cv_quals memfn_quals, cp_ref_qualifier rqual)
/* This should really have a different TYPE_MAIN_VARIANT, but that gets
complex. */
tree result = build_qualified_type (type, memfn_quals);
if (tree canon = TYPE_CANONICAL (result))
if (canon != result)
/* check_qualified_type doesn't check the ref-qualifier, so make sure
TYPE_CANONICAL is correct. */
TYPE_CANONICAL (result)
= build_ref_qualified_type (canon, type_memfn_rqual (result));
result = build_exception_variant (result, TYPE_RAISES_EXCEPTIONS (type));
return build_ref_qualified_type (result, rqual);
}

View File

@ -0,0 +1,12 @@
// PR c++/64297
// { dg-do compile { target c++11 } }
struct A {
typedef int X;
template <int> X m_fn1() const;
};
template <typename> struct is_function {};
is_function<int() const &> i;
struct D {
template <typename Y, typename = is_function<Y>> D(Y);
} b(&A::m_fn1<0>);