<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/120793>120793</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-format] Crash in LeftRightQualifierAlignmentFixer for trailing return type
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-format
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mellery451
</td>
</tr>
</table>
<pre>
source (main.cpp):
```
template <class T>
inline auto clamp(bool& saturated, T const v, T const lo, T const hi) -> const T
{
if (v < lo)
{
saturated = true;
return lo;
}
else if (v > hi)
{
saturated = true;
return hi;
}
else
{
saturated = false;
}
return v;
}
```
config file (format-config):\
```
Language: Cpp
Standard: c++14
BraceWrapping:
AfterClass: true
AfterCaseLabel: true
AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterStruct: true
AfterUnion: true
BeforeCatch: true
BeforeElse: true
IndentBraces: false
BreakBeforeBraces: Custom
QualifierAlignment: Custom
QualifierOrder: ['static', 'inline', 'friend', 'constexpr', 'type', 'const', 'volatile', 'restrict']
```
cmd:
`clang-format --style="file:format-config" main.cpp`
crash:
```
Stack dump:
0. Program arguments: clang-format --style=file:format-config2 main.cpp
#0 0x00007fd3ae89d370 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/../lib/libLLVM.so.19.1+0xee0370)
#1 0x00007fd3ae89a2ce SignalHandler(int) Signals.cpp:0:0
#2 0x00007fd3ad4cb520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#3 0x00007fd3b7a6bd33 clang::format::LeftRightQualifierAlignmentFixer::analyzeRight(clang::SourceManager const&, clang::format::AdditionalKeywords const&, clang::tooling::Replacements&, clang::format::FormatToken const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, clang::tok::TokenKind) (.cold) QualifierAlignmentFixer.cpp:0:0
#4 0x00007fd3bac52e12 clang::format::LeftRightQualifierAlignmentFixer::fixQualifierAlignment(llvm::SmallVectorImpl<clang::format::AnnotatedLine*>&, clang::format::FormatTokenLexer&, clang::tooling::Replacements&) (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/../lib/libclang-cpp.so.19.1+0x3d8ae12)
#5 0x00007fd3bac52e9a clang::format::LeftRightQualifierAlignmentFixer::analyze(clang::format::TokenAnnotator&, llvm::SmallVectorImpl<clang::format::AnnotatedLine*>&, clang::format::FormatTokenLexer&) (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/../lib/libclang-cpp.so.19.1+0x3d8ae9a)
#6 0x00007fd3bac65305 clang::format::TokenAnalyzer::process(bool) (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/../lib/libclang-cpp.so.19.1+0x3d9d305)
#7 0x00007fd3bac55156 clang::format::addQualifierAlignmentFixerPasses(clang::format::FormatStyle const&, llvm::SmallVectorImpl<std::function<std::pair<clang::tooling::Replacements, unsigned int> (clang::format::Environment const&)>>&)::'lambda0'(clang::format::Environment const&)::operator()(clang::format::Environment const&) const QualifierAlignmentFixer.cpp:0:0
#8 0x00007fd3bac55b05 std::_Function_handler<std::pair<clang::tooling::Replacements, unsigned int> (clang::format::Environment const&), clang::format::addQualifierAlignmentFixerPasses(clang::format::FormatStyle const&, llvm::SmallVectorImpl<std::function<std::pair<clang::tooling::Replacements, unsigned int> (clang::format::Environment const&)>>&)::'lambda0'(clang::format::Environment const&)>::_M_invoke(std::_Any_data const&, clang::format::Environment const&) QualifierAlignmentFixer.cpp:0:0
#9 0x00007fd3bac1f0e6 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*) (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/../lib/libclang-cpp.so.19.1+0x3d570e6)
#10 0x00007fd3bac20fa1 clang::format::reformat(clang::format::FormatStyle const&, llvm::StringRef, llvm::ArrayRef<clang::tooling::Range>, llvm::StringRef, clang::format::FormattingAttemptStatus*) (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/../lib/libclang-cpp.so.19.1+0x3d58fa1)
#11 0x000055956f4ca402 clang::format::format(llvm::StringRef, bool) ClangFormat.cpp:0:0
#12 0x000055956f4c15a0 main (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/clang-format+0xc5a0)
#13 0x00007fd3ad4b2d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#14 0x00007fd3ad4b2e40 call_init ./csu/../csu/libc-start.c:128:20
#15 0x00007fd3ad4b2e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#16 0x000055956f4c2715 _start (/home/linuxbrew/.linuxbrew/Cellar/llvm/19.1.6/bin/clang-format+0xd715)
Segmentation fault (core dumped)
```
version:
```
$ clang-format --version
Homebrew clang-format version 19.1.6
```
..but I have also repro'd with a non-homebrew version as well (v19 still)
seems to be associated with the trailing return type, but I didn't experiment much.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWdty47jRfhr4BmUVCIqidKELWrZqt9b7_5PxZHOpaoJNCRkQYAGgx87TpwBSFnVyZrKzs0lVpjwuotHo09fdOBick1uNuCTZHcnub6DzO2OXDSqF9nWaJTelqV6XznRWICV83oDUE9G2hC9IWhAWf2Zs-GGFx6ZV4JGSdCUUOEc_kfSBsEJqJTVS6LyhQkHTEj4vjVGEz6gD31nwWBG-op-oMNp5-jweKDMe7SThC3pL0oeB8ClYkd8RVlBKqayDpc_BhLhwMdAHjjdtlKT31NsOSbpfGv5Z9J3VYeUbmeT3wxcqhyMFD70t_5aCnbym4D1xNQSGCwsHqc_9XE8fI0NYIYyu5ZbWUkUsa2Mb8Lc9dQA0W51j-gh628EWSVrQVdsSVjx50BXYKlAE4XeE3yVTwoo7CwL_ZqFtpd72-UGL2qNdhVQI3DEaweCeDA4foUR1Ycpob4168uCxQe3HHJHhQXfN-bJ1p4WXRp_P_B806FoQeCbpydtO-PMVf9Wngu6wNhZX4MXuAv0hIjMi_6wr1D4GJTrfYxfChPC5X3OYXHXOm4aw4i8dKFlLtIWSW733_Xz6_22FNkyF2uW58-ClIDwPlUJ43hfcYVxbibo6jGPl4EtrDyT_2uIJw2H4bBR4qUYMFp23UkSe7FK6NdW4RwgFenvbJx29vXX-VSFJ7wnnISFJWpzkI6dvzeZNogW3u9h3njyIz7TqmrafZhP6wZqthYaC3XYhijHKV4y4ZMFIPyso4Smj7IUxxvK6SgHniyrNGVXqOaQhSQv36vqPD1ZqHw36FNAlfH5gsvBlY5y3CA3hsxBIqX3oZoTPCV_vTIOEr5XU3Utp8Qvh68l4sEKlwAaOIJGvk8UkmcwIX5dSB95JXFz2vx8ff_t14swkMBF-x14QWZqzoV8RniYnDgEXSJ_kVoP6CXSl0BI-H-zryS6GIy1Y_N9L4WMp1VSUGWeDO70pL_PZZja9jX7cbnXXT4hg2izaNeUZH5mVjgSWOczKKk174PoY9ij1349Y-49yu_PnVbOWL7E-SFqABvX6D4yMhM9Hsp7izvYraNiipUPKR1yuKCyqSoYGA-oXfP1ibOWurfLGKLkffMRWgcA-D99VsI7fn8xn1HvJRWB3vuoZNhvx8pIk_aAEJ8Um1GGQtRK7kB0j5kDYeAsypH8_nT4ccYBSRoA3djS_31gvOfW5_4gG_iJDR4nJOxFGxe8rQFxInOkYZxAZx4T_Ppxr-XKhe47r76kBpX5D4Y39uWlVf0q5iLPWJuw91WPsokUM21fi9ojBom9MiD-kBfTtTrTtUR9Iqzlgwg8Vl50hsYDvUnHHxTYWEwM1BNnsg_Wn4fSjg7-AQ_Bnx8GfZSnLrhk_RC3Gdoh0a41A596O0z_UlUWVsuzgSn6SR1mSza65AlV1JYM-gHPorqdOj-BT2LqP2tR72fPW7uq3A-KB1oK0xxn2TqmuaKfjpamKW3f6QK9b-qCfpTXRs5Gli77F7r8DI-G5gqasgMXj1TfLC5OmRdvX0jzQvlXIcJX6-vY9PwW7ZNlol9qfxDe74SjxZwb8ejv4Xxp-xzR8GLD_dSP1s_kc2v8hIQr9uqnAw9ecsq7l6Ndn5-I4O5Oa4dVWJLVHq0ENR3Qc5n4P8vFA9hHrY3JhLbwG6jsogw437YczhL9ifEX_u154qbeF99i04criOxePmz90E8lyhrN-EwmXEnaMHGc1JNd8-M_B6r819vMakkPs9zfCLFtks3oqYMquHsnfIn_F9f1xZBWW9w6f1GnQyE80JhmwePH-PlEY3_ejyyIDdvA3Pb67lrxaMLrZhIBtnAfrNwKU2kR7QjyF6_ahda-uwtYRvtatV0OUTxdNdiQtsjlJi2Q2qJyeqsQpo3GB1NKfauk_g-jbKHoigiweJPJ9CLNLEo-cuGT_RclpHnaCbBA8O8GG50lGe5F_EDpVngzHySfchvYOYZOkNXQqqhTGYnzlwWoA8fjJ6Rmt6x_tzp-ICJ-ePv_s2Vnxk2kw2HzMMczTwewzdZNJ2Xn6M93BM1JQzlCLrTWE5xX9Iv2OAtVG3-72wvfywNEvqFR8RU4W1Hmp1OAPKxxi46g3tEQKzhkh4-NvlOd3SMNtPvSg_Ytv_2q3or0plaw04bmn-NKilXEHbTqxmxBW3FTLtFqkC7jBZZKn05zPFym72S2rEqaQcY6z-QzTDNP5Iod6mgq-qDiU5Y1ccsanCeeMJ2yesUkJLJlmJS7ynM1yMSdThg1INQlAT4zd3kjnOlwmnOWL9EZBicrFvzJwfow6J9n9jV2Gdbdlt3VkypR03h0keelV_AvF0cLsnq4suB2Vmv6rOymtjb0Yt5vOquXO-zY-3fE14eut9LuunAjTHNI2Gtda83cUnvB1dC1U_uDd85L_MwAA___UTcvR">