diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-12-18 21:04:43 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-12-18 21:04:43 +0000 |
commit | 283bf89506603c88496d3cdf87dc0359289b1fa2 (patch) | |
tree | a8be8ac6f3628016045b1a97659239743eae5840 /clang/lib/Sema | |
parent | afa854c15e35644c63018d397575906a5dc56c18 (diff) | |
download | bcm5719-llvm-283bf89506603c88496d3cdf87dc0359289b1fa2.tar.gz bcm5719-llvm-283bf89506603c88496d3cdf87dc0359289b1fa2.zip |
Objective-C. After providing a fix-it for a
cstring, converted to NSString, produce the
matching AST for it. This also required some
refactoring of the previous code. // rdar://14106083
llvm-svn: 197605
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 35 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 13 |
3 files changed, 26 insertions, 32 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0597a998c47..fcd972436da 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -6613,8 +6613,9 @@ Sema::CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, CheckObjCARCConversion(SourceRange(), Ty, E, CCK_ImplicitConversion, DiagnoseCFAudited); if (getLangOpts().ObjC1 && - CheckObjCBridgeRelatedConversions(E->getLocStart(), - LHSType, E->getType(), E)) { + (CheckObjCBridgeRelatedConversions(E->getLocStart(), + LHSType, E->getType(), E) || + ConversionToObjCStringLiteralCheck(LHSType, E))) { RHS = Owned(E); return Compatible; } @@ -10587,39 +10588,37 @@ ExprResult Sema::ActOnGNUNullExpr(SourceLocation TokenLoc) { return Owned(new (Context) GNUNullExpr(Ty, TokenLoc)); } -StringLiteral * -Sema::ConversionToObjCStringLiteralCheck(QualType DstType, - Expr *SrcExpr, FixItHint &Hint, - bool &IsNSString) { +bool +Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&Exp) { if (!getLangOpts().ObjC1) - return 0; + return false; const ObjCObjectPointerType *PT = DstType->getAs<ObjCObjectPointerType>(); if (!PT) - return 0; + return false; - // 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 0; - IsNSString = true; + return false; } - + // Ignore any parens, implicit casts (should only be // array-to-pointer decays), and not-so-opaque values. The last is // important for making this trigger for property assignments. - SrcExpr = SrcExpr->IgnoreParenImpCasts(); + Expr *SrcExpr = Exp->IgnoreParenImpCasts(); if (OpaqueValueExpr *OV = dyn_cast<OpaqueValueExpr>(SrcExpr)) if (OV->getSourceExpr()) SrcExpr = OV->getSourceExpr()->IgnoreParenImpCasts(); StringLiteral *SL = dyn_cast<StringLiteral>(SrcExpr); if (!SL || !SL->isAscii()) - return 0; - Hint = FixItHint::CreateInsertion(SL->getLocStart(), "@"); - return SL; + return false; + Diag(SL->getLocStart(), diag::err_missing_atsign_prefix) + << FixItHint::CreateInsertion(SL->getLocStart(), "@"); + Exp = BuildObjCStringLiteral(SL->getLocStart(), SL).take(); + return true; } bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, @@ -10638,7 +10637,6 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, ConversionFixItGenerator ConvHints; bool MayHaveConvFixit = false; bool MayHaveFunctionDiff = false; - bool IsNSString = false; switch (ConvTy) { case Compatible: @@ -10656,7 +10654,6 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, MayHaveConvFixit = true; break; case IncompatiblePointer: - ConversionToObjCStringLiteralCheck(DstType, SrcExpr, Hint, IsNSString); DiagKind = (Action == AA_Passing_CFAudited ? diag::err_arc_typecheck_convert_incompatible_pointer : @@ -10670,8 +10667,6 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SrcType = SrcType.getUnqualifiedType(); DstType = DstType.getUnqualifiedType(); } - else if (IsNSString && !Hint.isNull()) - 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 f312839a9d2..8f0b90b3be2 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -3615,13 +3615,9 @@ Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType, // 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; - } + if (castACTC == ACTC_retainable && exprACTC == ACTC_none && + ConversionToObjCStringLiteralCheck(castType, castExpr)) + return ACR_okay; // Do not issue "bridge cast" diagnostic when implicit casting // a retainable object to a CF type parameter belonging to an audited diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 95456e52cc7..9ba873a0780 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -4462,11 +4462,14 @@ void InitializationSequence::InitializeFrom(Sema &S, Expr *Initializer = 0; if (Args.size() == 1) { Initializer = Args[0]; - if (S.getLangOpts().ObjC1 && - S.CheckObjCBridgeRelatedConversions(Initializer->getLocStart(), - DestType, Initializer->getType(), - Initializer)) - Args[0] = Initializer; + if (S.getLangOpts().ObjC1) { + if (S.CheckObjCBridgeRelatedConversions(Initializer->getLocStart(), + DestType, Initializer->getType(), + Initializer) || + S.ConversionToObjCStringLiteralCheck(DestType, Initializer)) + Args[0] = Initializer; + + } if (!isa<InitListExpr>(Initializer)) SourceType = Initializer->getType(); } |