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