llvm / llvm/llvm-project

Clangd crash in VisitVarTemplatePartialSpecializationDecl ("Instantiation found nothing?") on code using std::expected

Open
#195,559 13 comments 0 reactions 0 assignees View on GitHub
clang:frontend clangd crash-on-invalid libstdc++
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

## log
```
I[01:29:24.599] clangd version 22.1.3
I[01:29:24.599] Features: linux
I[01:29:24.599] PID: 242916
I[01:29:24.599] Working directory: /home/me/Documents/src/clangd_crash_repr
I[01:29:24.599] argv[0]: /usr/bin/clangd
I[01:29:24.599] Starting LSP over stdin/stdout
I[01:29:24.599] <-- initialize(0)
I[01:29:24.600] --> reply:initialize(0) 0 ms
I[01:29:24.600] <-- initialized
I[01:29:24.601] <-- textDocument/didOpen
I[01:29:24.602] Loaded compilation database from /home/me/Documents/src/clangd_crash_repr/compile_commands.json
I[01:29:24.602] ASTWorker building file /home/me/Documents/src/clangd_crash_repr/main.cpp version 1 with command
[/home/me/Documents/src/clangd_crash_repr/build]
/usr/bin/g++ --driver-mode=g++ -I/home/me/Documents/src/clangd_crash_repr/platform_include -std=c++23 -o main.cpp.obj -c -resource-dir=/usr/lib/clang/22 -- /home/me/Documents/src/clangd_crash_repr/main.cpp
I[01:29:24.602] --> window/workDoneProgress/create(0)
I[01:29:24.602] Enqueueing 1 commands for indexing
I[01:29:24.602] <-- reply(0)
I[01:29:24.602] --> $/progress
I[01:29:24.602] --> $/progress
I[01:29:24.602] <-- textDocument/documentSymbol(1)
I[01:29:24.602] --> textDocument/clangd.fileStatus
I[01:29:24.605] <-- textDocument/documentLink(2)
I[01:29:24.617] --> $/progress
I[01:29:24.617] --> $/progress
I[01:29:24.754] Built preamble of size 3860184 for file /home/me/Documents/src/clangd_crash_repr/main.cpp version 1 in 0.15 seconds
I[01:29:24.755] --> workspace/semanticTokens/refresh(1)
I[01:29:24.755] Indexing c++23 standard library in the context of /home/me/Documents/src/clangd_crash_repr/main.cpp
I[01:29:24.755] <-- reply(1)
I[01:29:24.755] <-- textDocument/semanticTokens/full(3)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0. /home/me/Documents/src/clangd_crash_repr/main.cpp:4:31: current parser token '{'
1. /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../include/c++/15.2.1/expected:335:11: instantiating class definition 'std::expected'
I[01:29:24.804] <-- textDocument/foldingRange(4)
I[01:29:24.804] --> reply:textDocument/foldingRange(4) 0 ms
I[01:29:24.903] <-- textDocument/documentSymbol(5)
#0 0x00007f3d57f56aed llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Unix/Signals.inc:842:22
#1 0x00007f3d57f53bc7 llvm::sys::RunSignalHandlers() /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Signals.cpp:108:20
#2 0x00007f3d57f53bc7 SignalHandler /usr/src/debug/llvm/llvm-project-22.1.3.src/llvm/lib/Support/Unix/Signals.inc:412:31
#3 0x00007f3d56e3e2d0 (/usr/lib/libc.so.6+0x3e2d0)
#4 0x00007f3d638ec2ce clang::Decl::getKind() const /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/AST/DeclBase.h:442:51
#5 0x00007f3d638ec2ce clang::VarTemplateDecl::classof(clang::Decl const*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/AST/DeclTemplate.h:3188:58
#6 0x00007f3d638ec2ce llvm::isa_impl::doit(clang::NamedDecl const&) /usr/include/llvm/Support/Casting.h:64:64
#7 0x00007f3d638ec2ce llvm::isa_impl_cl::doit(clang::NamedDecl const*) /usr/include/llvm/Support/Casting.h:110:36
#8 0x00007f3d638ec2ce llvm::isa_impl_wrap::doit(clang::NamedDecl const* const&) /usr/include/llvm/Support/Casting.h:137:41
#9 0x00007f3d638ec2ce llvm::isa_impl_wrap::doit(clang::NamedDecl* const&) /usr/include/llvm/Support/Casting.h:129:13
#10 0x00007f3d638ec2ce llvm::CastIsPossible::isPossible(clang::NamedDecl* const&) /usr/include/llvm/Support/Casting.h:257:62
#11 0x00007f3d638ec2ce llvm::CastInfo::doCastIfPossible(clang::NamedDecl* const&) /usr/include/llvm/Support/Casting.h:493:26
#12 0x00007f3d638ec2ce decltype(auto) llvm::dyn_cast(clang::NamedDecl*) /usr/include/llvm/Support/Casting.h:657:48
#13 0x00007f3d638ec2ce clang::TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(clang::VarTemplatePartialSpecializationDecl*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:2519:63
#14 0x00007f3d6384c094 clang::Sema::InstantiateClassImpl(clang::SourceLocation, clang::CXXRecordDecl*, clang::CXXRecordDecl*, clang::MultiLevelTemplateArgumentList const&, clang::TemplateSpecializationKind, bool) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaTemplateInstantiate.cpp:3541:41
#15 0x00007f3d63889d6b llvm::SmallVectorTemplateCommon::isSmall() const /usr/include/llvm/ADT/SmallVector.h:145:39
#16 0x00007f3d63889d6b llvm::SmallVectorImpl::~SmallVectorImpl() /usr/include/llvm/ADT/SmallVector.h:606:23
#17 0x00007f3d63889d6b llvm::SmallVector::~SmallVector() /usr/include/llvm/ADT/SmallVector.h:1212:3
#18 0x00007f3d63889d6b clang::MultiLevelTemplateArgumentList::~MultiLevelTemplateArgumentList() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/include/clang/Sema/Template.h:76:9
#19 0x00007f3d63889d6b clang::Sema::InstantiateClassTemplateSpecialization(clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind, bool, bool) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaTemplateInstantiate.cpp:4035:35
#20 0x00007f3d63901dfb operator() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaType.cpp:9518:21
#21 0x00007f3d63901dfb callback_fn > /usr/include/llvm/ADT/STLFunctionalExtras.h:46:52
#22 0x00007f3d61ecc795 clang::StackExhaustionHandler::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Basic/StackExhaustionHandler.cpp:21:1
#23 0x00007f3d6390b499 clang::Sema::RequireCompleteTypeImpl(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, clang::Sema::TypeDiagnoser*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaType.cpp:9546:7
#24 0x00007f3d6390b6da clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, clang::Sema::TypeDiagnoser&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaType.cpp:9245:30
#25 0x00007f3d6390b795 clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, clang::Sema::CompleteTypeKind, unsigned int) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaType.cpp:9588:1
#26 0x00007f3d630d5d38 clang::Sema::ActOnStartOfFunctionDef(clang::Scope*, clang::Decl*, clang::SkipBodyInfo*, clang::Sema::FnBodyKind) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaDecl.cpp:16229:62
#27 0x00007f3d630fc641 clang::Sema::ActOnStartOfFunctionDef(clang::Scope*, clang::Declarator&, llvm::MutableArrayRef, clang::SkipBodyInfo*, clang::Sema::FnBodyKind) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Sema/SemaDecl.cpp:15904:38
#28 0x00007f3d62227ffe clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/Parser.cpp:1364:46
#29 0x00007f3d62112b41 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/ParseDecl.cpp:2265:40
#30 0x00007f3d62222610 clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/Parser.cpp:1180:73
#31 0x00007f3d62222e3d clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/Parser.cpp:1202:42
#32 0x00007f3d6222bf27 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/Parser.cpp:1030:50
#33 0x00007f3d6222d237 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr&, clang::Sema::ModuleImportState&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/Parser.cpp:743:36
#34 0x00007f3d6222d777 clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr&, clang::Sema::ModuleImportState&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/Parser.cpp:607:32
#35 0x00007f3d620dab16 clang::ParseAST(clang::Sema&, bool, bool) /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Parse/ParseAST.cpp:169:69
#36 0x00007f3d6480d9ec clang::FrontendAction::Execute() /usr/src/debug/clang/llvm-project-22.1.3.src/clang/lib/Frontend/FrontendAction.cpp:1317:38
#37 0x00005594412453ec llvm::Error::getPtr() const /usr/include/llvm/Support/Error.h:281:12
#38 0x00005594412453ec llvm::Error::operator bool() /usr/include/llvm/Support/Error.h:241:22
#39 0x00005594412453ec clang::clangd::ParsedAST::build(llvm::StringRef, clang::clangd::ParseInputs const&, std::unique_ptr>, llvm::ArrayRef, std::shared_ptr) /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/ParsedAST.cpp:714:42
#40 0x00005594412e0027 std::unique_ptr>::~unique_ptr() /usr/include/c++/15.2.1/bits/unique_ptr.h:397:12
#41 0x00005594412e0027 generateDiagnostics /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/TUScheduler.cpp:1213:55
#42 0x00005594412e09f7 operator() /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/TUScheduler.cpp:1147:24
#43 0x00005594412d827a runTask /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/TUScheduler.cpp:1328:1
#44 0x00005594412d868c std::__shared_ptr::__shared_ptr(std::__shared_ptr&&) /usr/include/c++/15.2.1/bits/shared_ptr_base.h:1539:20
#45 0x00005594412d868c std::shared_ptr::shared_ptr(std::shared_ptr&&) /usr/include/c++/15.2.1/bits/shared_ptr.h:359:41
#46 0x00005594412d868c clang::clangd::Context::Context(clang::clangd::Context&&) /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/support/Context.h:92:3
#47 0x00005594412d868c clang::clangd::WithContext::~WithContext() /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/support/Context.h:188:40
#48 0x00005594412d868c run /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/TUScheduler.cpp:1462:5
#49 0x00005594414c4302 memcpy /usr/include/bits/string_fortified.h:29:33
#50 0x00005594414c4302 llvm::detail::PunnedPointer::TrivialCallback*, llvm::detail::UniqueFunctionBase::NonTrivialCallbacks*>>::asInt() const /usr/include/llvm/ADT/PointerIntPair.h:41:16
#51 0x00005594414c4302 llvm::detail::PunnedPointer::TrivialCallback*, llvm::detail::UniqueFunctionBase::NonTrivialCallbacks*>>::operator long() const /usr/include/llvm/ADT/PointerIntPair.h:45:53
#52 0x00005594414c4302 llvm::PointerIntPair::TrivialCallback*, llvm::detail::UniqueFunctionBase::NonTrivialCallbacks*>, 1u, bool, llvm::PointerLikeTypeTraits::TrivialCallback*, llvm::detail::UniqueFunctionBase::NonTrivialCallbacks*>>, llvm::PointerIntPairInfo::TrivialCallback*, llvm::detail::UniqueFunctionBase::NonTrivialCallbacks*>, 1u, llvm::PointerLikeTypeTraits::TrivialCallback*, llvm::detail::UniqueFunctionBase::NonTrivialCallbacks*>>>>::getPointer() const /usr/include/llvm/ADT/PointerIntPair.h:94:57
#53 0x00005594414c4302 llvm::detail::UniqueFunctionBase::~UniqueFunctionBase() /usr/include/llvm/ADT/FunctionExtras.h:274:42
#54 0x00005594414c4302 llvm::detail::UniqueFunctionBase::operator=(llvm::detail::UniqueFunctionBase&&) /usr/include/llvm/ADT/FunctionExtras.h:328:30
#55 0x00005594414c4302 llvm::unique_function::operator=(llvm::unique_function&&) /usr/include/llvm/ADT/FunctionExtras.h:352:20
#56 0x00005594414c4302 operator() /usr/src/debug/clang/llvm-project-22.1.3.src/clang-tools-extra/clangd/support/Threading.cpp:103:14
#57 0x00005594414c4302 operator())::&> /usr/include/llvm/Support/thread.h:46:16
#58 0x00005594414c4302 __invoke_impl):: > >(void*)::, clang::clangd::AsyncTaskRunner::runAsync(const llvm::Twine&, llvm::unique_function)::&> /usr/include/c++/15.2.1/bits/invoke.h:63:36
#59 0x00005594414c4302 __invoke):: > >(void*)::, clang::clangd::AsyncTaskRunner::runAsync(const llvm::Twine&, llvm::unique_function)::&> /usr/include/c++/15.2.1/bits/invoke.h:98:40
#60 0x00005594414c4302 __apply_impl):: > >(void*)::, std::tuple):: >&, 0> /usr/include/c++/15.2.1/tuple:2920:27
#61 0x00005594414c4302 apply):: > >(void*)::, std::tuple):: >&> /usr/include/c++/15.2.1/tuple:2935:31
#62 0x00005594414c4302 GenericThreadProxy):: > > /usr/include/llvm/Support/thread.h:44:15
#63 0x00005594414c4302 ThreadProxy):: > > /usr/include/llvm/Support/thread.h:58:36
#64 0x00007f3d56e9697a (/usr/lib/libc.so.6+0x9697a)
#65 0x00007f3d56f1a2bc (/usr/lib/libc.so.6+0x11a2bc)
Signalled during AST worker action: Build AST
Filename: /home/me/Documents/src/clangd_crash_repr/main.cpp
Directory: /home/me/Documents/src/clangd_crash_repr/build
Command Line: /usr/bin/g++ --driver-mode=g++ -I/home/me/Documents/src/clangd_crash_repr/platform_include -std=c++23 -o main.cpp.obj -c -resource-dir=/usr/lib/clang/22 -- /home/me/Documents/src/clangd_crash_repr/main.cpp
Version: 1
[Error - 01:29:25] Server process exited with signal SIGSEGV.
[Error - 01:29:25] The Clang Language Server server crashed 5 times in the last 3 minutes. The server will not be restarted. See the output for more information.
```
## code
main.cpp
```
#include
#include

std::expected f() {
return 2.;
}
```
platform_include/stdio.h
```
// empty
```
compile_commands.json
```
[
{
"directory": "/home/me/Documents/src/clangd_crash_repr/build",
"command": "/usr/bin/g++ -I/home/me/Documents/src/clangd_crash_repr/platform_include -std=c++23 -o main.cpp.obj -c /home/me/Documents/src/clangd_crash_repr/main.cpp",
"file": "/home/me/Documents/src/clangd_crash_repr/main.cpp",
"output": "main.cpp.obj"
}
]
```

Standard headers I think come from gcc 15.2.1+r604+g0b99615a8aef-1 on arch

Contributor guide

Open the contributing guide

Research direction

Start with clang/lib/Sema/SemaTemplateInstantiateDecl.cpp at TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl, then trace the std::expected C++23 reproduction shown in the clangd log. Done means clangd no longer crashes while parsing the reported example; the payload does not name a regression test file.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
compilers, devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.