[clangd][clang] `Assertion false && "Adding a note without main diagnostic"' failed.`
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
requests:
```
initialize->initialized->didopen->shutdown->exit
```
The input is reduced from https://github.com/llvm/llvm-project/blob/main/clang/test/Misc/sloc-usage.cpp
```cxx
#pragma clang __debug sloc_usage
```
```
Stack dump:
0. /sloc-usage.cpp:1:2: current parser token 'pragma'
#0 0x0000630adcc5d8f2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm/lib/Support/Unix/Signals.inc:884:3
#1 0x0000630adcc5a66c llvm::sys::RunSignalHandlers() /llvm/lib/Support/Signals.cpp:108:20
#2 0x0000630adcc5aee1 SignalHandler(int, siginfo_t*, void*) /llvm/lib/Support/Unix/Signals.inc:448:14
#3 0x000071986ca45330 (+0x45330)
#4 0x000071986ca9eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x000071986ca9eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x000071986ca9eb2c pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x000071986ca4527e raise ./signal/../sysdeps/posix/raise.c:27:6
#8 0x000071986ca288ff abort ./stdlib/abort.c:81:7
#9 0x000071986ca2881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x000071986ca3b517 (+0x3b517)
#11 0x0000630ade184ece clang::clangd::StoreDiags::HandleDiagnostic(clang::DiagnosticsEngine::Level, clang::Diagnostic const&)
/clang-tools-extra/clangd/Diagnostics.cpp:890:9
#12 0x0000630add3a5da4 clang::DiagnosticsEngine::Report(clang::DiagnosticsEngine::Level, clang::Diagnostic const&) /clang/
lib/Basic/Diagnostic.cpp:625:7
#13 0x0000630add3a6120 clang::DiagnosticsEngine::ProcessDiag(clang::DiagnosticBuilder const&) /clang/lib/Basic/
Diagnostic.cpp:705:10
#14 0x0000630adcd2e5d1 clang::DiagnosticBuilder::Clear() const /clang/include/clang/Basic/Diagnostic.h:1283:14
#15 0x0000630adcd2e5d1 clang::DiagnosticBuilder::Emit() /clang/include/clang/Basic/Diagnostic.h:1307:10
#16 0x0000630adcd2e5d1 clang::DiagnosticBuilder::Emit() /clang/include/clang/Basic/Diagnostic.h:1297:8
#17 0x0000630adcd2e5d1 clang::DiagnosticBuilder::~DiagnosticBuilder() /clang/include/clang/Basic/Diagnostic.h:1339:30
#18 0x0000630add4f3421 (anonymous namespace)::PragmaDebugHandler::HandlePragma(clang::Preprocessor&, clang::PragmaIntroducer,
clang::Token&) /clang/lib/Lex/Pragma.cpp:1224:54
#19 0x0000630add4ec753 std::__uniq_ptr_impl>::_M_ptr() const
/bits/unique_ptr.h:199:67
#20 0x0000630add4ec753 std::unique_ptr>::get() const /
bits/unique_ptr.h:470:27
#21 0x0000630add4ec753 std::unique_ptr>::operator bool() const
/bits/unique_ptr.h:487:19
#22 0x0000630add4ec753 clang::Preprocessor::HandlePragmaDirective(clang::PragmaIntroducer) /clang/lib/Lex/Pragma.cpp:178:71
#23 0x0000630add4c8fcc clang::Preprocessor::HandleDirective(clang::Token&) /clang/lib/Lex/PPDirectives.cpp:1459:78
#24 0x0000630add49e835 clang::Preprocessor::hadModuleLoaderFatalFailure() const /clang/include/clang/Lex/
Preprocessor.h:1285:12
#25 0x0000630add49e835 clang::Lexer::LexTokenInternal(clang::Token&) /clang/lib/Lex/Lexer.cpp:4571:38
#26 0x0000630add4a061b clang::Lexer::Lex(clang::Token&) /clang/lib/Lex/Lexer.cpp:3766:3
#27 0x0000630add4ff86c clang::Preprocessor::Lex(clang::Token&) /clang/lib/Lex/Preprocessor.cpp:940:10
#28 0x0000630adeacaa7f clang::EnterExpressionEvaluationContext::EnterExpressionEvaluationContext(clang::Sema&,
clang::Sema::ExpressionEvaluationContext, clang::Decl*, clang::Sema::ExpressionEvaluationContextRecord::ExpressionKind, bool)
/clang/include/clang/Sema/EnterExpressionEvaluationContext.h:32:46
#29 0x0000630adeacaa7f clang::ParseAST(clang::Sema&, bool, bool) /clang/lib/Parse/ParseAST.cpp:167:67
#30 0x0000630ade8c46e7 clang::FrontendAction::Execute() /clang/lib/Frontend/FrontendAction.cpp:1346:38
#31 0x0000630ade8fcdef llvm::Error::getPtr() const /llvm/include/llvm/Support/Error.h:278:51
#32 0x0000630ade8fcdef llvm::Error::operator bool() /llvm/include/llvm/Support/Error.h:241:22
#33 0x0000630ade8fcdef clang::PrecompiledPreamble::Build(clang::CompilerInvocation const&, llvm::MemoryBuffer const*,
clang::PreambleBounds, llvm::IntrusiveRefCntPtr, llvm::IntrusiveRefCntPtr,
std::shared_ptr, bool, llvm::StringRef, clang::PreambleCallbacks&) /clang/lib/Frontend/
PrecompiledPreamble.cpp:531:39
#34 0x0000630ade2b0d0c llvm::IntrusiveRefCntPtr::release() /llvm/include/llvm/ADT/
IntrusiveRefCntPtr.h:232:9
#35 0x0000630ade2b0d0c llvm::IntrusiveRefCntPtr::~IntrusiveRefCntPtr() /llvm/include/llvm/ADT/
IntrusiveRefCntPtr.h:196:34
#36 0x0000630ade2b0d0c clang::clangd::buildPreamble(llvm::StringRef, clang::CompilerInvocation, clang::clangd::ParseInputs const&,
bool, std::function)>,
clang::clangd::PreambleBuildStats*) /clang-tools-extra/clangd/Preamble.cpp:642:54
#37 0x0000630ade34a5bf std::__shared_ptr::__shared_ptr(std::__shared_ptr&&)
/bits/shared_ptr_base.h:1532:20
#38 0x0000630ade34a5bf std::__shared_ptr::operator=(std::__shared_ptr&&)
/bits/shared_ptr_base.h:1620:2
#39 0x0000630ade34a5bf std::shared_ptr::operator=(std::shared_ptr&&) /bits/shared_ptr.h:440:36
#40 0x0000630ade34a5bf clang::clangd::(anonymous namespace)::PreambleThread::build(clang::clangd::(anonymous
namespace)::PreambleThread::Request) /clang-tools-extra/clangd/TUScheduler.cpp:1095:13
#41 0x0000630ade34ad54 clang::clangd::(anonymous namespace)::PreambleThread::run() /clang-tools-extra/clangd/
TUScheduler.cpp:513:14
#42 0x0000630ade527b6e llvm::detail::UniqueFunctionBase::operator=(llvm::detail::UniqueFunctionBase&&) /llvm/
include/llvm/ADT/FunctionExtras.h:329:5
#43 0x0000630ade527b6e llvm::detail::UniqueFunctionBase::operator=(llvm::detail::UniqueFunctionBase&&) /llvm/
include/llvm/ADT/FunctionExtras.h:321:23
#44 0x0000630ade527b6e llvm::unique_function::operator=(llvm::unique_function&&) /llvm/include/llvm/ADT/
FunctionExtras.h:352:20
#45 0x0000630ade527b6e operator() /clang-tools-extra/clangd/support/Threading.cpp:103:14
#46 0x0000630ade527b6e operator())::&> /llvm/include/llvm/Support/thread.h:46:16
#47 0x0000630ade527b6e __invoke_impl):: > >(void*)::,
clang::clangd::AsyncTaskRunner::runAsync(const llvm::Twine&, llvm::unique_function)::&> /bits/
invoke.h:61:36
#48 0x0000630ade527b6e __invoke):: > >(void*)::,
clang::clangd::AsyncTaskRunner::runAsync(const llvm::Twine&, llvm::unique_function)::&> /bits/
invoke.h:96:40
#49 0x0000630ade527b6e __apply_impl):: > >(void*)::,
std::tuple):: >&, 0>
/tuple:2302:27
#50 0x0000630ade527b6e apply):: > >(void*)::,
std::tuple):: >&>
/tuple:2313:31
#51 0x0000630ade527b6e GenericThreadProxy):: > > /llvm/include/llvm/Support/thread.h:44:15
#52 0x0000630ade527b6e void* llvm::thread::ThreadProxy)::'lambda0'()>>(void*) /llvm/include/llvm/Support/thread.h:62:36
#53 0x000071986ca9caa4 start_thread ./nptl/pthread_create.c:447:8
#54 0x000071986cb29c6c clone3 ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:80:0
Signalled while building preamble
Filename: /sloc-usage.cpp
Directory:
Command Line: --driver-mode=g++ -std=c++26 -fsyntax-only -I -resource-dir= -- /sloc-
usage.cpp
Version: 1
```
Contributor guide
Research direction
Reproduce the crash with clangd using the initialize, initialized, didOpen, shutdown, and exit sequence and the reduced sloc-usage.cpp input. Start at clang-tools-extra/clangd/Diagnostics.cpp:890 and clang/lib/Lex/Pragma.cpp:1224, then trace how the pragma diagnostic reaches StoreDiags::HandleDiagnostic. Done means this input no longer triggers the assertion while building the preamble.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100