diff options
| author | Anders Carlsson <andersca@mac.com> | 2014-02-28 19:07:22 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2014-02-28 19:07:22 +0000 |
| commit | 382ba41c4802fd3324ff8b9f775ae96fe14a466a (patch) | |
| tree | 9c1a495c943902f070de595d7cfa2a132c2e9135 /clang/lib/Sema/SemaCodeComplete.cpp | |
| parent | 6586e5d6acda639c896351a20e7861276122432c (diff) | |
| download | bcm5719-llvm-382ba41c4802fd3324ff8b9f775ae96fe14a466a.tar.gz bcm5719-llvm-382ba41c4802fd3324ff8b9f775ae96fe14a466a.zip | |
When completing Objective-C instance method invocations, perform a contextual conversion to an Objective-C pointer type of the target expression if needed. This fixes code completion of method invocations where the target is a smart pointer that has an explicit conversion operator to an Objective-C type.
llvm-svn: 202529
Diffstat (limited to 'clang/lib/Sema/SemaCodeComplete.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 00232f64b77..5369a4beb21 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -5529,7 +5529,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, // If we're messaging an expression with type "id" or "Class", check // whether we know something special about the receiver that allows // us to assume a more-specific receiver type. - if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) + if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType()) { if (ObjCInterfaceDecl *IFace = GetAssumedMessageSendExprType(RecExpr)) { if (ReceiverType->isObjCClassType()) return CodeCompleteObjCClassMessage(S, @@ -5540,6 +5540,13 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, ReceiverType = Context.getObjCObjectPointerType( Context.getObjCInterfaceType(IFace)); } + } else if (RecExpr && getLangOpts().CPlusPlus) { + ExprResult Conv = PerformContextuallyConvertToObjCPointer(RecExpr); + if (Conv.isUsable()) { + RecExpr = Conv.take(); + ReceiverType = RecExpr->getType(); + } + } // Build the set of methods we can see. ResultBuilder Results(*this, CodeCompleter->getAllocator(), |

