r257710 - [Sema] Suppress diags in overload resolution.
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 1 13:44:52 PST 2016
Thanks! r259412.
On Mon, Feb 1, 2016 at 1:32 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> LGTM for 3.8.
>
> On Wed, Jan 13, 2016 at 4:03 PM, Hans Wennborg <hans at chromium.org> wrote:
>> Thanks! Richard, what say the code owner?
>>
>> On Wed, Jan 13, 2016 at 3:59 PM, George Burgess IV
>> <george.burgess.iv at gmail.com> wrote:
>>> FYI: This patch should to be merged into the clang 3.8.0 branch.
>>>
>>> Thank you!
>>> George
>>>
>>> On Wed, Jan 13, 2016 at 3:36 PM, George Burgess IV via cfe-commits
>>> <cfe-commits at lists.llvm.org> wrote:
>>>>
>>>> Author: gbiv
>>>> Date: Wed Jan 13 17:36:34 2016
>>>> New Revision: 257710
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=257710&view=rev
>>>> Log:
>>>> [Sema] Suppress diags in overload resolution.
>>>>
>>>> We were emitting diagnostics from our shiny new C-only overload
>>>> resolution mode. This patch attempts to silence all such diagnostics.
>>>>
>>>> This fixes PR26085.
>>>> Differential Revision: http://reviews.llvm.org/D16159
>>>>
>>>> Added:
>>>> cfe/trunk/test/SemaObjC/ovl-check.m
>>>> Modified:
>>>> cfe/trunk/include/clang/Sema/Sema.h
>>>> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>>> cfe/trunk/lib/Sema/SemaExpr.cpp
>>>> cfe/trunk/lib/Sema/SemaExprObjC.cpp
>>>> cfe/trunk/lib/Sema/SemaOverload.cpp
>>>>
>>>> Modified: cfe/trunk/include/clang/Sema/Sema.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=257710&r1=257709&r2=257710&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/include/clang/Sema/Sema.h (original)
>>>> +++ cfe/trunk/include/clang/Sema/Sema.h Wed Jan 13 17:36:34 2016
>>>> @@ -2229,7 +2229,8 @@ public:
>>>> bool CheckPointerConversion(Expr *From, QualType ToType,
>>>> CastKind &Kind,
>>>> CXXCastPath& BasePath,
>>>> - bool IgnoreBaseAccess);
>>>> + bool IgnoreBaseAccess,
>>>> + bool Diagnose = true);
>>>> bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType
>>>> ToType,
>>>> bool InOverloadResolution,
>>>> QualType &ConvertedType);
>>>> @@ -5388,7 +5389,8 @@ public:
>>>> unsigned AmbigiousBaseConvID,
>>>> SourceLocation Loc, SourceRange
>>>> Range,
>>>> DeclarationName Name,
>>>> - CXXCastPath *BasePath);
>>>> + CXXCastPath *BasePath,
>>>> + bool IgnoreAccess = false);
>>>>
>>>> std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
>>>>
>>>> @@ -7514,14 +7516,15 @@ public:
>>>> ObjCMethodDecl *&ClassMethod,
>>>> ObjCMethodDecl *&InstanceMethod,
>>>> TypedefNameDecl *&TDNDecl,
>>>> - bool CfToNs);
>>>> -
>>>> + bool CfToNs, bool Diagnose =
>>>> true);
>>>> +
>>>> bool CheckObjCBridgeRelatedConversions(SourceLocation Loc,
>>>> QualType DestType, QualType
>>>> SrcType,
>>>> - Expr *&SrcExpr);
>>>> -
>>>> - bool ConversionToObjCStringLiteralCheck(QualType DstType, Expr
>>>> *&SrcExpr);
>>>> -
>>>> + Expr *&SrcExpr, bool Diagnose =
>>>> true);
>>>> +
>>>> + bool ConversionToObjCStringLiteralCheck(QualType DstType, Expr
>>>> *&SrcExpr,
>>>> + bool Diagnose = true);
>>>> +
>>>> bool checkInitMethod(ObjCMethodDecl *method, QualType
>>>> receiverTypeIfCall);
>>>>
>>>> /// \brief Check whether the given new method is a valid override of
>>>> the
>>>> @@ -8613,6 +8616,7 @@ public:
>>>> ARCConversionResult CheckObjCARCConversion(SourceRange castRange,
>>>> QualType castType, Expr
>>>> *&op,
>>>> CheckedConversionKind CCK,
>>>> + bool Diagnose = true,
>>>> bool DiagnoseCFAudited =
>>>> false,
>>>> BinaryOperatorKind Opc =
>>>> BO_PtrMemD
>>>> );
>>>>
>>>> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=257710&r1=257709&r2=257710&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
>>>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Jan 13 17:36:34 2016
>>>> @@ -1742,13 +1742,18 @@ void Sema::BuildBasePathArray(const CXXB
>>>> /// otherwise. Loc is the location where this routine should point to
>>>> /// if there is an error, and Range is the source range to highlight
>>>> /// if there is an error.
>>>> +///
>>>> +/// If either InaccessibleBaseID or AmbigiousBaseConvID are 0, then the
>>>> +/// diagnostic for the respective type of error will be suppressed, but
>>>> the
>>>> +/// check for ill-formed code will still be performed.
>>>> bool
>>>> Sema::CheckDerivedToBaseConversion(QualType Derived, QualType Base,
>>>> unsigned InaccessibleBaseID,
>>>> unsigned AmbigiousBaseConvID,
>>>> SourceLocation Loc, SourceRange Range,
>>>> DeclarationName Name,
>>>> - CXXCastPath *BasePath) {
>>>> + CXXCastPath *BasePath,
>>>> + bool IgnoreAccess) {
>>>> // First, determine whether the path from Derived to Base is
>>>> // ambiguous. This is slightly more expensive than checking whether
>>>> // the Derived to Base conversion exists, because here we need to
>>>> @@ -1761,7 +1766,7 @@ Sema::CheckDerivedToBaseConversion(QualT
>>>> (void)DerivationOkay;
>>>>
>>>> if
>>>> (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType())) {
>>>> - if (InaccessibleBaseID) {
>>>> + if (!IgnoreAccess) {
>>>> // Check that the base class can be accessed.
>>>> switch (CheckBaseClassAccess(Loc, Base, Derived, Paths.front(),
>>>> InaccessibleBaseID)) {
>>>> @@ -1810,12 +1815,10 @@ Sema::CheckDerivedToBaseConversion(QualT
>>>> SourceLocation Loc, SourceRange Range,
>>>> CXXCastPath *BasePath,
>>>> bool IgnoreAccess) {
>>>> - return CheckDerivedToBaseConversion(Derived, Base,
>>>> - IgnoreAccess ? 0
>>>> - :
>>>> diag::err_upcast_to_inaccessible_base,
>>>> -
>>>> diag::err_ambiguous_derived_to_base_conv,
>>>> - Loc, Range, DeclarationName(),
>>>> - BasePath);
>>>> + return CheckDerivedToBaseConversion(
>>>> + Derived, Base, diag::err_upcast_to_inaccessible_base,
>>>> + diag::err_ambiguous_derived_to_base_conv, Loc, Range,
>>>> DeclarationName(),
>>>> + BasePath, IgnoreAccess);
>>>> }
>>>>
>>>>
>>>>
>>>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=257710&r1=257709&r2=257710&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>>>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Jan 13 17:36:34 2016
>>>> @@ -7354,11 +7354,14 @@ Sema::CheckSingleAssignmentConstraints(Q
>>>> LHSType->isBlockPointerType()) &&
>>>> RHS.get()->isNullPointerConstant(Context,
>>>> Expr::NPC_ValueDependentIsNull)) {
>>>> - CastKind Kind;
>>>> - CXXCastPath Path;
>>>> - CheckPointerConversion(RHS.get(), LHSType, Kind, Path, false);
>>>> - if (ConvertRHS)
>>>> - RHS = ImpCastExprToType(RHS.get(), LHSType, Kind, VK_RValue,
>>>> &Path);
>>>> + if (Diagnose || ConvertRHS) {
>>>> + CastKind Kind;
>>>> + CXXCastPath Path;
>>>> + CheckPointerConversion(RHS.get(), LHSType, Kind, Path,
>>>> + /*IgnoreBaseAccess=*/false, Diagnose);
>>>> + if (ConvertRHS)
>>>> + RHS = ImpCastExprToType(RHS.get(), LHSType, Kind, VK_RValue,
>>>> &Path);
>>>> + }
>>>> return Compatible;
>>>> }
>>>>
>>>> @@ -7376,8 +7379,8 @@ Sema::CheckSingleAssignmentConstraints(Q
>>>> }
>>>>
>>>> Expr *PRE = RHS.get()->IgnoreParenCasts();
>>>> - if (ObjCProtocolExpr *OPE = dyn_cast<ObjCProtocolExpr>(PRE)) {
>>>> - ObjCProtocolDecl *PDecl = OPE->getProtocol();
>>>> + if (Diagnose && isa<ObjCProtocolExpr>(PRE)) {
>>>> + ObjCProtocolDecl *PDecl = cast<ObjCProtocolExpr>(PRE)->getProtocol();
>>>> if (PDecl && !PDecl->hasDefinition()) {
>>>> Diag(PRE->getExprLoc(), diag::warn_atprotocol_protocol) <<
>>>> PDecl->getName();
>>>> Diag(PDecl->getLocation(), diag::note_entity_declared_at) << PDecl;
>>>> @@ -7399,11 +7402,11 @@ Sema::CheckSingleAssignmentConstraints(Q
>>>> Expr *E = RHS.get();
>>>> if (getLangOpts().ObjCAutoRefCount)
>>>> CheckObjCARCConversion(SourceRange(), Ty, E,
>>>> CCK_ImplicitConversion,
>>>> - DiagnoseCFAudited);
>>>> + Diagnose, DiagnoseCFAudited);
>>>> if (getLangOpts().ObjC1 &&
>>>> - (CheckObjCBridgeRelatedConversions(E->getLocStart(),
>>>> - LHSType, E->getType(), E) ||
>>>> - ConversionToObjCStringLiteralCheck(LHSType, E))) {
>>>> + (CheckObjCBridgeRelatedConversions(E->getLocStart(), LHSType,
>>>> + E->getType(), E, Diagnose) ||
>>>> + ConversionToObjCStringLiteralCheck(LHSType, E, Diagnose))) {
>>>> RHS = E;
>>>> return Compatible;
>>>> }
>>>> @@ -8961,8 +8964,9 @@ QualType Sema::CheckCompareOperands(Expr
>>>> else {
>>>> Expr *E = RHS.get();
>>>> if (getLangOpts().ObjCAutoRefCount)
>>>> - CheckObjCARCConversion(SourceRange(), LHSType, E,
>>>> CCK_ImplicitConversion, false,
>>>> - Opc);
>>>> + CheckObjCARCConversion(SourceRange(), LHSType, E,
>>>> + CCK_ImplicitConversion,
>>>> /*Diagnose=*/true,
>>>> + /*DiagnoseCFAudited=*/false, Opc);
>>>> RHS = ImpCastExprToType(E, LHSType,
>>>> LPT ? CK_BitCast
>>>> :CK_CPointerToObjCPointerCast);
>>>> }
>>>> @@ -11830,8 +11834,8 @@ ExprResult Sema::ActOnGNUNullExpr(Source
>>>> return new (Context) GNUNullExpr(Ty, TokenLoc);
>>>> }
>>>>
>>>> -bool
>>>> -Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&Exp) {
>>>> +bool Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr
>>>> *&Exp,
>>>> + bool Diagnose) {
>>>> if (!getLangOpts().ObjC1)
>>>> return false;
>>>>
>>>> @@ -11857,8 +11861,9 @@ Sema::ConversionToObjCStringLiteralCheck
>>>> StringLiteral *SL = dyn_cast<StringLiteral>(SrcExpr);
>>>> if (!SL || !SL->isAscii())
>>>> return false;
>>>> - Diag(SL->getLocStart(), diag::err_missing_atsign_prefix)
>>>> - << FixItHint::CreateInsertion(SL->getLocStart(), "@");
>>>> + if (Diagnose)
>>>> + Diag(SL->getLocStart(), diag::err_missing_atsign_prefix)
>>>> + << FixItHint::CreateInsertion(SL->getLocStart(), "@");
>>>> Exp = BuildObjCStringLiteral(SL->getLocStart(), SL).get();
>>>> return true;
>>>> }
>>>>
>>>> Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=257710&r1=257709&r2=257710&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
>>>> +++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Wed Jan 13 17:36:34 2016
>>>> @@ -3816,7 +3816,7 @@ bool Sema::checkObjCBridgeRelatedCompone
>>>> ObjCMethodDecl *&ClassMethod,
>>>> ObjCMethodDecl
>>>> *&InstanceMethod,
>>>> TypedefNameDecl *&TDNDecl,
>>>> - bool CfToNs) {
>>>> + bool CfToNs, bool Diagnose) {
>>>> QualType T = CfToNs ? SrcType : DestType;
>>>> ObjCBridgeRelatedAttr *ObjCBAttr = ObjCBridgeRelatedAttrFromType(T,
>>>> TDNDecl);
>>>> if (!ObjCBAttr)
>>>> @@ -3832,20 +3832,24 @@ bool Sema::checkObjCBridgeRelatedCompone
>>>> LookupResult R(*this, DeclarationName(RCId), SourceLocation(),
>>>> Sema::LookupOrdinaryName);
>>>> if (!LookupName(R, TUScope)) {
>>>> - Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId
>>>> - << SrcType << DestType;
>>>> - Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + if (Diagnose) {
>>>> + Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId
>>>> + << SrcType << DestType;
>>>> + Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + }
>>>> return false;
>>>> }
>>>> Target = R.getFoundDecl();
>>>> if (Target && isa<ObjCInterfaceDecl>(Target))
>>>> RelatedClass = cast<ObjCInterfaceDecl>(Target);
>>>> else {
>>>> - Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId
>>>> - << SrcType << DestType;
>>>> - Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> - if (Target)
>>>> - Diag(Target->getLocStart(), diag::note_declared_at);
>>>> + if (Diagnose) {
>>>> + Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) <<
>>>> RCId
>>>> + << SrcType << DestType;
>>>> + Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + if (Target)
>>>> + Diag(Target->getLocStart(), diag::note_declared_at);
>>>> + }
>>>> return false;
>>>> }
>>>>
>>>> @@ -3854,9 +3858,11 @@ bool Sema::checkObjCBridgeRelatedCompone
>>>> Selector Sel = Context.Selectors.getUnarySelector(CMId);
>>>> ClassMethod = RelatedClass->lookupMethod(Sel, false);
>>>> if (!ClassMethod) {
>>>> - Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> - << SrcType << DestType << Sel << false;
>>>> - Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + if (Diagnose) {
>>>> + Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> + << SrcType << DestType << Sel << false;
>>>> + Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + }
>>>> return false;
>>>> }
>>>> }
>>>> @@ -3866,9 +3872,11 @@ bool Sema::checkObjCBridgeRelatedCompone
>>>> Selector Sel = Context.Selectors.getNullarySelector(IMId);
>>>> InstanceMethod = RelatedClass->lookupMethod(Sel, true);
>>>> if (!InstanceMethod) {
>>>> - Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> - << SrcType << DestType << Sel << true;
>>>> - Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + if (Diagnose) {
>>>> + Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> + << SrcType << DestType << Sel << true;
>>>> + Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + }
>>>> return false;
>>>> }
>>>> }
>>>> @@ -3878,7 +3886,7 @@ bool Sema::checkObjCBridgeRelatedCompone
>>>> bool
>>>> Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,
>>>> QualType DestType, QualType
>>>> SrcType,
>>>> - Expr *&SrcExpr) {
>>>> + Expr *&SrcExpr, bool Diagnose) {
>>>> ARCConversionTypeClass rhsExprACTC =
>>>> classifyTypeForARCConversion(SrcType);
>>>> ARCConversionTypeClass lhsExprACTC =
>>>> classifyTypeForARCConversion(DestType);
>>>> bool CfToNs = (rhsExprACTC == ACTC_coreFoundation && lhsExprACTC ==
>>>> ACTC_retainable);
>>>> @@ -3891,27 +3899,29 @@ Sema::CheckObjCBridgeRelatedConversions(
>>>> ObjCMethodDecl *InstanceMethod = nullptr;
>>>> TypedefNameDecl *TDNDecl = nullptr;
>>>> if (!checkObjCBridgeRelatedComponents(Loc, DestType, SrcType,
>>>> RelatedClass,
>>>> - ClassMethod, InstanceMethod,
>>>> TDNDecl, CfToNs))
>>>> + ClassMethod, InstanceMethod,
>>>> TDNDecl,
>>>> + CfToNs, Diagnose))
>>>> return false;
>>>>
>>>> if (CfToNs) {
>>>> // Implicit conversion from CF to ObjC object is needed.
>>>> if (ClassMethod) {
>>>> - std::string ExpressionString = "[";
>>>> - ExpressionString += RelatedClass->getNameAsString();
>>>> - ExpressionString += " ";
>>>> - ExpressionString += ClassMethod->getSelector().getAsString();
>>>> - SourceLocation SrcExprEndLoc =
>>>> getLocForEndOfToken(SrcExpr->getLocEnd());
>>>> - // Provide a fixit: [RelatedClass ClassMethod SrcExpr]
>>>> - Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> - << SrcType << DestType << ClassMethod->getSelector() << false
>>>> - << FixItHint::CreateInsertion(SrcExpr->getLocStart(),
>>>> ExpressionString)
>>>> - << FixItHint::CreateInsertion(SrcExprEndLoc, "]");
>>>> - Diag(RelatedClass->getLocStart(), diag::note_declared_at);
>>>> - Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + if (Diagnose) {
>>>> + std::string ExpressionString = "[";
>>>> + ExpressionString += RelatedClass->getNameAsString();
>>>> + ExpressionString += " ";
>>>> + ExpressionString += ClassMethod->getSelector().getAsString();
>>>> + SourceLocation SrcExprEndLoc =
>>>> getLocForEndOfToken(SrcExpr->getLocEnd());
>>>> + // Provide a fixit: [RelatedClass ClassMethod SrcExpr]
>>>> + Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> + << SrcType << DestType << ClassMethod->getSelector() << false
>>>> + << FixItHint::CreateInsertion(SrcExpr->getLocStart(),
>>>> ExpressionString)
>>>> + << FixItHint::CreateInsertion(SrcExprEndLoc, "]");
>>>> + Diag(RelatedClass->getLocStart(), diag::note_declared_at);
>>>> + Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> + }
>>>>
>>>> - QualType receiverType =
>>>> - Context.getObjCInterfaceType(RelatedClass);
>>>> + QualType receiverType = Context.getObjCInterfaceType(RelatedClass);
>>>> // Argument.
>>>> Expr *args[] = { SrcExpr };
>>>> ExprResult msg = BuildClassMessageImplicit(receiverType, false,
>>>> @@ -3925,30 +3935,34 @@ Sema::CheckObjCBridgeRelatedConversions(
>>>> else {
>>>> // Implicit conversion from ObjC type to CF object is needed.
>>>> if (InstanceMethod) {
>>>> - std::string ExpressionString;
>>>> - SourceLocation SrcExprEndLoc =
>>>> getLocForEndOfToken(SrcExpr->getLocEnd());
>>>> - if (InstanceMethod->isPropertyAccessor())
>>>> - if (const ObjCPropertyDecl *PDecl =
>>>> InstanceMethod->findPropertyDecl()) {
>>>> - // fixit: ObjectExpr.propertyname when it is aproperty
>>>> accessor.
>>>> - ExpressionString = ".";
>>>> - ExpressionString += PDecl->getNameAsString();
>>>> + if (Diagnose) {
>>>> + std::string ExpressionString;
>>>> + SourceLocation SrcExprEndLoc =
>>>> + getLocForEndOfToken(SrcExpr->getLocEnd());
>>>> + if (InstanceMethod->isPropertyAccessor())
>>>> + if (const ObjCPropertyDecl *PDecl =
>>>> + InstanceMethod->findPropertyDecl()) {
>>>> + // fixit: ObjectExpr.propertyname when it is aproperty
>>>> accessor.
>>>> + ExpressionString = ".";
>>>> + ExpressionString += PDecl->getNameAsString();
>>>> + Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> + << SrcType << DestType << InstanceMethod->getSelector()
>>>> << true
>>>> + << FixItHint::CreateInsertion(SrcExprEndLoc,
>>>> ExpressionString);
>>>> + }
>>>> + if (ExpressionString.empty()) {
>>>> + // Provide a fixit: [ObjectExpr InstanceMethod]
>>>> + ExpressionString = " ";
>>>> + ExpressionString +=
>>>> InstanceMethod->getSelector().getAsString();
>>>> + ExpressionString += "]";
>>>> +
>>>> Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> - << SrcType << DestType << InstanceMethod->getSelector() << true
>>>> - << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
>>>> + << SrcType << DestType << InstanceMethod->getSelector() <<
>>>> true
>>>> + << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")
>>>> + << FixItHint::CreateInsertion(SrcExprEndLoc,
>>>> ExpressionString);
>>>> }
>>>> - if (ExpressionString.empty()) {
>>>> - // Provide a fixit: [ObjectExpr InstanceMethod]
>>>> - ExpressionString = " ";
>>>> - ExpressionString += InstanceMethod->getSelector().getAsString();
>>>> - ExpressionString += "]";
>>>> -
>>>> - Diag(Loc, diag::err_objc_bridged_related_known_method)
>>>> - << SrcType << DestType << InstanceMethod->getSelector() << true
>>>> - << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")
>>>> - << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
>>>> + Diag(RelatedClass->getLocStart(), diag::note_declared_at);
>>>> + Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>> }
>>>> - Diag(RelatedClass->getLocStart(), diag::note_declared_at);
>>>> - Diag(TDNDecl->getLocStart(), diag::note_declared_at);
>>>>
>>>> ExprResult msg =
>>>> BuildInstanceMessageImplicit(SrcExpr, SrcType,
>>>> @@ -3965,6 +3979,7 @@ Sema::CheckObjCBridgeRelatedConversions(
>>>> Sema::ARCConversionResult
>>>> Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,
>>>> Expr *&castExpr, CheckedConversionKind CCK,
>>>> + bool Diagnose,
>>>> bool DiagnoseCFAudited,
>>>> BinaryOperatorKind Opc) {
>>>> QualType castExprType = castExpr->getType();
>>>> @@ -3980,9 +3995,9 @@ Sema::CheckObjCARCConversion(SourceRange
>>>> if (exprACTC == castACTC) {
>>>> // check for viablity and report error if casting an rvalue to a
>>>> // life-time qualifier.
>>>> - if ((castACTC == ACTC_retainable) &&
>>>> + if (Diagnose && castACTC == ACTC_retainable &&
>>>> (CCK == CCK_CStyleCast || CCK == CCK_OtherCast) &&
>>>> - (castType != castExprType)) {
>>>> + castType != castExprType) {
>>>> const Type *DT = castType.getTypePtr();
>>>> QualType QDT = castType;
>>>> // We desugar some types but not others. We ignore those
>>>> @@ -4051,19 +4066,20 @@ Sema::CheckObjCARCConversion(SourceRange
>>>> // to 'NSString *'. Let caller issue a normal mismatched diagnostic
>>>> with
>>>> // suitable fix-it.
>>>> if (castACTC == ACTC_retainable && exprACTC == ACTC_none &&
>>>> - ConversionToObjCStringLiteralCheck(castType, castExpr))
>>>> + ConversionToObjCStringLiteralCheck(castType, castExpr, Diagnose))
>>>> return ACR_okay;
>>>>
>>>> // Do not issue "bridge cast" diagnostic when implicit casting
>>>> // a retainable object to a CF type parameter belonging to an audited
>>>> // CF API function. Let caller issue a normal type mismatched
>>>> diagnostic
>>>> // instead.
>>>> - if (!DiagnoseCFAudited || exprACTC != ACTC_retainable ||
>>>> - castACTC != ACTC_coreFoundation)
>>>> + if (Diagnose &&
>>>> + (!DiagnoseCFAudited || exprACTC != ACTC_retainable ||
>>>> + castACTC != ACTC_coreFoundation))
>>>> if (!(exprACTC == ACTC_voidPtr && castACTC == ACTC_retainable &&
>>>> (Opc == BO_NE || Opc == BO_EQ)))
>>>> - diagnoseObjCARCConversion(*this, castRange, castType, castACTC,
>>>> - castExpr, castExpr, exprACTC, CCK);
>>>> + diagnoseObjCARCConversion(*this, castRange, castType, castACTC,
>>>> castExpr,
>>>> + castExpr, exprACTC, CCK);
>>>> return ACR_okay;
>>>> }
>>>>
>>>>
>>>> Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=257710&r1=257709&r2=257710&view=diff
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
>>>> +++ cfe/trunk/lib/Sema/SemaOverload.cpp Wed Jan 13 17:36:34 2016
>>>> @@ -2687,15 +2687,16 @@ bool Sema::FunctionParamTypesAreEqual(co
>>>> bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
>>>> CastKind &Kind,
>>>> CXXCastPath& BasePath,
>>>> - bool IgnoreBaseAccess) {
>>>> + bool IgnoreBaseAccess,
>>>> + bool Diagnose) {
>>>> QualType FromType = From->getType();
>>>> bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
>>>>
>>>> Kind = CK_BitCast;
>>>>
>>>> - if (!IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() &&
>>>> + if (Diagnose && !IsCStyleOrFunctionalCast &&
>>>> !FromType->isAnyPointerType() &&
>>>> From->isNullPointerConstant(Context,
>>>> Expr::NPC_ValueDependentIsNotNull) ==
>>>> - Expr::NPCK_ZeroExpression) {
>>>> + Expr::NPCK_ZeroExpression) {
>>>> if (Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy))
>>>> DiagRuntimeBehavior(From->getExprLoc(), From,
>>>> PDiag(diag::warn_impcast_bool_to_null_pointer)
>>>> @@ -2713,18 +2714,24 @@ bool Sema::CheckPointerConversion(Expr *
>>>> !Context.hasSameUnqualifiedType(FromPointeeType,
>>>> ToPointeeType)) {
>>>> // We must have a derived-to-base conversion. Check an
>>>> // ambiguous or inaccessible conversion.
>>>> - if (CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType,
>>>> - From->getExprLoc(),
>>>> - From->getSourceRange(),
>>>> &BasePath,
>>>> - IgnoreBaseAccess))
>>>> + unsigned InaccessibleID = 0;
>>>> + unsigned AmbigiousID = 0;
>>>> + if (Diagnose) {
>>>> + InaccessibleID = diag::err_upcast_to_inaccessible_base;
>>>> + AmbigiousID = diag::err_ambiguous_derived_to_base_conv;
>>>> + }
>>>> + if (CheckDerivedToBaseConversion(
>>>> + FromPointeeType, ToPointeeType, InaccessibleID,
>>>> AmbigiousID,
>>>> + From->getExprLoc(), From->getSourceRange(),
>>>> DeclarationName(),
>>>> + &BasePath, IgnoreBaseAccess))
>>>> return true;
>>>>
>>>> // The conversion was successful.
>>>> Kind = CK_DerivedToBase;
>>>> }
>>>>
>>>> - if (!IsCStyleOrFunctionalCast && FromPointeeType->isFunctionType()
>>>> &&
>>>> - ToPointeeType->isVoidType()) {
>>>> + if (Diagnose && !IsCStyleOrFunctionalCast &&
>>>> + FromPointeeType->isFunctionType() &&
>>>> ToPointeeType->isVoidType()) {
>>>> assert(getLangOpts().MSVCCompat &&
>>>> "this should only be possible with MSVCCompat!");
>>>> Diag(From->getExprLoc(), diag::ext_ms_impcast_fn_obj)
>>>>
>>>> Added: cfe/trunk/test/SemaObjC/ovl-check.m
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/ovl-check.m?rev=257710&view=auto
>>>>
>>>> ==============================================================================
>>>> --- cfe/trunk/test/SemaObjC/ovl-check.m (added)
>>>> +++ cfe/trunk/test/SemaObjC/ovl-check.m Wed Jan 13 17:36:34 2016
>>>> @@ -0,0 +1,55 @@
>>>> +// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -verify %s
>>>> -fobjc-arc
>>>> +//
>>>> +// These tests exist as a means to help ensure that diagnostics aren't
>>>> printed
>>>> +// in overload resolution in ObjC.
>>>> +
>>>> +struct Type1 { int a; };
>>>> + at interface Iface1 @end
>>>> +
>>>> + at interface NeverCalled
>>>> +- (void) test:(struct Type1 *)arg;
>>>> + at end
>>>> +
>>>> + at interface TakesIface1
>>>> +- (void) test:(Iface1 *)arg;
>>>> + at end
>>>> +
>>>> +// PR26085, rdar://problem/24111333
>>>> +void testTakesIface1(id x, Iface1 *arg) {
>>>> + // This should resolve silently to `TakesIface1`.
>>>> + [x test:arg];
>>>> +}
>>>> +
>>>> + at class NSString;
>>>> + at interface NeverCalledv2
>>>> +- (void) testStr:(NSString *)arg;
>>>> + at end
>>>> +
>>>> + at interface TakesVanillaConstChar
>>>> +- (void) testStr:(const void *)a;
>>>> + at end
>>>> +
>>>> +// Not called out explicitly by PR26085, but related.
>>>> +void testTakesNSString(id x) {
>>>> + // Overload resolution should not emit a diagnostic about needing to
>>>> add an
>>>> + // '@' before "someStringLiteral".
>>>> + [x testStr:"someStringLiteral"];
>>>> +}
>>>> +
>>>> +typedef const void *CFTypeRef;
>>>> +id CreateSomething();
>>>> +
>>>> + at interface NeverCalledv3
>>>> +- (void) testCFTypeRef:(struct Type1 *)arg;
>>>> + at end
>>>> +
>>>> + at interface TakesCFTypeRef
>>>> +- (void) testCFTypeRef:(CFTypeRef)arg;
>>>> + at end
>>>> +
>>>> +// Not called out explicitly by PR26085, but related.
>>>> +void testTakesCFTypeRef(id x) {
>>>> + // Overload resolution should occur silently, select the CFTypeRef
>>>> overload,
>>>> + // and produce a single complaint. (with notes)
>>>> + [x testCFTypeRef:CreateSomething()]; // expected-error{{implicit
>>>> conversion of Objective-C pointer type 'id' to C pointer type 'CFTypeRef'}}
>>>> expected-note{{use __bridge}} expected-note{{use __bridge_retained}}
>>>> +}
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>>
More information about the cfe-commits
mailing list