<div dir="ltr"><div>FYI: This patch should to be merged into the clang 3.8.0 branch.<br></div><div><br></div><div>Thank you!</div><div>George</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 13, 2016 at 3:36 PM, George Burgess IV via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: gbiv<br>
Date: Wed Jan 13 17:36:34 2016<br>
New Revision: 257710<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=257710&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=257710&view=rev</a><br>
Log:<br>
[Sema] Suppress diags in overload resolution.<br>
<br>
We were emitting diagnostics from our shiny new C-only overload<br>
resolution mode. This patch attempts to silence all such diagnostics.<br>
<br>
This fixes PR26085.<br>
Differential Revision: <a href="http://reviews.llvm.org/D16159" rel="noreferrer" target="_blank">http://reviews.llvm.org/D16159</a><br>
<br>
Added:<br>
  Â  cfe/trunk/test/SemaObjC/ovl-check.m<br>
Modified:<br>
  Â  cfe/trunk/include/clang/Sema/Sema.h<br>
  Â  cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
  Â  cfe/trunk/lib/Sema/SemaExpr.cpp<br>
  Â  cfe/trunk/lib/Sema/SemaExprObjC.cpp<br>
  Â  cfe/trunk/lib/Sema/SemaOverload.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Sema/Sema.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=257710&r1=257709&r2=257710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=257710&r1=257709&r2=257710&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Sema/Sema.h (original)<br>
+++ cfe/trunk/include/clang/Sema/Sema.h Wed Jan 13 17:36:34 2016<br>
@@ -2229,7 +2229,8 @@ public:<br>
  Â bool CheckPointerConversion(Expr *From, QualType ToType,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CastKind &Kind,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CXXCastPath& BasePath,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool IgnoreBaseAccess);<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool IgnoreBaseAccess,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool Diagnose = true);<br>
  Â bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool InOverloadResolution,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  QualType &ConvertedType);<br>
@@ -5388,7 +5389,8 @@ public:<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â unsigned AmbigiousBaseConvID,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â SourceLocation Loc, SourceRange Range,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â DeclarationName Name,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CXXCastPath *BasePath);<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CXXCastPath *BasePath,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool IgnoreAccess = false);<br>
<br>
  Â std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);<br>
<br>
@@ -7514,14 +7516,15 @@ public:<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â ObjCMethodDecl *&ClassMethod,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â ObjCMethodDecl *&InstanceMethod,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â TypedefNameDecl *&TDNDecl,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool CfToNs);<br>
-<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool CfToNs, bool Diagnose = true);<br>
+<br>
  Â bool CheckObjCBridgeRelatedConversions(SourceLocation Loc,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  QualType DestType, QualType SrcType,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â Expr *&SrcExpr);<br>
-<br>
-  bool ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&SrcExpr);<br>
-<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â Expr *&SrcExpr, bool Diagnose = true);<br>
+<br>
+  bool ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&SrcExpr,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool Diagnose = true);<br>
+<br>
  Â bool checkInitMethod(ObjCMethodDecl *method, QualType receiverTypeIfCall);<br>
<br>
  Â /// \brief Check whether the given new method is a valid override of the<br>
@@ -8613,6 +8616,7 @@ public:<br>
  Â ARCConversionResult CheckObjCARCConversion(SourceRange castRange,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  QualType castType, Expr *&op,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CheckedConversionKind CCK,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bool Diagnose = true,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool DiagnoseCFAudited = false,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  BinaryOperatorKind Opc = BO_PtrMemD<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  );<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=257710&r1=257709&r2=257710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=257710&r1=257709&r2=257710&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Jan 13 17:36:34 2016<br>
