diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2013-12-16 22:54:37 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-12-16 22:54:37 +0000 |
commit | 381edf5759d163eb1fb0517891b60379543ec4f0 (patch) | |
tree | 924e0d88e335be090d6c704da1c43e2c88ea4dfd /clang/lib/Sema | |
parent | 04c685b5e4da7c86d8336a41f9e4cf1ab9a96795 (diff) | |
download | bcm5719-llvm-381edf5759d163eb1fb0517891b60379543ec4f0.tar.gz bcm5719-llvm-381edf5759d163eb1fb0517891b60379543ec4f0.zip |
ObjectiveC. Further improvements of use
of objc_bridge_related attribute; eliminate
unnecessary diagnostics which is issued elsewhere,
fixit now produces a valid AST tree per convention.
This results in some simplification in handling of
this attribute as well. // rdar://15499111
llvm-svn: 197436
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 38 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 4 |
4 files changed, 40 insertions, 23 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d1e3c1f41e2..e4a6102b067 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -6612,6 +6612,13 @@ Sema::CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, if (getLangOpts().ObjCAutoRefCount) CheckObjCARCConversion(SourceRange(), Ty, E, CCK_ImplicitConversion, DiagnoseCFAudited); + if (getLangOpts().ObjC1 && + CheckObjCBridgeRelatedConversions(E->getLocStart(), + LHSType, E->getType(), E)) { + RHS = Owned(E); + return Compatible; + } + RHS = ImpCastExprToType(E, Ty, Kind); } return result; @@ -10648,9 +10655,6 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, MayHaveConvFixit = true; break; case IncompatiblePointer: - if (getLangOpts().ObjC1 && - CheckObjCBridgeRelatedConversions(Loc, DstType, SrcType, SrcExpr)) - return false; MakeObjCStringLiteralFixItHint(*this, DstType, SrcExpr, Hint, IsNSString); DiagKind = (Action == AA_Passing_CFAudited ? @@ -10730,9 +10734,6 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, DiagKind = diag::err_arc_weak_unavailable_assign; break; case Incompatible: - if (getLangOpts().ObjC1 && - CheckObjCBridgeRelatedConversions(Loc, DstType, SrcType, SrcExpr)) - return true; DiagKind = diag::err_typecheck_convert_incompatible; ConvHints.tryToFixConversion(SrcExpr, SrcType, DstType, *this); MayHaveConvFixit = true; diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 9211772a01d..905c080e47d 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -3431,7 +3431,7 @@ bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc, bool Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, - Expr *SrcExpr) { + Expr *&SrcExpr) { ARCConversionTypeClass rhsExprACTC = classifyTypeForARCConversion(SrcType); ARCConversionTypeClass lhsExprACTC = classifyTypeForARCConversion(DestType); bool CfToNs = (rhsExprACTC == ACTC_coreFoundation && lhsExprACTC == ACTC_retainable); @@ -3460,12 +3460,20 @@ Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, << 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); + // Argument. + Expr *args[] = { SrcExpr }; + ExprResult msg = BuildClassMessageImplicit(receiverType, false, + ClassMethod->getLocation(), + ClassMethod->getSelector(), ClassMethod, + MultiExprArg(args, 1)); + SrcExpr = msg.take(); + return true; } - else - Diag(Loc, diag::err_objc_bridged_related_unknown_method) - << SrcType << DestType; - Diag(RelatedClass->getLocStart(), diag::note_declared_at); - Diag(TDNDecl->getLocStart(), diag::note_declared_at); } else { // Implicit conversion from ObjC type to CF object is needed. @@ -3492,15 +3500,19 @@ Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, << FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[") << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString); } + Diag(RelatedClass->getLocStart(), diag::note_declared_at); + Diag(TDNDecl->getLocStart(), diag::note_declared_at); + + ExprResult msg = + BuildInstanceMessageImplicit(SrcExpr, SrcType, + InstanceMethod->getLocation(), + InstanceMethod->getSelector(), + InstanceMethod, None); + SrcExpr = msg.take(); + return true; } - else - Diag(Loc, diag::err_objc_bridged_related_unknown_method) - << SrcType << DestType; - Diag(RelatedClass->getLocStart(), diag::note_declared_at); - Diag(TDNDecl->getLocStart(), diag::note_declared_at); } - - return true; + return false; } Sema::ARCConversionResult diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 4a67ae7b9ae..95456e52cc7 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -4462,6 +4462,11 @@ 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 (!isa<InitListExpr>(Initializer)) SourceType = Initializer->getType(); } @@ -6482,9 +6487,6 @@ bool InitializationSequence::Diagnose(Sema &S, case FK_ConversionFailed: { QualType FromType = Args[0]->getType(); - if (S.getLangOpts().ObjC1) - S.CheckObjCBridgeRelatedConversions(Kind.getLocation(), - DestType, FromType, Args[0]); PartialDiagnostic PDiag = S.PDiag(diag::err_init_conversion_failed) << (int)Entity.getKind() << DestType diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 3c5caa5b98f..13337480b0a 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -1298,7 +1298,9 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType, bool AllowObjCWritebackConversion = getLangOpts().ObjCAutoRefCount && (Action == AA_Passing || Action == AA_Sending); - + if (getLangOpts().ObjC1) + CheckObjCBridgeRelatedConversions(From->getLocStart(), + ToType, From->getType(), From); ICS = clang::TryImplicitConversion(*this, From, ToType, /*SuppressUserConversions=*/false, AllowExplicit, |