diff options
author | Francisco Lopes da Silva <oblita@gmail.com> | 2015-01-25 08:47:59 +0000 |
---|---|---|
committer | Francisco Lopes da Silva <oblita@gmail.com> | 2015-01-25 08:47:59 +0000 |
commit | a349a8aee9404751fbe39a589ea814279ca340f3 (patch) | |
tree | 13bd95b262795ad11b1a919db02b2b1180ef0c10 /clang/lib/Sema/SemaCodeComplete.cpp | |
parent | e3155c96ee41902742fffcfb46ae5b4dcb3aa0eb (diff) | |
download | llvm-a349a8aee9404751fbe39a589ea814279ca340f3.zip llvm-a349a8aee9404751fbe39a589ea814279ca340f3.tar.gz llvm-a349a8aee9404751fbe39a589ea814279ca340f3.tar.bz2 |
Sema: require a complete type before lookup.
llvm-svn: 227037
Diffstat (limited to 'clang/lib/Sema/SemaCodeComplete.cpp')
-rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index aa8629c..b965e70 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -3946,17 +3946,20 @@ void Sema::CodeCompleteCall(Scope *S, Expr *Fn, ArrayRef<Expr *> Args) { } else if (auto DC = NakedFn->getType()->getAsCXXRecordDecl()) { // If expression's type is CXXRecordDecl, it may overload the function // call operator, so we check if it does and add them as candidates. - DeclarationName OpName = Context.DeclarationNames - .getCXXOperatorName(OO_Call); - LookupResult R(*this, OpName, Loc, LookupOrdinaryName); - LookupQualifiedName(R, DC); - R.suppressDiagnostics(); - SmallVector<Expr *, 12> ArgExprs(1, NakedFn); - ArgExprs.append(Args.begin(), Args.end()); - AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet, - /*ExplicitArgs=*/nullptr, - /*SuppressUsedConversions=*/false, - /*PartialOverloading=*/true); + // A complete type is needed to lookup for member function call operators. + if(!RequireCompleteType(Loc, NakedFn->getType(), 0)) { + DeclarationName OpName = Context.DeclarationNames + .getCXXOperatorName(OO_Call); + LookupResult R(*this, OpName, Loc, LookupOrdinaryName); + LookupQualifiedName(R, DC); + R.suppressDiagnostics(); + SmallVector<Expr *, 12> ArgExprs(1, NakedFn); + ArgExprs.append(Args.begin(), Args.end()); + AddFunctionCandidates(R.asUnresolvedSet(), ArgExprs, CandidateSet, + /*ExplicitArgs=*/nullptr, + /*SuppressUsedConversions=*/false, + /*PartialOverloading=*/true); + } } else { // Lastly we check whether expression's type is function pointer or // function. |