Thanks! r259412.
On Mon, Feb 1, 2016 at 1:32 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > LGTM for 3.8. > > On Wed, Jan 13, 2016 at 4:03 PM, Hans Wennborg <h...@chromium.org> wrote: >> Thanks! Richard, what say the code owner? >> >> On Wed, Jan 13, 2016 at 3:59 PM, George Burgess IV >> <george.burgess...@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@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; }; >>>> +@interface Iface1 @end >>>> + >>>> +@interface NeverCalled >>>> +- (void) test:(struct Type1 *)arg; >>>> +@end >>>> + >>>> +@interface TakesIface1 >>>> +- (void) test:(Iface1 *)arg; >>>> +@end >>>> + >>>> +// PR26085, rdar://problem/24111333 >>>> +void testTakesIface1(id x, Iface1 *arg) { >>>> + // This should resolve silently to `TakesIface1`. >>>> + [x test:arg]; >>>> +} >>>> + >>>> +@class NSString; >>>> +@interface NeverCalledv2 >>>> +- (void) testStr:(NSString *)arg; >>>> +@end >>>> + >>>> +@interface TakesVanillaConstChar >>>> +- (void) testStr:(const void *)a; >>>> +@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(); >>>> + >>>> +@interface NeverCalledv3 >>>> +- (void) testCFTypeRef:(struct Type1 *)arg; >>>> +@end >>>> + >>>> +@interface TakesCFTypeRef >>>> +- (void) testCFTypeRef:(CFTypeRef)arg; >>>> +@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@lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >>> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits