diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 86181040ce..7ddb151e8a 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -2177,6 +2177,12 @@ enum { /// parameter types, and different return types. void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType) { + // If either type is not valid, include no extra info. + if (FromType.isNull() || ToType.isNull()) { + PDiag << ft_default; + return; + } + // Get the function type from the pointers. if (FromType->isMemberPointerType() && ToType->isMemberPointerType()) { const MemberPointerType *FromMember = FromType->getAs<MemberPointerType>(), @@ -2188,27 +2194,26 @@ void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, } FromType = FromMember->getPointeeType(); ToType = ToMember->getPointeeType(); - } else if (FromType->isPointerType() && ToType->isPointerType()) { + } + + if (FromType->isPointerType()) FromType = FromType->getPointeeType(); + if (ToType->isPointerType()) ToType = ToType->getPointeeType(); - } else { - PDiag << ft_default; - return; - } + // Remove references. FromType = FromType.getNonReferenceType(); ToType = ToType.getNonReferenceType(); - // If either type is not valid, of the types are the same, no extra info. - if (FromType.isNull() || ToType.isNull() || - Context.hasSameType(FromType, ToType)) { + // Don't print extra info for non-specialized template functions. + if (FromType->isInstantiationDependentType() && + !FromType->getAs<TemplateSpecializationType>()) { PDiag << ft_default; return; } - // Don't print extra info for non-specialized template functions. - if (FromType->isInstantiationDependentType() && - !FromType->getAs<TemplateSpecializationType>()) { + // No extra info for same types. + if (Context.hasSameType(FromType, ToType)) { PDiag << ft_default; return; } |