From 7af6e0b3be982d01ef98d36320cd45bdd08ad0d3 Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Tue, 20 May 2014 04:10:24 +0000 Subject: [PATCH] Fix diagnostic message for member function pointer mismatches where one of the classes is a template argument. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209190 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaOverload.cpp | 3 ++- test/SemaCXX/err_init_conversion_failed.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index af7aeae303..3ea939f4cd 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -2526,7 +2526,8 @@ void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, if (FromType->isMemberPointerType() && ToType->isMemberPointerType()) { const MemberPointerType *FromMember = FromType->getAs(), *ToMember = ToType->getAs(); - if (FromMember->getClass() != ToMember->getClass()) { + if (FromMember->getClass()->getCanonicalTypeInternal() != + ToMember->getClass()->getCanonicalTypeInternal()) { PDiag << ft_different_class << QualType(ToMember->getClass(), 0) << QualType(FromMember->getClass(), 0); return; diff --git a/test/SemaCXX/err_init_conversion_failed.cpp b/test/SemaCXX/err_init_conversion_failed.cpp index 0652e7a9ea..14d4954743 100644 --- a/test/SemaCXX/err_init_conversion_failed.cpp +++ b/test/SemaCXX/err_init_conversion_failed.cpp @@ -43,3 +43,19 @@ void test14(const float2 in, const float2 out) { const float4 V = (float4){ in, out }; // expected-error@-1{{cannot initialize a compound literal initializer}} } + +namespace template_test { +class S { +public: + void foo(int); +}; + +template struct S2 { + void (P::*a)(const int &); +}; + +void test_15() { + S2 X = {&S::foo}; + // expected-error@-1{{cannot initialize a member subobject of type 'void (template_test::S::*)(const int &)' with an rvalue of type 'void (template_test::S::*)(int)': type mismatch at 1st parameter ('const int &' vs 'int')}} +} +} -- 2.40.0