This was originally found while running clang-format through clangd's textDocument/formatting path over LLVM test files, but it reproduces directly with clang-format.
version:clang23.0.0
Source code
#xxxx??x<xxxxxxx||??x<xxxxxxx and xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
clang-format --style=LLVM repro.cpp
clang-format: <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/WhitespaceManager.cpp:335: void clang::format::IncrementChangeSpaces(unsigned int, int, llvm::MutableArrayRef<WhitespaceManager::Change>): Assertion `Delta > 0 || (abs(Delta) <= Changes[Start].Spaces)' failed.
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. Program arguments: <REPO_ROOT>/tmp/build-assert-clangd-main-20260506/bin/clang-format --style=LLVM /tmp/wm.cpp
#0 0x00005629fb308812 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/lib/Support/Unix/Signals.inc:884:3
#1 0x00005629fb30557c llvm::sys::RunSignalHandlers() <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/lib/Support/Signals.cpp:108:20
#2 0x00005629fb305df1 SignalHandler(int, siginfo_t*, void*) <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/lib/Support/Unix/Signals.inc:448:14
#3 0x00007307daa45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
#4 0x00007307daa9eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x00007307daa9eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x00007307daa9eb2c pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x00007307daa4527e raise ./signal/../sysdeps/posix/raise.c:27:6
#8 0x00007307daa288ff abort ./stdlib/abort.c:81:7
#9 0x00007307daa2881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007307daa3b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x00005629fb3c62fb llvm::MutableArrayRef<clang::format::WhitespaceManager::Change>::operator[](unsigned long) const <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/WhitespaceManager.cpp:335:3
#12 0x00005629fb3c62fb clang::format::IncrementChangeSpaces(unsigned int, int, llvm::MutableArrayRef<clang::format::WhitespaceManager::Change>) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/WhitespaceManager.cpp:335:3
#13 0x00005629fb3cc41e llvm::SmallVectorBase<unsigned int>::size() const <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/include/llvm/ADT/SmallVector.h:83:32
#14 0x00005629fb3cc41e llvm::ArrayRef<clang::format::WhitespaceManager::Change>::ArrayRef<llvm::SmallVector<clang::format::WhitespaceManager::Change, 16u>, void>(llvm::SmallVector<clang::format::WhitespaceManager::Change, 16u> const&) <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/include/llvm/ADT/ArrayRef.h:95:40
#15 0x00005629fb3cc41e llvm::MutableArrayRef<clang::format::WhitespaceManager::Change>::MutableArrayRef<llvm::SmallVector<clang::format::WhitespaceManager::Change, 16u>&, void>(llvm::SmallVector<clang::format::WhitespaceManager::Change, 16u>&) <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/include/llvm/ADT/ArrayRef.h:334:66
#16 0x00005629fb3cc41e clang::format::AlignTokenSequence(clang::format::FormatStyle const&, unsigned int, unsigned int, unsigned int, bool, llvm::ArrayRef<unsigned int>, llvm::SmallVector<clang::format::WhitespaceManager::Change, 16u>&) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/WhitespaceManager.cpp:453:30
#17 0x00005629fb3d3cc4 llvm::SmallVectorTemplateCommon<unsigned int, void>::isSmall() const <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/include/llvm/ADT/SmallVector.h:148:39
#18 0x00005629fb3d3cc4 llvm::SmallVectorImpl<unsigned int>::~SmallVectorImpl() <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/include/llvm/ADT/SmallVector.h:609:23
#19 0x00005629fb3d3cc4 llvm::SmallVector<unsigned int, 12u>::~SmallVector() <REPO_ROOT>/tmp/llvm-project-main-20260504/llvm/include/llvm/ADT/SmallVector.h:1230:3
#20 0x00005629fb3d3cc4 AlignTokens<clang::format::WhitespaceManager::alignChainedConditionals()::<lambda(const clang::format::WhitespaceManager::Change&)> > <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/WhitespaceManager.cpp:776:1
#21 0x00005629fb3d3cc4 clang::format::WhitespaceManager::alignChainedConditionals() <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/WhitespaceManager.cpp:950:16
#22 0x00005629fb3d7547 clang::format::WhitespaceManager::generateReplacements() <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/WhitespaceManager.cpp:142:24
#23 0x00005629fb34938a std::_Rb_tree<clang::tooling::Replacement, clang::tooling::Replacement, std::_Identity<clang::tooling::Replacement>, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>::begin() const /usr/include/c++/13/bits/stl_tree.h:1002:55
#24 0x00005629fb34938a std::set<clang::tooling::Replacement, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>::begin() const /usr/include/c++/13/bits/stl_set.h:347:26
#25 0x00005629fb34938a clang::tooling::Replacements::begin() const <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/include/clang/Tooling/Core/Replacement.h:281:55
#26 0x00005629fb34938a clang::format::(anonymous namespace)::Formatter::analyze(clang::format::TokenAnnotator&, llvm::SmallVectorImpl<clang::format::AnnotatedLine*>&, clang::format::FormatTokenLexer&) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/Format.cpp:2958:59
#27 0x00005629fb380cc9 clang::format::TokenAnalyzer::process(bool) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/TokenAnalyzer.cpp:129:5
#28 0x00005629fb3565b6 ~Formatter <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/Format.cpp:2921:7
#29 0x00005629fb3565b6 clang::format::internal::reformat(clang::format::FormatStyle const&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, unsigned int, unsigned int, unsigned int, llvm::StringRef, clang::format::FormattingAttemptStatus*)::'lambda11'(clang::format::Environment const&)::operator()(clang::format::Environment const&) const (.isra.0) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/Format.cpp:4327:12
#30 0x00005629fb35661b std::_Function_handler<std::pair<clang::tooling::Replacements, unsigned int> (clang::format::Environment const&), clang::format::internal::reformat(clang::format::FormatStyle const&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, unsigned int, unsigned int, unsigned int, llvm::StringRef, clang::format::FormattingAttemptStatus*)::'lambda11'(clang::format::Environment const&)>::_M_invoke(std::_Any_data const&, clang::format::Environment const&) /usr/include/c++/13/bits/std_function.h:292:7
#31 0x00005629fb354661 clang::format::internal::reformat(clang::format::FormatStyle const&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, unsigned int, unsigned int, unsigned int, llvm::StringRef, clang::format::FormattingAttemptStatus*) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/Format.cpp:4343:70
#32 0x00005629fb35649c std::_Rb_tree_header::_Rb_tree_header(std::_Rb_tree_header&&) /usr/include/c++/13/bits/stl_tree.h:182:25
#33 0x00005629fb35649c std::_Rb_tree<clang::tooling::Replacement, clang::tooling::Replacement, std::_Identity<clang::tooling::Replacement>, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>::_Rb_tree_impl<std::less<clang::tooling::Replacement>, true>::_Rb_tree_impl(std::_Rb_tree<clang::tooling::Replacement, clang::tooling::Replacement, std::_Identity<clang::tooling::Replacement>, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>::_Rb_tree_impl<std::less<clang::tooling::Replacement>, true>&&) /usr/include/c++/13/bits/stl_tree.h:687:4
#34 0x00005629fb35649c std::_Rb_tree<clang::tooling::Replacement, clang::tooling::Replacement, std::_Identity<clang::tooling::Replacement>, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>::_Rb_tree(std::_Rb_tree<clang::tooling::Replacement, clang::tooling::Replacement, std::_Identity<clang::tooling::Replacement>, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>&&) /usr/include/c++/13/bits/stl_tree.h:956:7
#35 0x00005629fb35649c std::set<clang::tooling::Replacement, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>::set(std::set<clang::tooling::Replacement, std::less<clang::tooling::Replacement>, std::allocator<clang::tooling::Replacement>>&&) /usr/include/c++/13/bits/stl_set.h:233:7
#36 0x00005629fb35649c clang::tooling::Replacements::Replacements(clang::tooling::Replacements&&) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/include/clang/Tooling/Core/Replacement.h:212:7
#37 0x00005629fb35649c clang::format::reformat(clang::format::FormatStyle const&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, llvm::StringRef, clang::format::FormattingAttemptStatus*) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/lib/Format/Format.cpp:4389:8
#38 0x00005629fb2a6080 clang::format::format(llvm::StringRef, bool) <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/tools/clang-format/ClangFormat.cpp:504:28
#39 0x00005629fb28c108 main <REPO_ROOT>/tmp/llvm-project-main-20260504/clang/tools/clang-format/ClangFormat.cpp:738:11
#40 0x00007307daa2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#41 0x00007307daa2a28b call_init ./csu/../csu/libc-start.c:128:20
#42 0x00007307daa2a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#43 0x00005629fb29e1c5 _start (<REPO_ROOT>/tmp/build-assert-clangd-main-20260506/bin/clang-format+0x331c5)
This was originally found while running clang-format through clangd's textDocument/formatting path over LLVM test files, but it reproduces directly with clang-format.
version:clang23.0.0
Source code
command
stacktrace