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:
parent
3202dcccb9
commit
b07891da2e
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
12
gcc/testsuite/g++.dg/cpp0x/ref-qual16.C
Normal file
12
gcc/testsuite/g++.dg/cpp0x/ref-qual16.C
Normal 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>);
|
Loading…
Reference in New Issue
Block a user