r257710 - [Sema] Suppress diags in overload resolution.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 1 13:32:38 PST 2016
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