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