diff options
author | Ilya Biryukov <ibiryukov@google.com> | 2018-03-09 14:43:29 +0000 |
---|---|---|
committer | Ilya Biryukov <ibiryukov@google.com> | 2018-03-09 14:43:29 +0000 |
commit | 1a1dffd27585fc97c22acae9628c781060a7afc8 (patch) | |
tree | bd1946550b90c702d0ebc5a4dd5f6e1c39a373c0 /clang/lib/Sema/SemaOverload.cpp | |
parent | ef624fecdd2bf4c122afaaf32c84cb0c5a45de20 (diff) | |
download | bcm5719-llvm-1a1dffd27585fc97c22acae9628c781060a7afc8.tar.gz bcm5719-llvm-1a1dffd27585fc97c22acae9628c781060a7afc8.zip |
[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
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 2c03f6977aa..ae29e7e20ae 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -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()); |