Teach code-completion to deal with calls to functions without prototypes.
llvm-svn: 94076
This commit is contained in:
parent
232085d50a
commit
ff59f676d0
|
|
@ -2234,30 +2234,36 @@ void Sema::CodeCompleteCall(Scope *S, ExprTy *FnIn,
|
|||
// FIXME: What if we're calling a pseudo-destructor?
|
||||
// FIXME: What if we're calling a member function?
|
||||
|
||||
typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
|
||||
llvm::SmallVector<ResultCandidate, 8> Results;
|
||||
|
||||
Expr *NakedFn = Fn->IgnoreParenCasts();
|
||||
if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
|
||||
AddOverloadedCallCandidates(ULE, Args, NumArgs, CandidateSet,
|
||||
/*PartialOverloading=*/ true);
|
||||
else if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
|
||||
FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
|
||||
if (FDecl)
|
||||
AddOverloadCandidate(FDecl, Args, NumArgs, CandidateSet,
|
||||
false, false, /*PartialOverloading*/ true);
|
||||
if (FDecl) {
|
||||
if (!FDecl->getType()->getAs<FunctionProtoType>())
|
||||
Results.push_back(ResultCandidate(FDecl));
|
||||
else
|
||||
AddOverloadCandidate(FDecl, Args, NumArgs, CandidateSet,
|
||||
false, false, /*PartialOverloading*/ true);
|
||||
}
|
||||
}
|
||||
|
||||
// Sort the overload candidate set by placing the best overloads first.
|
||||
std::stable_sort(CandidateSet.begin(), CandidateSet.end(),
|
||||
IsBetterOverloadCandidate(*this));
|
||||
if (!CandidateSet.empty()) {
|
||||
// Sort the overload candidate set by placing the best overloads first.
|
||||
std::stable_sort(CandidateSet.begin(), CandidateSet.end(),
|
||||
IsBetterOverloadCandidate(*this));
|
||||
|
||||
// Add the remaining viable overload candidates as code-completion reslults.
|
||||
typedef CodeCompleteConsumer::OverloadCandidate ResultCandidate;
|
||||
llvm::SmallVector<ResultCandidate, 8> Results;
|
||||
|
||||
for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
|
||||
CandEnd = CandidateSet.end();
|
||||
Cand != CandEnd; ++Cand) {
|
||||
if (Cand->Viable)
|
||||
Results.push_back(ResultCandidate(Cand->Function));
|
||||
// Add the remaining viable overload candidates as code-completion reslults.
|
||||
for (OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
|
||||
CandEnd = CandidateSet.end();
|
||||
Cand != CandEnd; ++Cand) {
|
||||
if (Cand->Viable)
|
||||
Results.push_back(ResultCandidate(Cand->Function));
|
||||
}
|
||||
}
|
||||
|
||||
if (Results.empty())
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
// Note: the run lines follow their respective tests, since line/column
|
||||
// matter in this test.
|
||||
void f0(float x, float y);
|
||||
void f1();
|
||||
void test() {
|
||||
f0(0, 0);
|
||||
g0(0, 0);
|
||||
f1(0, 0);
|
||||
// RUN: %clang_cc1 -std=c89 -fsyntax-only -code-completion-at=%s:6:6 %s -o - | FileCheck -check-prefix=CC1 %s
|
||||
// CHECK-CC1: f0(<#float x#>, float y)
|
||||
// RUN: %clang_cc1 -std=c89 -fsyntax-only -code-completion-at=%s:6:9 %s -o - | FileCheck -check-prefix=CC2 %s
|
||||
// CHECK-CC2: f0(float x, <#float y#>)
|
||||
// RUN: %clang_cc1 -std=c89 -fsyntax-only -code-completion-at=%s:8:6 %s -o - | FileCheck -check-prefix=CC3 %s
|
||||
// CHECK-CC3: f1()
|
||||
}
|
||||
Loading…
Reference in New Issue