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