llvm / llvm/llvm-project

[clangd][clang] `Assertion false && "Adding a note without main diagnostic"' failed.`

Open
#197,681 1 comment 0 reactions 0 assignees View on GitHub
clangd
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.