r257710 - [Sema] Suppress diags in overload resolution.

George Burgess IV via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 13 15:59:35 PST 2016


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160113/ff1dc89e/attachment-0001.html>


More information about the cfe-commits mailing list