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/Sema/SemaExpr.cpp | |
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/Sema/SemaExpr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 23 |
1 files changed, 12 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: |