<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63552>63552</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[C++] [Concepts] Using "constrained auto syntax" with a concept that takes template template parameters causes a crash
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
haruomaki
</td>
</tr>
</table>
<pre>
# Description
Clang (C++20) frontend crashes while compiling the following code.
```C++
// It crashes!
#include <iostream>
template <typename T, template <class> typename Op>
concept InvocableWith777 = std::is_invocable_v<Op<void>, decltype(777), T>;
void addTo777Show(InvocableWith777<std::plus> auto x) {
std::cout << 777 + x << std::endl;
}
int main() { addTo777Show(223); }
```
There is a "constrained auto syntax" (*abbreviated function template with concept-constrained auto*) in the code, which is a syntax like
```C++
void f(C auto x) {}
```
.
Moreover, concept C (in the code, `InvocableWith777`) takes a **template template parameter** as the second parameter.
The combination of these two features seems to cause a crash.
# Error Message
```
❯ clang++ -S -emit-llvm -Xclang -disable-llvm-passes -std=c++20 test.cpp
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: clang++ -S -emit-llvm -Xclang -disable-llvm-passes -std=c++20 test.cpp
1. test.cpp:6:53: current parser token ')'
#0 0x00007f3f82b7baaa (/usr/lib/libLLVM-15.so+0xd7baaa)
#1 0x00007f3f82b7913f llvm::sys::RunSignalHandlers() (/usr/lib/libLLVM-15.so+0xd7913f)
#2 0x00007f3f82a5c4a9 (/usr/lib/libLLVM-15.so+0xc5c4a9)
#3 0x00007f3f8184fab0 (/usr/lib/libc.so.6+0x39ab0)
#4 0x00007f3f82a7c6a5 llvm::FoldingSetBase::InsertNode(llvm::FoldingSetBase::Node*, void*, llvm::FoldingSetBase::FoldingSetInfo const&) (/usr/lib/libLLVM-15.so+0xc7c6a5)
#5 0x00007f3f8a12d1ee clang::ASTContext::getAutoTypeInternal(clang::QualType, clang::AutoTypeKeyword, bool, bool, clang::ConceptDecl*, llvm::ArrayRef<clang::TemplateArgument>, bool) const (/usr/lib/libclang-cpp.so.15+0x92d1ee)
#6 0x00007f3f8bdb7b9a (/usr/lib/libclang-cpp.so.15+0x25b7b9a)
#7 0x00007f3f8ad22f68 clang::Sema::GetTypeForDeclarator(clang::Declarator&, clang::Scope*) (/usr/lib/libclang-cpp.so.15+0x1522f68)
#8 0x00007f3f8a858339 clang::Sema::ActOnParamDeclarator(clang::Scope*, clang::Declarator&) (/usr/lib/libclang-cpp.so.15+0x1058339)
#9 0x00007f3f8a080cec (/usr/lib/libclang-cpp.so.15+0x880cec)
#10 0x00007f3f8a082755 clang::Parser::ParseFunctionDeclarator(clang::Declarator&, clang::ParsedAttributes&, clang::BalancedDelimiterTracker&, bool, bool) (/usr/lib/libclang-cpp.so.15+0x882755)
#11 0x00007f3f8a083922 clang::Parser::ParseDirectDeclarator(clang::Declarator&) (/usr/lib/libclang-cpp.so.15+0x883922)
#12 0x00007f3f8a073b8f clang::Parser::ParseDeclaratorInternal(clang::Declarator&, void (clang::Parser::*)(clang::Declarator&)) (/usr/lib/libclang-cpp.so.15+0x873b8f)
#13 0x00007f3f8a7173a1 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) (/usr/lib/libclang-cpp.so.15+0xf173a1)
#14 0x00007f3f8a06ee7f clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/usr/lib/libclang-cpp.so.15+0x86ee7f)
#15 0x00007f3f8a0e9f39 (/usr/lib/libclang-cpp.so.15+0x8e9f39)
#16 0x00007f3f8a0ff65d clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/usr/lib/libclang-cpp.so.15+0x8ff65d)
#17 0x00007f3f8a0ff916 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/usr/lib/libclang-cpp.so.15+0x8ff916)
#18 0x00007f3f8a04c3c9 clang::ParseAST(clang::Sema&, bool, bool) (/usr/lib/libclang-cpp.so.15+0x84c3c9)
#19 0x00007f3f8b6c8789 clang::FrontendAction::Execute() (/usr/lib/libclang-cpp.so.15+0x1ec8789)
#20 0x00007f3f8b66c7ff clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/usr/lib/libclang-cpp.so.15+0x1e6c7ff)
#21 0x00007f3f8b72d59a clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/usr/lib/libclang-cpp.so.15+0x1f2d59a)
#22 0x000056130e2c9027 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/usr/bin/clang-15+0x13027)
#23 0x000056130e2ccda7 (/usr/bin/clang-15+0x16da7)
#24 0x00007f3f8b3dc0c9 (/usr/lib/libclang-cpp.so.15+0x1bdc0c9)
#25 0x00007f3f82a5c577 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/usr/lib/libLLVM-15.so+0xc5c577)
#26 0x00007f3f8b3dfd74 (/usr/lib/libclang-cpp.so.15+0x1bdfd74)
#27 0x00007f3f8b3bd0fe clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/usr/lib/libclang-cpp.so.15+0x1bbd0fe)
#28 0x00007f3f8b3bd4bd clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/usr/lib/libclang-cpp.so.15+0x1bbd4bd)
#29 0x00007f3f8b3c7d6c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/usr/lib/libclang-cpp.so.15+0x1bc7d6c)
#30 0x000056130e2cf1f1 clang_main(int, char**) (/usr/bin/clang-15+0x191f1)
#31 0x00007f3f81839850 (/usr/lib/libc.so.6+0x23850)
#32 0x00007f3f8183990a __libc_start_main (/usr/lib/libc.so.6+0x2390a)
#33 0x000056130e2c2ea5 _start (/usr/bin/clang-15+0xcea5)
clang-15: error: clang frontend command failed with exit code 139 (use -v to see invocation)
clang version 15.0.7
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang-15: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-15: note: diagnostic msg: /tmp/test-da007e.cpp
clang-15: note: diagnostic msg: /tmp/test-da007e.sh
clang-15: note: diagnostic msg:
********************
```
# Discussion
All of these three variants of the amendment are successfully compiled.
```C++
// (1) declare a type parameter T with a concept constraint
template <InvocableWith777<std::plus> T>
void addTo777Show(T x) {
std::cout << 777 + x << std::endl;
}
```
```C++
// (2) declare a type parameter T, and use "requires" clause
template <typename T>
requires InvocableWith777<T, std::plus>
void addTo777Show(T x) {
std::cout << 777 + x << std::endl;
}
```
```C++
// (3) fix a concept. takes an ordinary type parameter instead of a template template parameter
template <typename T, typename Op>
concept InvocableWith777 = std::is_invocable_v<Op, decltype(777), T>;
void addTo777Show(InvocableWith777<std::plus<void>> auto x) {
std::cout << 777 + x << std::endl;
}
```
However, again, the following version is a fault.
```C++
// (4) Again, it crashes
void addTo777Show(InvocableWith777<std::plus> auto x) {
std::cout << 777 + x << std::endl;
}
```
Comparing (1), (2), and (4), it is found that only "constrained auto syntax" leads to a crash among various syntaxes that are employed to constrain the type parameter with a given concept.
Comparing (3) and (4) suggest that using "constrained auto syntax" with a concept taking just an ordinary type parameter doesn't cause a crash. The issue seems to be related to a template template parameter.
I also tested with GCC.
```bash
g++ -std=c++20 test.cpp && ./a.out`.
```
It was successfully built, and the correct result `1000` were displayed.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWl1z4yiz_jXKDWWXhKIPX-TCseOZ7MnszBl7d89dCqGWzUYCLaB8_PtTIMkWiuPEMzunzjs15dgSPHQ_NN0NDVGKbTnAlRdde9HygjR6J-TVjshGVOSBXWQif7nycIiWoKhktWaCe_7S8-ft56IkfIs8nC48fO3ha-x7eIYKKbgGniMqidqBQk87VgKioqpZyfgW6R2gQpSleDK_qMhhOkT1Yr_936F2T_HKwyt0q3tYDwf9m5BxWjY5IC9cMKG0BFJ54c0QVENVl0TbJvqlBk4qQBsPL9DwDS2JUl54g_ZNvtZ7ICo4hVqjW_4oKMlK-IvpXZIkyAuXSOncC-deOGfqnvUN7h-9cGEQFo-C5QYIL1AOtDTwHk6TJPHwzDzcmJfh9VBi0wWRPN-IJEnWO_Hk4XQ8tBcu9gPXZWNFJ40W6NlMhJd0gOggHhWNNpp64QJZ2fE1eu4f7FsBz8uDOMlyKBfjGlWEcQ-n3SBjKTEOjVrhNTp07ed0iLTZgQTEFCLIw5gKrrQkjEPe6qBeuCbPHsbIDjUnWSbhkRENOSoaTo01Hmbviekd6qZoMsby8NzIyri1PWNxhvSnHaO7dvx2LFSyBzhlhHZOCmPwI5rf0NOx6y9CgngEaYbubWlhdBuJ5cX-q3mO7crS5AFatuYePpj0_ktNJKlAmyFMA0SUBVZABc8Pb6ejSTBLM2OcWEJFYfooQPpJoAKIbiQopAAqhbRAlDQKEGkXobtscYhupBQSfQGlyHZMZPfzBnuzpTdfIWqcR0sumqzRBCqmJ2X5WKHJ_9h3aJIzZUiwTyc1UQoUmlgjXdLe4yANSk9pXbf43-5u5usbpJqsYhoRlDVbJKEWUhvpd1rXypi4dSZbpndNNqWi8vDKjNH9mdRS_A1Ue3jFlGqMq1khwnPUuxk7W4YAlBH6oCWhduJqCbUUFJSCHCnRyPax6UmUErQ1Xdlw1HrTjr61JvQB5U1VG8nsI3-K7L9vUmwlqRCR26YCro3sv4i4oBty_zScx144j0I7ZCMlcG1MSIFEWjwARx5uvVfSORkPhz7yn33f95MiLFKcJRkhpF29q0ZJQy_L2s-7uz-_TIJoqoSHr_3n3DY1cHusYIQ1C8IC2VmyLkq9qPbL94av2ZaT8jPheQlS9Y7pQ8MaVGdY7AxLInpJPoZFbVMHKxxiBellQTL_OBadKjGNLU44I5nvwFy6IiU0JtGAiZUoc8a3a9DXREH77JYrkPp361HS003bRnNjqTZKtV9P9zk8u-WFQNbdejj-KO3UquDoGA11JAHOA4DO0u2I8_VmYdKKZ93-3oKeN1psXmq45RokJ6WH00GH_25IubFhduHgdJ3-C16ehMzN20yIcvh30HrRuukl0PIVL3Mpyct3KNq0oe-x6XzxvFuxXdBvsWctU2-YgAGZ0Lo2phBElqiZ5cEhKh4SleVZks3eWGLHAHFkOziIiUN9jnERp0MS1lCR9tsn0Ia7lZCGESKJFtJlffg8HpG5pqKGLhJ_WOAgsvI4AqeOwGmUhuHsuMBzqr_ybybuvSXwQShH1pEe5wjsW3kcgWeOwH7qU6AfR0xt-z2gcY3-CBAnUTQU_5v104Pvqy5f-pF5swD5XGvJskabaDhucU1KwinkSyhZxTTIjST0AXosd4GdwWVqFXM0D0aahzOMT2q-ZBKo_qDeZ8lmhnZkw65sSZilxWnZ9qMf92GvZsXmn26bIWi7uE5reJ6SVgdHSSemkSRIQhIcX3yy4SZ9XTdFwSgDrm2is65ttuSsQZsq3QlqM1DXy_aJ_r20nrYnwO4vbs7SpbCiOrpcuhMWAyTvT9gnKZr69RwwvjVv17VZquMFcpiEPoidu8TGHI0d1lDUlZDfCd_CLWf6XH-bWhIcltzQ7MOsCM8BtO0dwNgFLIo4yk_SfvPcro6eRsvAq0Vwkr9XU3QmLVZIR4tkrMUsiE9qsRH1HTxC2WYTQ_G_1uSfBr5p6eYSe2uzWcbNEaPYr7UvIm9KuK3MRmetiYaz3ZmV31HQDbP-JQ3p7JWC8_VmtJiNTD_r9-1YjjBOCM1imiapI8yqO3SaW2_RPrt5BtoYKt7eDxyN4GDRh8Nj3x0-pklRuIliVbMS5C1X2oRCR4BOJoemkbznJhlgJXBEdCJjluA8mpGhiJ0wB0kf984kPaXJuQlbYUd2ROsDYxQHoQ-YznycIEqD--4c6XhSvSOy31nMuzTafTbcsbgSZgZ21YrXyxX67X51L1U4kormJHkXJc6Ji-LEkCzMqU_PYSuzHRzEaLwDjZJkEBEXkqjdd6DiEeSLsycyO2FSQPniUPpjEfT15jZKXMXjkeJFnlyepbjp4CAmLmKW-4WzB8wle-w9amum5NViX4iqIjx3bXrU0TQY7FkXJ8YYNp07bu3svVyQWYUcjdOxxpdZfq7Gv4lMva3ubyK7Y0o76h5sY12RsvwTqMlAq7p0jpMJM-GI8XGucpKh8OYQqH6Cp8vMibXY9f4hTfKYviXTcvDd8XlHnN1b_P4f8nSWs7CKD5nZn7j1TqwIii4d751rL9mOdMfCH3GWs6BwUmX3NC5Iw1kavX-UhcM08h0YPIaZ-QTd35tu90oTqa3UHwCe-U6ICcfOHAOJUAv5nrIUBmdR-zfhHIGUQu5PXAd1rW42C8JKyNvKAzwzbU_wUdBmx40CNHlEWiAFgNgg2g5HQo8gFRMcBdHUn3YnqRsit2B8OnpO4_v4clLTScl48zzZ8qY_tZdAclSJHErTsBaKPbevbOAuS8iXzArvqP5KRy60SVZQzsiWC6UZRZXa2n4dtz_xf1Ad6M7l55vNfPEZbT7foNXXu7uvf93-_gmtbu9u1mjz1T6-_uMT-n7z7ev3zf40_Nuxc_VUGTt-82x930ACKg31kCOi95AfpACvdFWbT1B6khPfT-BwYv4TGGr3AzPxb83HsVLcoYSzZIo2So0qvfOyHFSGdhIAPRLJCNeqe45IBTyvgGvLuWqombCiKcuXrvQL-cfLvB5Ojf-xxVIDR2xF9lDCQpt22ZF9JW1f8tOvC74fKZtu9nXeY4XXzS-qqB6di3eIwaeJ6UtOxgF5GEv4p2HSbIntOVmj4GRBvCcBob7jq3q3Fy7sIGMK_zPYC-0VBfZ8MJ1pX1flSMiccSJfxqQyrrTxt6IwhJ-ou7531-BfvVbwyy8T7K8t_NprBcem8bN4gq5WTrY2kVmM7o30kdPW7wvSlPos92K2HmjeQ7PDtZL_r5cvjrFkclYiWXsJJ-imv3MRvR_odO20ZAoVouE50juikeDlyzt3L0ogua38dzV_RCph2CeSiUZ1DUG1eMYjGeMXL5Db2wI9rp270aLqHPiWPQI_rMU31Qv7eN9Pnmq2W1C6HblRbbNTqowihiYPps_fjdKn1n4uQHEPJ3p09wFtdoDs_YDD7YgMkITSJhuWsROuwjHWW0RKJWztvU8oPy0W09HMZ6TPG_bl_7dq-sjuLWI09fCKTEWjvdgfw3VDa_RElBuvs4aVuref9mqKlEA1kqCaUiMv9gPfNxjoCSSgnKm6JC-QTy_yqzCfhTNyAVdBnCZpEsZRdLG7ivywmOFs5kNEZrMwmuEimGUJjvMsyqCgF-wK-zj0Y5wE4WUSRtM0oHEQzZI4D5IizcG79KEirJyabdlUyO2FJf8qDqMIX5Qkg1LZm2wYc3hqZ8bD2IuWF_LKXoTImq3yLv2SKa0OKJrp0l6B6x1FtETmV2slyvz84weMyxhlG1dOGIFqbUr1RnXRyPLqxy-pWCr-NwAA__-kE83R">