<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/132249>132249</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang] clang frontend crash with friend class declaration and overloaded `operator ==`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Rush10233
      </td>
    </tr>
</table>

<pre>
    The following code causes clang to crash:

```
struct foo {
};

struct bar {
    friend bool operator==(const bar& a, const bar& b);
    friend class foo;
};

bool operator==(const bar& a, const bar& b) = default;
```

[https://godbolt.org/z/Wv4scnaTG](https://godbolt.org/z/Wv4scnaTG)

Stack Dump:

```
<source>:9:47: warning: defaulted comparison operators are a C++20 extension [-Wc++20-extensions]
    9 | bool operator==(const bar& a, const bar& b) = default;
      | ^
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: /opt/compiler-explorer/clang-trunk/bin/clang++ -gdwarf-4 -g -o /app/output.s -mllvm --x86-asm-syntax=intel -fno-verbose-asm -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics <source>
1.      <eof> parser at end of file
 #0 0x0000000003b7abe8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3b7abe8)
 #1 0x0000000003b78d2c llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3b78d2c)
 #2 0x0000000003ac85a8 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007e2311642520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x0000000000c167b0 clang::Sema::CheckExplicitlyDefaultedComparison(clang::Scope*, clang::FunctionDecl*, clang::Sema::DefaultedComparisonKind) (.cold) SemaDeclCXX.cpp:0:0
 #5 0x00000000065642e9 clang::Sema::SetDeclDefaulted(clang::Decl*, clang::SourceLocation) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x65642e9)
 #6 0x00000000060e2751 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60e2751)
 #7 0x000000000612cfdf clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x612cfdf)
 #8 0x00000000060da427 clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60da427)
 #9 0x00000000060db23e clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60db23e)
#10 0x00000000060e4f3a clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60e4f3a)
#11 0x00000000060e67d8 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60e67d8)
#12 0x00000000060d4b5a clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60d4b5a)
#13 0x00000000044f8d8d clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x44f8d8d)
#14 0x00000000047ddc31 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x47ddc31)
#15 0x000000000475c1bb clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x475c1bb)
#16 0x00000000048cddb3 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x48cddb3)
#17 0x0000000000d65be1 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0xd65be1)
#18 0x0000000000d5e3dd ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#19 0x0000000004546089 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#20 0x0000000003ac89c3 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3ac89c3)
#21 0x00000000045462a9 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#22 0x00000000045095cd clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x45095cd)
#23 0x000000000450a591 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x450a591)
#24 0x000000000451492c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x451492c)
#25 0x0000000000d629b1 clang_main(int, char**, llvm::ToolContext const&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0xd629b1)
#26 0x0000000000c23264 main (/opt/compiler-explorer/clang-trunk/bin/clang+++0xc23264)
#27 0x00007e2311629d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#28 0x00007e2311629e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#29 0x0000000000d5de75 _start (/opt/compiler-explorer/clang-trunk/bin/clang+++0xd5de75)
clang++: error: clang frontend command failed with exit code 139 (use -v to see invocation)
Compiler returned: 139
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkWV1z4yrS_jXkhpJLQpItXeRCceLzZt7ZmqlJas-5cyFANjsYtIAyzv76LUCOPuJkPo7PudmUpqzho_vpp5umEdgYvpOMXYP8BuS3V7ize6Wvv3Rmn8QoTa9qRZ-vH_cMNkoI9Y3LHSSKMkhwZ5iBRGC5g1ZBorHZg7QCsX-Wcf_ElbG6IxY2SkGwunGdq1uQ3oSBfWeNdd8JIYSN5kxSWCsloGqZxlZpkN66BxVESeMnALSEGKA1nLTUAJVB-kgSEdgYh6DXOwLwy0ogSG8hZQ3uhO2ljYx2T36zt7Y1jhS0AWizU7RWwi6U3gG0-Q9Am9-fMkMkfvwN5E7rjw9HZdDxYDH5Cm-7Q3uWepCujeo0YSC9A2lVgrTKViCt4DesJZc799qbwCgk6tBizY2SL4QYiDWDGK4BugHoBsWQHS2ThisJQX4T_U5OHdFLh3HGBPpLCFbrX_fja4qh_3NCQX4H4urzx7vq4Q6arj5wCzGsux3UrFXaupic8cntvqsXRB0A2gjxdPqJWq3-xYgFaMON6ZgBaAOxpJBLIjrKoN2zEN6wxuSr1ZgwB7fVrNWKMGMYhT3NaO1nYmMU4diRqjsJDdG8tYsXf9EXf8ULEJeftdppfIBY77oDk9ZBhgBtVOswOa9wwXTEjq1QmmnX5lZdZHUnvwK0qbk8tQVvwGhHv2HdRBmMdjBSThhuWyeys21nFwZGB2c6jKJjsYywOUTmWVp8BOktl5YJGDVSRU9M18ow1w-jBxhFO0Iiq5Qge8yld-M7IN1gI3Fr9srCqCFKKB1RjndSGcuJCTo8sZPmSdDGVeIoAumaqQakd7DF2jANsYVuYasGNlwwFxkApTGMj_HpL61XuGYF9J5OK5BW5tmEl8-aS-td8RicWQyDNP62VcZqhg8ALZ1DubQ-FlHxZ3wC0E187DGF5esQJzPEBUXkHOK1YFh27Sf5wHcSC4CKTvrETaFQTsXF8DkEAz40wYdJkeMCrp3LvjCinph-DoD-D0sqnJqiZ2syZq2kZUe7IK0L-9j_C_LTXv6KoTRJlhnKUdxbIngN0OZYLLfLLBJcdsdoJ7vQQRZGLZYesp8yAM7GgGOSLFd1HDapQOQDO-Ce0j0jX--OreCEW_F8e0qD65cs6JLUaCZRLQOo8plqaN50kliu5C0j4nXvoO6M_P_nkvaeWxAl_Lub4ESt__jjDF352LplvswQK8-re2DWiXnROrXlDbB-1X1UBDuDLhVTPczBRcuJETFDqzwZw_jsV_jofaC44ZIHbMVsApc7ZxQOe0xYuO_JpI_s0Aps2b1sVNh53p_1EVsWZlbW6o_cja8uxlFgYeBoNeEoQaShzbv2OON_06pr36TmoWXktYkDaf0iPUeBN5nXnXV7489R-3r8PMrmUTiWt1H6C5Y7di_5RekOhA50F9OQpDhDq-_S_UmPAvNeWqZDZv559r474l0XVsTVIK6PN9xxcKmY9DQMJJUzkmqUsu-S5GKLKznh6s1FfHGq5rH111HlyOircpQm8SzFZU2K36Xq7hjCZ0TZ30PPxfKXM3EgIJkRsFzR4l0CHlX7kT0xEXamseWfWvzvjn22GqTrWeLyCe8Lc3XhmTzzshf-Q9FOsPuDOxY8WGyZH3wxy51tg-VotkqyOn_t-urhcVZcOLDBBHdaGn4vFqAOx4AyHaPMsqagBR2jXCvKfmOy8ks2NN0dGeks65scqMtg67UP2CYlXLailKST-mCj3U4l6Rlwl4QVFA-w8imsnCR1PaUsKLqXxmLpTi_nWHvbjsvFZA9ugD6puLKCUFqnY-g9yMGCp5fduXjPwsslkB7UAHlSAMV0mdcsgYQk24M7eY4PbJXW-NkngTXZY32q5SqfFNZw2obW8ElxekHkAdoAvJgCz1lKKTwRvE4e_aoewX84YCH-yYhV-v7QirNW-LwwTHEy-mptVLmWkGr-xPTs2OAwTXbuLM-WcVF6HkZCm35_3mpPpe8Nyyl8OwJpRbAQNSZft42c5uKguA-SdbJWhwOWdL4yz7rM2H6cap127AgYkWM1l7s-wwd_vkzYbsnxmCThPzU2nGyNH95TOBnsGrZWY27NqXsmDgvhgl7pUb8bUg252MdMINxPAWgl8KGmGLgy6UQVKk4n8g-qfu0MFM-P1CVJR344d3AOPV86-YAbJp4nXL7vt0t9FwgwX6IcJfOIQnhyEP2fiwh_iG-xtov4bdejKWtxmRP6JmveVfjVFneicpKZZxPdgLfOtO8MrSYVyMiwP5_eg61D_KQzJnBeJj_LxAdVm7dp-KBqd0if0PBe1n1xe4u587j_jvXjzPWx8dfx5xga-JvWSHmSlYi8hfV29D7Z6c9s8W_x_jfyd6GCInAyMJbPCgpU1n3EnUqKE2KfKap-nX9_171MEeHgDGCX06-YriWDDuZFtAV5g7bV9CMsKmn5kx9h_ZRBYDEXyLIYbrduztZYrO12ZMsPq2DZSEU5K7MoW-UwCL-MR7zEoG_cl1aQae32hKq_-2z6Mh6SPqYbzAWj8Bu3e8iO3Ib70iT1odIZBqMnaBU0jEE-qrSdplOFDTWznZbMLSk3c3ytd0WvU1qmJb5i18kqQ1mxSsryan-NaVPXqKA0X2ZLluZ5TFZFyRJcpg0rUHLFr1GM8jhFcbJM0qRYMFIkq6ZelYjgmJUEZDE7YC4WLuoXSu-u_IXYdZIilJVXAtdMGH9TjFBPCgL57ZW-9vdodbczIIsFN9YMIiy3wl8vhxn57Sve_NWap2tyXUuHbyH-Us1VREJhyigEy_h0nwj7C8VlfNVpcf3rV369kU_X6L8BAAD__6WPfPk">