diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2013-12-17 19:33:43 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-12-17 19:33:43 +0000 |
| commit | bd714e9bb1204c415d192bf64d861b29c09edfce (patch) | |
| tree | 5f19a4d0b4ddf7d09e7d8547d6bbc87ae1077025 /clang/lib | |
| parent | e4083f9e8512a0ab997e5fe09e9ce18bfc453c85 (diff) | |
| download | bcm5719-llvm-bd714e9bb1204c415d192bf64d861b29c09edfce.tar.gz bcm5719-llvm-bd714e9bb1204c415d192bf64d861b29c09edfce.zip | |
Objective-C. Make diagnostics and fix-its consistent
when diagnosing casting of a cstring literal to
NSString in default and -fobjc-arc mode.
// rdar://14106083
llvm-svn: 197515
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 23 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 11 |
2 files changed, 23 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index e4a6102b067..0597a998c47 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -10587,22 +10587,23 @@ ExprResult Sema::ActOnGNUNullExpr(SourceLocation TokenLoc) { return Owned(new (Context) GNUNullExpr(Ty, TokenLoc)); } -static void MakeObjCStringLiteralFixItHint(Sema& SemaRef, QualType DstType, - Expr *SrcExpr, FixItHint &Hint, - bool &IsNSString) { - if (!SemaRef.getLangOpts().ObjC1) - return; +StringLiteral * +Sema::ConversionToObjCStringLiteralCheck(QualType DstType, + Expr *SrcExpr, FixItHint &Hint, + bool &IsNSString) { + if (!getLangOpts().ObjC1) + return 0; const ObjCObjectPointerType *PT = DstType->getAs<ObjCObjectPointerType>(); if (!PT) - return; + return 0; // Check if the destination is of type 'id'. if (!PT->isObjCIdType()) { // Check if the destination is the 'NSString' interface. const ObjCInterfaceDecl *ID = PT->getInterfaceDecl(); if (!ID || !ID->getIdentifier()->isStr("NSString")) - return; + return 0; IsNSString = true; } @@ -10616,9 +10617,9 @@ static void MakeObjCStringLiteralFixItHint(Sema& SemaRef, QualType DstType, StringLiteral *SL = dyn_cast<StringLiteral>(SrcExpr); if (!SL || !SL->isAscii()) - return; - + return 0; Hint = FixItHint::CreateInsertion(SL->getLocStart(), "@"); + return SL; } bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, @@ -10655,7 +10656,7 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, MayHaveConvFixit = true; break; case IncompatiblePointer: - MakeObjCStringLiteralFixItHint(*this, DstType, SrcExpr, Hint, IsNSString); + ConversionToObjCStringLiteralCheck(DstType, SrcExpr, Hint, IsNSString); DiagKind = (Action == AA_Passing_CFAudited ? diag::err_arc_typecheck_convert_incompatible_pointer : @@ -10670,7 +10671,7 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, DstType = DstType.getUnqualifiedType(); } else if (IsNSString && !Hint.isNull()) - DiagKind = diag::warn_missing_atsign_prefix; + DiagKind = diag::err_missing_atsign_prefix; MayHaveConvFixit = true; break; case IncompatiblePointerSign: diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 905c080e47d..f312839a9d2 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -3612,6 +3612,17 @@ Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType, CCK != CCK_ImplicitConversion) return ACR_unbridged; + // Do not issue bridge cast" diagnostic when implicit casting a cstring + // to 'NSString *'. Let caller issue a normal mismatched diagnostic with + // suitable fix-it. + if (castACTC == ACTC_retainable && exprACTC == ACTC_none) { + bool IsNSString = false; + FixItHint Hint; + if (ConversionToObjCStringLiteralCheck( + castType, castExpr, Hint, IsNSString) && IsNSString) + 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 |

