From c73599d64eb8ccdc14aeb865f2ef97b9fccd11b0 Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Mon, 23 Jan 2017 16:51:31 +0100 Subject: [PATCH] logic: avoided triggering clang assertion when indexing lambda with return type that is specified but has neither declaration nor definition. (issue #318) --- .../cxx/name_resolver/CxxDeclNameResolver.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp index 623e76b9..3192167b 100644 --- a/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp +++ b/src/lib_cxx/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp @@ -44,7 +44,19 @@ std::shared_ptr CxxDeclNameResolver::getName(const clang::NamedDecl (clang::isa(declaration)) && (clang::dyn_cast(declaration)->isLambda())) { - declaration = clang::dyn_cast(declaration)->getLambdaCallOperator(); + // avoid triggering assert + clang::DeclarationName Name = + clang::dyn_cast(declaration)->getASTContext().DeclarationNames.getCXXOperatorName(clang::OO_Call); + clang::DeclContext::lookup_result Calls = clang::dyn_cast(declaration)->lookup(Name); + if (Calls.empty()) + { + declaration = nullptr; + declName = std::make_shared("unsolved-lambda", std::vector()); + } + else + { + declaration = clang::dyn_cast(declaration)->getLambdaCallOperator(); + } } if (declaration)