diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index f5bdd903bcf5..34f512b13d6a 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -3613,13 +3613,6 @@ Sema::MemberPointerConversionResult Sema::CheckMemberPointerConversion( QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind, CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange, bool IgnoreBaseAccess, MemberPointerConversionDirection Direction) { - const MemberPointerType *FromPtrType = FromType->getAs(); - if (!FromPtrType) { - // This must be a null pointer to member pointer conversion - Kind = CK_NullToMemberPointer; - return MemberPointerConversionResult::Success; - } - // Lock down the inheritance model right now in MS ABI, whether or not the // pointee types are the same. if (Context.getTargetInfo().getCXXABI().isMicrosoft()) { @@ -3627,6 +3620,13 @@ Sema::MemberPointerConversionResult Sema::CheckMemberPointerConversion( (void)isCompleteType(CheckLoc, QualType(ToPtrType, 0)); } + const MemberPointerType *FromPtrType = FromType->getAs(); + if (!FromPtrType) { + // This must be a null pointer to member pointer conversion + Kind = CK_NullToMemberPointer; + return MemberPointerConversionResult::Success; + } + // T == T, modulo cv if (Direction == MemberPointerConversionDirection::Upcast && !Context.hasSameUnqualifiedType(FromPtrType->getPointeeType(), diff --git a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp index fe4cab164249..806bc5b63ef0 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp @@ -985,3 +985,10 @@ namespace ContainerOf { return reinterpret_cast(reinterpret_cast(list) - offset); } } + +namespace GH144081 { + struct A; + template void f() {} + template void f(); + // CHECK-LABEL: define{{.*}} void @"??$f@$0A@@GH144081@@YAXXZ" +} // namespace GH144081