[SemaOverload] Fixed crash on code completion

Summary:
The relevant failing assertion message is:
../tools/clang/lib/Sema/SemaInit.cpp:8411: PerformCopyInitialization(): Assertion `InitE && "No initialization expression?"' failed.

See the added test case for a repro.

Reviewers: bkramer, sammccall, ioeric, hokein

Reviewed By: sammccall

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D44300

llvm-svn: 327134
This commit is contained in:
Ilya Biryukov 2018-03-09 14:43:29 +00:00
parent ef624fecdd
commit 1a1dffd275
2 changed files with 19 additions and 6 deletions

View File

@ -6245,12 +6245,17 @@ convertArgsForAvailabilityChecks(Sema &S, FunctionDecl *Function, Expr *ThisArg,
if (!Function->isVariadic() && Args.size() < Function->getNumParams()) {
for (unsigned i = Args.size(), e = Function->getNumParams(); i != e; ++i) {
ParmVarDecl *P = Function->getParamDecl(i);
ExprResult R = S.PerformCopyInitialization(
InitializedEntity::InitializeParameter(S.Context,
Function->getParamDecl(i)),
SourceLocation(),
P->hasUninstantiatedDefaultArg() ? P->getUninstantiatedDefaultArg()
: P->getDefaultArg());
Expr *DefArg = P->hasUninstantiatedDefaultArg()
? P->getUninstantiatedDefaultArg()
: P->getDefaultArg();
// This can only happen in code completion, i.e. when PartialOverloading
// is true.
if (!DefArg)
return false;
ExprResult R =
S.PerformCopyInitialization(InitializedEntity::InitializeParameter(
S.Context, Function->getParamDecl(i)),
SourceLocation(), DefArg);
if (R.isInvalid())
return false;
ConvertedArgs.push_back(R.get());

View File

@ -0,0 +1,8 @@
int foo(bool x) __attribute__((enable_if(x, "")));
int test() {
bool fffffff;
// RUN: %clang_cc1 -std=c++11 -code-completion-at=%s:7:8 %s | FileCheck %s
// CHECK: COMPLETION: fffffff : [#bool#]fffffff
foo(ff
}