@@ -1742,13 +1742,18 @@ void Sema::BuildBasePathArray(const CXXB<br>
 /// otherwise. Loc is the location where this routine should point to<br>
 /// if there is an error, and Range is the source range to highlight<br>
 /// if there is an error.<br>
+///<br>
+/// If either InaccessibleBaseID or AmbigiousBaseConvID are 0, then the<br>
+/// diagnostic for the respective type of error will be suppressed, but the<br>
+/// check for ill-formed code will still be performed.<br>
 bool<br>
 Sema::CheckDerivedToBaseConversion(QualType Derived, QualType Base,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  unsigned InaccessibleBaseID,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  unsigned AmbigiousBaseConvID,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  SourceLocation Loc, SourceRange Range,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  DeclarationName Name,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CXXCastPath *BasePath) {<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CXXCastPath *BasePath,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bool IgnoreAccess) {<br>
  Â // First, determine whether the path from Derived to Base is<br>
  Â // ambiguous. This is slightly more expensive than checking whether<br>
  Â // the Derived to Base conversion exists, because here we need to<br>
@@ -1761,7 +1766,7 @@ Sema::CheckDerivedToBaseConversion(QualT<br>
  Â (void)DerivationOkay;<br>
<br>
  Â if (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType())) {<br>
-  Â  if (InaccessibleBaseID) {<br>
+  Â  if (!IgnoreAccess) {<br>
  Â  Â  Â // Check that the base class can be accessed.<br>
  Â  Â  Â switch (CheckBaseClassAccess(Loc, Base, Derived, Paths.front(),<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  InaccessibleBaseID)) {<br>
@@ -1810,12 +1815,10 @@ Sema::CheckDerivedToBaseConversion(QualT<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  SourceLocation Loc, SourceRange Range,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CXXCastPath *BasePath,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool IgnoreAccess) {<br>
-  return CheckDerivedToBaseConversion(Derived, Base,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  IgnoreAccess ? 0<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â : diag::err_upcast_to_inaccessible_base,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  diag::err_ambiguous_derived_to_base_conv,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Loc, Range, DeclarationName(),<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  BasePath);<br>
+  return CheckDerivedToBaseConversion(<br>
+  Â  Â  Derived, Base, diag::err_upcast_to_inaccessible_base,<br>
+  Â  Â  diag::err_ambiguous_derived_to_base_conv, Loc, Range, DeclarationName(),<br>
+  Â  Â  BasePath, IgnoreAccess);<br>
 }<br>
<br>
<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=257710&r1=257709&r2=257710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=257710&r1=257709&r2=257710&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Jan 13 17:36:34 2016<br>
@@ -7354,11 +7354,14 @@ Sema::CheckSingleAssignmentConstraints(Q<br>
  Â  Â  Â  LHSType->isBlockPointerType()) &&<br>
  Â  Â  Â RHS.get()->isNullPointerConstant(Context,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Expr::NPC_ValueDependentIsNull)) {<br>
-  Â  CastKind Kind;<br>
-  Â  CXXCastPath Path;<br>
-  Â  CheckPointerConversion(RHS.get(), LHSType, Kind, Path, false);<br>
-  Â  if (ConvertRHS)<br>
-  Â  Â  RHS = ImpCastExprToType(RHS.get(), LHSType, Kind, VK_RValue, &Path);<br>
+  Â  if (Diagnose || ConvertRHS) {<br>
+  Â  Â  CastKind Kind;<br>
+  Â  Â  CXXCastPath Path;<br>
+  Â  Â  CheckPointerConversion(RHS.get(), LHSType, Kind, Path,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â /*IgnoreBaseAccess=*/false, Diagnose);<br>
+  Â  Â  if (ConvertRHS)<br>
+  Â  Â  Â  RHS = ImpCastExprToType(RHS.get(), LHSType, Kind, VK_RValue, &Path);<br>
+  Â  }<br>
  Â  Â return Compatible;<br>
  Â }<br>
<br>
@@ -7376,8 +7379,8 @@ Sema::CheckSingleAssignmentConstraints(Q<br>
  Â }<br>
<br>
  Â Expr *PRE = RHS.get()->IgnoreParenCasts();<br>
-  if (ObjCProtocolExpr *OPE = dyn_cast<ObjCProtocolExpr>(PRE)) {<br>
-  Â  ObjCProtocolDecl *PDecl = OPE->getProtocol();<br>
+  if (Diagnose && isa<ObjCProtocolExpr>(PRE)) {<br>
+  Â  ObjCProtocolDecl *PDecl = cast<ObjCProtocolExpr>(PRE)->getProtocol();<br>
  Â  Â if (PDecl && !PDecl->hasDefinition()) {<br>
  Â  Â  Â Diag(PRE->getExprLoc(), diag::warn_atprotocol_protocol) << PDecl->getName();<br>
  Â  Â  Â Diag(PDecl->getLocation(), diag::note_entity_declared_at) << PDecl;<br>
@@ -7399,11 +7402,11 @@ Sema::CheckSingleAssignmentConstraints(Q<br>
  Â  Â Expr *E = RHS.get();<br>
  Â  Â if (getLangOpts().ObjCAutoRefCount)<br>
  Â  Â  Â CheckObjCARCConversion(SourceRange(), Ty, E, CCK_ImplicitConversion,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â DiagnoseCFAudited);<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â Diagnose, DiagnoseCFAudited);<br>
  Â  Â if (getLangOpts().ObjC1 &&<br>
-  Â  Â  Â  (CheckObjCBridgeRelatedConversions(E->getLocStart(),<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  LHSType, E->getType(), E) ||<br>
-  Â  Â  Â  Â ConversionToObjCStringLiteralCheck(LHSType, E))) {<br>
+  Â  Â  Â  (CheckObjCBridgeRelatedConversions(E->getLocStart(), LHSType,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â E->getType(), E, Diagnose) ||<br>
+  Â  Â  Â  Â ConversionToObjCStringLiteralCheck(LHSType, E, Diagnose))) {<br>
  Â  Â  Â RHS = E;<br>
  Â  Â  Â return Compatible;<br>
  Â  Â }<br>
@@ -8961,8 +8964,9 @@ QualType Sema::CheckCompareOperands(Expr<br>
  Â  Â  Â else {<br>
  Â  Â  Â  Â Expr *E = RHS.get();<br>
  Â  Â  Â  Â if (getLangOpts().ObjCAutoRefCount)<br>
-  Â  Â  Â  Â  CheckObjCARCConversion(SourceRange(), LHSType, E, CCK_ImplicitConversion, false,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â Opc);<br>
+  Â  Â  Â  Â  CheckObjCARCConversion(SourceRange(), LHSType, E,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CCK_ImplicitConversion, /*Diagnose=*/true,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â /*DiagnoseCFAudited=*/false, Opc);<br>
  Â  Â  Â  Â RHS = ImpCastExprToType(E, LHSType,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);<br>
  Â  Â  Â }<br>
@@ -11830,8 +11834,8 @@ ExprResult Sema::ActOnGNUNullExpr(Source<br>
  Â return new (Context) GNUNullExpr(Ty, TokenLoc);<br>
 }<br>
<br>
-bool<br>
-Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&Exp) {<br>
+bool Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&Exp,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool Diagnose) {<br>
  Â if (!getLangOpts().ObjC1)<br>
  Â  Â return false;<br>
<br>
@@ -11857,8 +11861,9 @@ Sema::ConversionToObjCStringLiteralCheck<br>
  Â StringLiteral *SL = dyn_cast<StringLiteral>(SrcExpr);<br>
  Â if (!SL || !SL->isAscii())<br>
  Â  Â return false;<br>
-  Diag(SL->getLocStart(), diag::err_missing_atsign_prefix)<br>
-  Â  << FixItHint::CreateInsertion(SL->getLocStart(), "@");<br>
+  if (Diagnose)<br>
+  Â  Diag(SL->getLocStart(), diag::err_missing_atsign_prefix)<br>
+  Â  Â  << FixItHint::CreateInsertion(SL->getLocStart(), "@");<br>
  Â Exp = BuildObjCStringLiteral(SL->getLocStart(), SL).get();<br>
  Â return true;<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=257710&r1=257709&r2=257710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=257710&r1=257709&r2=257710&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Wed Jan 13 17:36:34 2016<br>
@@ -3816,7 +3816,7 @@ bool Sema::checkObjCBridgeRelatedCompone<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â ObjCMethodDecl *&ClassMethod,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â ObjCMethodDecl *&InstanceMethod,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â TypedefNameDecl *&TDNDecl,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool CfToNs) {<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool CfToNs, bool Diagnose) {<br>
  Â QualType T = CfToNs ? SrcType : DestType;<br>
  Â ObjCBridgeRelatedAttr *ObjCBAttr = ObjCBridgeRelatedAttrFromType(T, TDNDecl);<br>
  Â if (!ObjCBAttr)<br>
@@ -3832,20 +3832,24 @@ bool Sema::checkObjCBridgeRelatedCompone<br>
  Â LookupResult R(*this, DeclarationName(RCId), SourceLocation(),<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Sema::LookupOrdinaryName);<br>
  Â if (!LookupName(R, TUScope)) {<br>
-  Â  Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId<br>
-  Â  Â  Â  Â  << SrcType << DestType;<br>
-  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  if (Diagnose) {<br>
+  Â  Â  Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId<br>
+  Â  Â  Â  Â  Â  << SrcType << DestType;<br>
+  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  }<br>
  Â  Â return false;<br>
  Â }<br>
  Â Target = R.getFoundDecl();<br>
  Â if (Target && isa<ObjCInterfaceDecl>(Target))<br>
  Â  Â RelatedClass = cast<ObjCInterfaceDecl>(Target);<br>
  Â else {<br>
-  Â  Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId<br>
-  Â  Â  Â  Â  << SrcType << DestType;<br>
-  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
-  Â  if (Target)<br>
-  Â  Â  Diag(Target->getLocStart(), diag::note_declared_at);<br>
+  Â  if (Diagnose) {<br>
+  Â  Â  Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId<br>
+  Â  Â  Â  Â  Â  << SrcType << DestType;<br>
+  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  if (Target)<br>
+  Â  Â  Â  Diag(Target->getLocStart(), diag::note_declared_at);<br>
+  Â  }<br>
  Â  Â return false;<br>
  Â }<br>
<br>
@@ -3854,9 +3858,11 @@ bool Sema::checkObjCBridgeRelatedCompone<br>
  Â  Â Selector Sel = Context.Selectors.getUnarySelector(CMId);<br>
  Â  Â ClassMethod = RelatedClass->lookupMethod(Sel, false);<br>
  Â  Â if (!ClassMethod) {<br>
-  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
-  Â  Â  Â  Â  Â  << SrcType << DestType << Sel << false;<br>
-  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  if (Diagnose) {<br>
+  Â  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
+  Â  Â  Â  Â  Â  Â  << SrcType << DestType << Sel << false;<br>
+  Â  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  }<br>
  Â  Â  Â return false;<br>
  Â  Â }<br>
  Â }<br>
@@ -3866,9 +3872,11 @@ bool Sema::checkObjCBridgeRelatedCompone<br>
  Â  Â Selector Sel = Context.Selectors.getNullarySelector(IMId);<br>
  Â  Â InstanceMethod = RelatedClass->lookupMethod(Sel, true);<br>
  Â  Â if (!InstanceMethod) {<br>
-  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
-  Â  Â  Â  Â  Â  << SrcType << DestType << Sel << true;<br>
-  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  if (Diagnose) {<br>
+  Â  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
+  Â  Â  Â  Â  Â  Â  << SrcType << DestType << Sel << true;<br>
+  Â  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  }<br>
  Â  Â  Â return false;<br>
  Â  Â }<br>
  Â }<br>
@@ -3878,7 +3886,7 @@ bool Sema::checkObjCBridgeRelatedCompone<br>
 bool<br>
 Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â QualType DestType, QualType SrcType,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Expr *&SrcExpr) {<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Expr *&SrcExpr, bool Diagnose) {<br>
  Â ARCConversionTypeClass rhsExprACTC = classifyTypeForARCConversion(SrcType);<br>
  Â ARCConversionTypeClass lhsExprACTC = classifyTypeForARCConversion(DestType);<br>
  Â bool CfToNs = (rhsExprACTC == ACTC_coreFoundation && lhsExprACTC == ACTC_retainable);<br>
@@ -3891,27 +3899,29 @@ Sema::CheckObjCBridgeRelatedConversions(<br>
  Â ObjCMethodDecl *InstanceMethod = nullptr;<br>
  Â TypedefNameDecl *TDNDecl = nullptr;<br>
  Â if (!checkObjCBridgeRelatedComponents(Loc, DestType, SrcType, RelatedClass,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ClassMethod, InstanceMethod, TDNDecl, CfToNs))<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ClassMethod, InstanceMethod, TDNDecl,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CfToNs, Diagnose))<br>
  Â  Â return false;<br>
<br>
  Â if (CfToNs) {<br>
  Â  Â // Implicit conversion from CF to ObjC object is needed.<br>
  Â  Â if (ClassMethod) {<br>
-  Â  Â  std::string ExpressionString = "[";<br>
-  Â  Â  ExpressionString += RelatedClass->getNameAsString();<br>
-  Â  Â  ExpressionString += " ";<br>
-  Â  Â  ExpressionString += ClassMethod->getSelector().getAsString();<br>
-  Â  Â  SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());<br>
-  Â  Â  // Provide a fixit: [RelatedClass ClassMethod SrcExpr]<br>
-  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
-  Â  Â  Â  << SrcType << DestType << ClassMethod->getSelector() << false<br>
-  Â  Â  Â  << FixItHint::CreateInsertion(SrcExpr->getLocStart(), ExpressionString)<br>
-  Â  Â  Â  << FixItHint::CreateInsertion(SrcExprEndLoc, "]");<br>
-  Â  Â  Diag(RelatedClass->getLocStart(), diag::note_declared_at);<br>
-  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  if (Diagnose) {<br>
+  Â  Â  Â  std::string ExpressionString = "[";<br>
+  Â  Â  Â  ExpressionString += RelatedClass->getNameAsString();<br>
+  Â  Â  Â  ExpressionString += " ";<br>
+  Â  Â  Â  ExpressionString += ClassMethod->getSelector().getAsString();<br>
+  Â  Â  Â  SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());<br>
+  Â  Â  Â  // Provide a fixit: [RelatedClass ClassMethod SrcExpr]<br>
+  Â  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
+  Â  Â  Â  Â  << SrcType << DestType << ClassMethod->getSelector() << false<br>
+  Â  Â  Â  Â  << FixItHint::CreateInsertion(SrcExpr->getLocStart(), ExpressionString)<br>
+  Â  Â  Â  Â  << FixItHint::CreateInsertion(SrcExprEndLoc, "]");<br>
+  Â  Â  Â  Diag(RelatedClass->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  }<br>
<br>
-  Â  Â  QualType receiverType =<br>
-  Â  Â  Â  Context.getObjCInterfaceType(RelatedClass);<br>
+  Â  Â  QualType receiverType = Context.getObjCInterfaceType(RelatedClass);<br>
  Â  Â  Â // Argument.<br>
  Â  Â  Â Expr *args[] = { SrcExpr };<br>
  Â  Â  Â ExprResult msg = BuildClassMessageImplicit(receiverType, false,<br>
@@ -3925,30 +3935,34 @@ Sema::CheckObjCBridgeRelatedConversions(<br>
  Â else {<br>
  Â  Â // Implicit conversion from ObjC type to CF object is needed.<br>
  Â  Â if (InstanceMethod) {<br>
-  Â  Â  std::string ExpressionString;<br>
-  Â  Â  SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());<br>
-  Â  Â  if (InstanceMethod->isPropertyAccessor())<br>
-  Â  Â  Â  if (const ObjCPropertyDecl *PDecl = InstanceMethod->findPropertyDecl()) {<br>
-  Â  Â  Â  Â  // fixit: ObjectExpr.propertyname when it is  aproperty accessor.<br>
-  Â  Â  Â  Â  ExpressionString = ".";<br>
-  Â  Â  Â  Â  ExpressionString += PDecl->getNameAsString();<br>
+  Â  Â  if (Diagnose) {<br>
+  Â  Â  Â  std::string ExpressionString;<br>
+  Â  Â  Â  SourceLocation SrcExprEndLoc =<br>
+  Â  Â  Â  Â  Â  getLocForEndOfToken(SrcExpr->getLocEnd());<br>
+  Â  Â  Â  if (InstanceMethod->isPropertyAccessor())<br>
+  Â  Â  Â  Â  if (const ObjCPropertyDecl *PDecl =<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  InstanceMethod->findPropertyDecl()) {<br>
+  Â  Â  Â  Â  Â  // fixit: ObjectExpr.propertyname when it is  aproperty accessor.<br>
+  Â  Â  Â  Â  Â  ExpressionString = ".";<br>
+  Â  Â  Â  Â  Â  ExpressionString += PDecl->getNameAsString();<br>
+  Â  Â  Â  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
+  Â  Â  Â  Â  Â  Â  Â  << SrcType << DestType << InstanceMethod->getSelector() << true<br>
+  Â  Â  Â  Â  Â  Â  Â  << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);<br>
+  Â  Â  Â  Â  }<br>
+  Â  Â  Â  if (ExpressionString.empty()) {<br>
+  Â  Â  Â  Â  // Provide a fixit: [ObjectExpr InstanceMethod]<br>
+  Â  Â  Â  Â  ExpressionString = " ";<br>
+  Â  Â  Â  Â  ExpressionString += InstanceMethod->getSelector().getAsString();<br>
+  Â  Â  Â  Â  ExpressionString += "]";<br>
+<br>
  Â  Â  Â  Â  Â Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
-  Â  Â  Â  Â  << SrcType << DestType << InstanceMethod->getSelector() << true<br>
-  Â  Â  Â  Â  << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);<br>
+  Â  Â  Â  Â  Â  Â  << SrcType << DestType << InstanceMethod->getSelector() << true<br>
+  Â  Â  Â  Â  Â  Â  << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")<br>
+  Â  Â  Â  Â  Â  Â  << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);<br>
  Â  Â  Â  Â }<br>
-  Â  Â  if (ExpressionString.empty()) {<br>
-  Â  Â  Â  // Provide a fixit: [ObjectExpr InstanceMethod]<br>
-  Â  Â  Â  ExpressionString = " ";<br>
-  Â  Â  Â  ExpressionString += InstanceMethod->getSelector().getAsString();<br>
-  Â  Â  Â  ExpressionString += "]";<br>
-<br>
-  Â  Â  Â  Diag(Loc, diag::err_objc_bridged_related_known_method)<br>
-  Â  Â  Â  << SrcType << DestType << InstanceMethod->getSelector() << true<br>
-  Â  Â  Â  << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")<br>
-  Â  Â  Â  << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);<br>
+  Â  Â  Â  Diag(RelatedClass->getLocStart(), diag::note_declared_at);<br>
+  Â  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
  Â  Â  Â }<br>
-  Â  Â  Diag(RelatedClass->getLocStart(), diag::note_declared_at);<br>
-  Â  Â  Diag(TDNDecl->getLocStart(), diag::note_declared_at);<br>
<br>
  Â  Â  Â ExprResult msg =<br>
  Â  Â  Â  Â BuildInstanceMessageImplicit(SrcExpr, SrcType,<br>
@@ -3965,6 +3979,7 @@ Sema::CheckObjCBridgeRelatedConversions(<br>
 Sema::ARCConversionResult<br>
 Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Expr *&castExpr, CheckedConversionKind CCK,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bool Diagnose,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool DiagnoseCFAudited,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  BinaryOperatorKind Opc) {<br>
  Â QualType castExprType = castExpr->getType();<br>
@@ -3980,9 +3995,9 @@ Sema::CheckObjCARCConversion(SourceRange<br>
  Â if (exprACTC == castACTC) {<br>
  Â  Â // check for viablity and report error if casting an rvalue to a<br>
  Â  Â // life-time qualifier.<br>
-  Â  if ((castACTC == ACTC_retainable) &&<br>
+  Â  if (Diagnose && castACTC == ACTC_retainable &&<br>
  Â  Â  Â  Â (CCK == CCK_CStyleCast || CCK == CCK_OtherCast) &&<br>
-  Â  Â  Â  (castType != castExprType)) {<br>
+  Â  Â  Â  castType != castExprType) {<br>
  Â  Â  Â const Type *DT = castType.getTypePtr();<br>
  Â  Â  Â QualType QDT = castType;<br>
  Â  Â  Â // We desugar some types but not others. We ignore those<br>
@@ -4051,19 +4066,20 @@ Sema::CheckObjCARCConversion(SourceRange<br>
  Â // to 'NSString *'. Let caller issue a normal mismatched diagnostic with<br>
  Â // suitable fix-it.<br>
  Â if (castACTC == ACTC_retainable && exprACTC == ACTC_none &&<br>
-  Â  Â  ConversionToObjCStringLiteralCheck(castType, castExpr))<br>
+  Â  Â  ConversionToObjCStringLiteralCheck(castType, castExpr, Diagnose))<br>
  Â  Â return ACR_okay;<br>
<br>
  Â // Do not issue "bridge cast" diagnostic when implicit casting<br>
  Â // a retainable object to a CF type parameter belonging to an audited<br>
  Â // CF API function. Let caller issue a normal type mismatched diagnostic<br>
  Â // instead.<br>
-  if (!DiagnoseCFAudited || exprACTC != ACTC_retainable ||<br>
-  Â  Â  castACTC != ACTC_coreFoundation)<br>
+  if (Diagnose &&<br>
+  Â  Â  (!DiagnoseCFAudited || exprACTC != ACTC_retainable ||<br>
+  Â  Â  Â  castACTC != ACTC_coreFoundation))<br>
  Â  Â if (!(exprACTC == ACTC_voidPtr && castACTC == ACTC_retainable &&<br>
  Â  Â  Â  Â  Â (Opc == BO_NE || Opc == BO_EQ)))<br>
-  Â  Â  diagnoseObjCARCConversion(*this, castRange, castType, castACTC,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  castExpr, castExpr, exprACTC, CCK);<br>
+  Â  Â  diagnoseObjCARCConversion(*this, castRange, castType, castACTC, castExpr,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  castExpr, exprACTC, CCK);<br>
  Â return ACR_okay;<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaOverload.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=257710&r1=257709&r2=257710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=257710&r1=257709&r2=257710&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Wed Jan 13 17:36:34 2016<br>
@@ -2687,15 +2687,16 @@ bool Sema::FunctionParamTypesAreEqual(co<br>
 bool Sema::CheckPointerConversion(Expr *From, QualType ToType,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CastKind &Kind,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CXXCastPath& BasePath,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool IgnoreBaseAccess) {<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool IgnoreBaseAccess,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bool Diagnose) {<br>
  Â QualType FromType = From->getType();<br>
  Â bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;<br>
<br>
  Â Kind = CK_BitCast;<br>
<br>
-  if (!IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() &&<br>
+  if (Diagnose && !IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() &&<br>
  Â  Â  Â From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) ==<br>
-  Â  Â  Expr::NPCK_ZeroExpression) {<br>
+  Â  Â  Â  Â  Expr::NPCK_ZeroExpression) {<br>
  Â  Â if (Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy))<br>
  Â  Â  Â DiagRuntimeBehavior(From->getExprLoc(), From,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â PDiag(diag::warn_impcast_bool_to_null_pointer)<br>
@@ -2713,18 +2714,24 @@ bool Sema::CheckPointerConversion(Expr *<br>
  Â  Â  Â  Â  Â !Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {<br>
  Â  Â  Â  Â // We must have a derived-to-base conversion. Check an<br>
  Â  Â  Â  Â // ambiguous or inaccessible conversion.<br>
-  Â  Â  Â  if (CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â From->getExprLoc(),<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â From->getSourceRange(), &BasePath,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â IgnoreBaseAccess))<br>
+  Â  Â  Â  unsigned InaccessibleID = 0;<br>
+  Â  Â  Â  unsigned AmbigiousID = 0;<br>
+  Â  Â  Â  if (Diagnose) {<br>
+  Â  Â  Â  Â  InaccessibleID = diag::err_upcast_to_inaccessible_base;<br>
+  Â  Â  Â  Â  AmbigiousID = diag::err_ambiguous_derived_to_base_conv;<br>
+  Â  Â  Â  }<br>
+  Â  Â  Â  if (CheckDerivedToBaseConversion(<br>
+  Â  Â  Â  Â  Â  Â  Â  FromPointeeType, ToPointeeType, InaccessibleID, AmbigiousID,<br>
+  Â  Â  Â  Â  Â  Â  Â  From->getExprLoc(), From->getSourceRange(), DeclarationName(),<br>
+  Â  Â  Â  Â  Â  Â  Â  &BasePath, IgnoreBaseAccess))<br>
  Â  Â  Â  Â  Â return true;<br>
<br>
  Â  Â  Â  Â // The conversion was successful.<br>
  Â  Â  Â  Â Kind = CK_DerivedToBase;<br>
  Â  Â  Â }<br>
<br>
-  Â  Â  if (!IsCStyleOrFunctionalCast && FromPointeeType->isFunctionType() &&<br>
-  Â  Â  Â  Â  ToPointeeType->isVoidType()) {<br>
+  Â  Â  if (Diagnose && !IsCStyleOrFunctionalCast &&<br>
+  Â  Â  Â  Â  FromPointeeType->isFunctionType() && ToPointeeType->isVoidType()) {<br>
  Â  Â  Â  Â assert(getLangOpts().MSVCCompat &&<br>
  Â  Â  Â  Â  Â  Â  Â  "this should only be possible with MSVCCompat!");<br>
  Â  Â  Â  Â Diag(From->getExprLoc(), diag::ext_ms_impcast_fn_obj)<br>
<br>
Added: cfe/trunk/test/SemaObjC/ovl-check.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/ovl-check.m?rev=257710&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/ovl-check.m?rev=257710&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaObjC/ovl-check.m (added)<br>
+++ cfe/trunk/test/SemaObjC/ovl-check.m Wed Jan 13 17:36:34 2016<br>
@@ -0,0 +1,55 @@<br>
+// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -verify %s -fobjc-arc<br>
+//<br>
+// These tests exist as a means to help ensure that diagnostics aren't printed<br>
+// in overload resolution in ObjC.<br>
+<br>
+struct Type1 { int a; };<br>
+@interface Iface1 @end<br>
+<br>
+@interface NeverCalled<br>
+- (void) test:(struct Type1 *)arg;<br>
+@end<br>
+<br>
+@interface TakesIface1<br>
+- (void) test:(Iface1 *)arg;<br>
+@end<br>
+<br>
+// PR26085, rdar://problem/24111333<br>
+void testTakesIface1(id x, Iface1 *arg) {<br>
+  // This should resolve silently to `TakesIface1`.<br>
+  [x test:arg];<br>
+}<br>
+<br>
+@class NSString;<br>
+@interface NeverCalledv2<br>
+- (void) testStr:(NSString *)arg;<br>
+@end<br>
+<br>
+@interface TakesVanillaConstChar<br>
+- (void) testStr:(const void *)a;<br>
+@end<br>
+<br>
+// Not called out explicitly by PR26085, but related.<br>
+void testTakesNSString(id x) {<br>
+  // Overload resolution should not emit a diagnostic about needing to add an<br>
+  // '@' before "someStringLiteral".<br>
+  [x testStr:"someStringLiteral"];<br>
+}<br>
+<br>
+typedef const void *CFTypeRef;<br>
+id CreateSomething();<br>
+<br>
+@interface NeverCalledv3<br>
+- (void) testCFTypeRef:(struct Type1 *)arg;<br>
+@end<br>
+<br>
+@interface TakesCFTypeRef<br>
+- (void) testCFTypeRef:(CFTypeRef)arg;<br>
+@end<br>
+<br>
+// Not called out explicitly by PR26085, but related.<br>
+void testTakesCFTypeRef(id x) {<br>
+  // Overload resolution should occur silently, select the CFTypeRef overload,<br>
+  // and produce a single complaint. (with notes)<br>
+  [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}}<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>