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

    <tr>
        <th>Summary</th>
        <td>
            Variadic friend `operator==` + modules causes "Assertion `Name.isIdentifier() && "Name is not a simple identifier"' failed"
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Given a.cpp:

```cpp
export module a;

template<typename, typename>
concept c = true;

export template<typename... Ts>
struct a {
        template<typename... Us> requires(... and c<Ts, Us>)
        friend bool operator==(a, a<Us...>) {
                return true;
        }
};

template struct a<>;
```

and b.cpp:

```cpp
import a;

template struct a<int>;
```

When compiled with

```shell
clang++ -std=c++20 -x c++-module -fmodule-output=a.pcm --precompile -c a.cpp
clang++ -std=c++20 -fmodule-file=a=a.pcm -c b.cpp
```

causes clang to fail with

```console
a.cpp:8:36: error: pack expansion contains parameter packs 'Ts' and 'Us' that have different lengths (0 vs. 1)
    8 |         template<typename... Us> requires(... and c<Ts, Us>)
      | ^         ~~  ~~
clang++: llvm/clang/include/clang/AST/Decl.h:276: StringRef clang::NamedDecl::getName() const: Assertion `Name.isIdentifier() && "Name is not a simple identifier"' failed.
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++ -std=c++20 -fmodule-file=a=a.pcm -c b.cpp
1. b.cpp:3:23: current parser token ';'
2.      b.cpp:3:17: instantiating class definition 'a<int>'
 #0 0x000055dfe453ffc2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (clang+++0x4598fc2)
 #1 0x000055dfe453d9ce llvm::sys::RunSignalHandlers() (clang+++0x45969ce)
 #2 0x000055dfe44843a9 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007fa344a5c710 (/usr/lib/libc.so.6+0x3e710)
 #4 0x00007fa344aac83c (/usr/lib/libc.so.6+0x8e83c)
 #5 0x00007fa344a5c668 gsignal (/usr/lib/libc.so.6+0x3e668)
 #6 0x00007fa344a444b8 abort (/usr/lib/libc.so.6+0x264b8)
 #7 0x00007fa344a443dc (/usr/lib/libc.so.6+0x263dc)
 #8 0x00007fa344a54d26 (/usr/lib/libc.so.6+0x36d26)
 #9 0x000055dfe74e2dba clang::Sema::PrintInstantiationStack() (clang+++0x753bdba)
#10 0x000055dfe6b4978d clang::Sema::EmitCurrentDiagnostic(unsigned int) (clang+++0x6ba278d)
#11 0x000055dfe6b4a677 clang::Sema::ImmediateDiagBuilder::~ImmediateDiagBuilder() Sema.cpp:0:0
#12 0x000055dfe6b4a7e8 clang::Sema::SemaDiagnosticBuilder::~SemaDiagnosticBuilder() (clang+++0x6ba37e8)
#13 0x000055dfe758b31a clang::Sema::CheckParameterPacksForExpansion(clang::SourceLocation, clang::SourceRange, llvm::ArrayRef<std::pair<llvm::PointerUnion<clang::TemplateTypeParmType const*, clang::NamedDecl*>, clang::SourceLocation>>, clang::MultiLevelTemplateArgumentList const&, bool&, bool&, std::optional<unsigned int>&) (clang+++0x75e431a)
#14 0x000055dfe74fd6d9 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCXXFoldExpr(clang::CXXFoldExpr*) SemaTemplateInstantiate.cpp:0:0
#15 0x000055dfe74ec36c clang::Sema::SubstConstraintExprWithoutSatisfaction(clang::Expr*, clang::MultiLevelTemplateArgumentList const&) (clang+++0x754536c)
#16 0x000055dfe6cc2882 SubstituteConstraintExpressionWithoutSatisfaction(clang::Sema&, clang::Sema::TemplateCompareNewDeclInfo const&, clang::Expr const*) SemaConcept.cpp:0:0
#17 0x000055dfe6cc2606 clang::Sema::AreConstraintExpressionsEqual(clang::NamedDecl const*, clang::Expr const*, clang::Sema::TemplateCompareNewDeclInfo const&, clang::Expr const*) (clang+++0x6d1b606)
#18 0x000055dfe7364961 clang::Sema::TemplateParameterListsAreEqual(clang::Sema::TemplateCompareNewDeclInfo const&, clang::TemplateParameterList*, clang::NamedDecl const*, clang::TemplateParameterList*, bool, clang::Sema::TemplateParameterListEqualKind, clang::SourceLocation) (clang+++0x73bd961)
#19 0x000055dfe72b88df IsOverloadOrOverrideImpl(clang::Sema&, clang::FunctionDecl*, clang::FunctionDecl*, bool, bool, bool) SemaOverload.cpp:0:0
#20 0x000055dfe72b8385 clang::Sema::CheckOverload(clang::Scope*, clang::FunctionDecl*, clang::LookupResult const&, clang::NamedDecl*&, bool) (clang+++0x7311385)
#21 0x000055dfe6d4dd02 clang::Sema::CheckFunctionDeclaration(clang::Scope*, clang::FunctionDecl*, clang::LookupResult&, bool, bool) (clang+++0x6da6d02)
#22 0x000055dfe753f31d clang::TemplateDeclInstantiator::VisitFunctionDecl(clang::FunctionDecl*, clang::TemplateParameterList*, clang::TemplateDeclInstantiator::RewriteKind) (clang+++0x759831d)
#23 0x000055dfe753c79c clang::TemplateDeclInstantiator::VisitFunctionTemplateDecl(clang::FunctionTemplateDecl*) (clang+++0x759579c)
#24 0x000055dfe75398b6 clang::TemplateDeclInstantiator::VisitFriendDecl(clang::FriendDecl*) (clang+++0x75928b6)
#25 0x000055dfe74e7c05 clang::Sema::InstantiateClass(clang::SourceLocation, clang::CXXRecordDecl*, clang::CXXRecordDecl*, clang::MultiLevelTemplateArgumentList const&, clang::TemplateSpecializationKind, bool) (clang+++0x7540c05)
#26 0x000055dfe74e9e7b clang::Sema::InstantiateClassTemplateSpecialization(clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind, bool) (clang+++0x7542e7b)
#27 0x000055dfe7385234 clang::Sema::ActOnExplicitInstantiation(clang::Scope*, clang::SourceLocation, clang::SourceLocation, unsigned int, clang::SourceLocation, clang::CXXScopeSpec const&, clang::OpaquePtr<clang::TemplateName>, clang::SourceLocation, clang::SourceLocation, llvm::MutableArrayRef<clang::ParsedTemplateArgument>, clang::SourceLocation, clang::ParsedAttributesView const&) (clang+++0x73de234)
#28 0x000055dfe69cd590 clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::ParsedAttributes&) (clang+++0x6a26590)
#29 0x000055dfe69a8bf8 clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*, clang::ImplicitTypenameContext) (clang+++0x6a01bf8)
#30 0x000055dfe6a673fe clang::Parser::ParseSingleDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (clang+++0x6ac03fe)
#31 0x000055dfe6a65bf4 clang::Parser::ParseExplicitInstantiation(clang::DeclaratorContext, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (clang+++0x6abebf4)
#32 0x000055dfe6a65aa7 clang::Parser::ParseDeclarationStartingWithTemplate(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (clang+++0x6abeaa7)
#33 0x000055dfe69a2147 clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) (clang+++0x69fb147)
#34 0x000055dfe6a79fa4 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (clang+++0x6ad2fa4)
#35 0x000055dfe6a78416 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (clang+++0x6ad1416)
#36 0x000055dfe698a2ee clang::ParseAST(clang::Sema&, bool, bool) (clang+++0x69e32ee)
#37 0x000055dfe528035d clang::FrontendAction::Execute() (clang+++0x52d935d)
#38 0x000055dfe51e6add clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (clang+++0x523fadd)
#39 0x000055dfe531e2ee clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (clang+++0x53772ee)
#40 0x000055dfe2caab71 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (clang+++0x2d03b71)
#41 0x000055dfe2ca6ede ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#42 0x000055dfe4fbd2f9 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::$_0>(long) Job.cpp:0:0
#43 0x000055dfe44840a6 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (clang+++0x44dd0a6)
#44 0x000055dfe4fbc993 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (clang+++0x5015993)
#45 0x000055dfe4f76d1d clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (clang+++0x4fcfd1d)
#46 0x000055dfe4f76ff7 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (clang+++0x4fcfff7)
#47 0x000055dfe4f99ec9 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (clang+++0x4ff2ec9)
#48 0x000055dfe2ca6351 clang_main(int, char**, llvm::ToolContext const&) (clang+++0x2cff351)
#49 0x000055dfe2cb7ad2 main (clang+++0x2d10ad2)
#50 0x00007fa344a45cd0 (/usr/lib/libc.so.6+0x27cd0)
#51 0x00007fa344a45d8a __libc_start_main (/usr/lib/libc.so.6+0x27d8a)
#52 0x000055dfe2ca32e5 _start (clang+++0x2cfc2e5)
clang++: error: clang frontend command failed with exit code 134 (use -v to see invocation)
clang version 18.0.0git (https://github.com/llvm/llvm-project.git fc6faa1113e9069f41b5500db051210af0eea843)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: llvm/build/bin
clang++: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/b-55bc08.cpp
clang++: note: diagnostic msg: /tmp/b-55bc08.sh
clang++: note: diagnostic msg: 

********************
```

This started happening within the past two weeks or so.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkW0t327aX_zT0Bsc6JMDnwgtFtlt30sbHdtrsfEDgUsKYIlkAdJxZ9LPPAUhJBE1KStp_ZzE5jk0RwH387gMXD1GlxLoCuPKiD150fUFbvanlFaevgitdV3CR1_zb1U_iFSpEF6xpPLL0_GvP3_2O_e7HNNk38NbUUqNtzdsSEPXIh2F_DdumpBo8stLfGqjoFjy8QvtnctP1Y3XFoNGIIY9cIy1bGBHq2UzQWywW6EntKSktW6YRRV6yJ5DNDPtshiEJf7ZCgvJwal7SiiPmkdWTMpLaLh7O9qQKKaDiKK_rEtUNSKpr6ZFr84NTaoZQj6w-q8Vi0Y10BPH8TIJuZTXWMfOS6_45uZ4BEe1088jK0N732hllOMiokZ9lQbG10M6ZbshVVPok4z82UCFWbxtRAkdfhd5MslcbKMve-CWt1h7-4OEP6FJp7pFr1n3EPrp8Q_2Hy97HLovu4bJuddNqj1zTRcO26PKykdAzRpes998zOOzoFaIEQ-1AkfUQzmvLaKtAIcsA6RoVVJTzSrO6UnUJvYV666QeWZLYI0sEUhpnWqKGshcEbw2tlKgNmpWmolKooZJuQYO0PRTycGLcNLFO6-Hks_2gN1SjDX0FxEVRgIRKoxKqtd6YEamPXtUCBXunRgihFHnJCu3-_VPh0lEzlL3oZk_9r7_M_3eGMXqX5evWw7f921tRsbLlMHizfHzy8O01sHKx8cgSJxa3Ry1FtX6AorOD8Xiy_I1ugZue3cc16N9s9klNTBpDaDN0qRRIbUD2Yt90WAh1x6HSohAg-94ejj0cIw9j0wMJharapBgltk0JSAz6Y2MA4wTAF52K9x9vlo83SLX5VphBebtGErpsVqON1o0yEuJbD9-uhd60-YLVBoUeDPPnspH1fwPTBhOlWgP-rUW-RwjpDSAmqdqgnLIXLSmzebaR0MiagVLAkapb2b02I6lSNRNUA0eyrZBiUjS6F_lRG__j7faQPPwFupf1WtItonLdbqHSRmz0j0RWsNinKmKsSizlVlrPbahUIJGuX6AyPm6yD066gXjRudRwdJCY0aJSmlZaUC2qtZFSKcShEJXojI2TQT7bkUMeJj7y33zf96OIFxBGpCgY7vzSupH6prqHeykqbYF66tBOD50k_fpcKy2Bbq3rrJBhZB0pHXo8_uC_hVGWFgwfYsbDJBjJwDMGUzI8tNWjWFe0_JlWvASp9v46xSbOjJgDNthhE6YhoRlaGS96AFa_gvzmUPdw2qvh9FnVlYY33VvAt__3LEjPIikoCUMasSTwkZXytlXSeLfIu99soepFbGUlkAS-I2nokqEsJewkmRRSwhwy0ViaOE7RWlklz5AqjlOHXOySC8MwTxHNTWSfIobjMHeJJWNihJ9WEceEuyqmIxVDbhPXCdVibtx0QCYbukYSAuY5HSbXR9jSQRzcHaKtrmxQzHtiEpGc5_RQU2ESOEEX52GWpHya3c1W6FWXGa4FXVe10oJ5OG0rW9nyI5EW5xQnKXcYByPGNE6SacZ32y1wky8N2w-tKDnIruWvyaZOfzP-fWQYznjMOYF0mrN5Oujqsp5um8U-zilJIHUgII6pozQnwYypVxtgL_e7EuTeVCC3tbzZlSl7ft0wO9t8rJn1CZMD3zU-0Gpt56NDaltKSb89QOGRlZ1MzLuGCumR1aHTfS0qDfJzZQiT1YDuU1-4PH1r4J7Krfnbz_V4OZLhUB_gpZ0EJiTci2-K3nGXX9tSi4_wCuWO7bKfGT8KpXdsbfo3q4X3j3sN68YwoaVHVo4fG5bxbBhBSAI3jEI3agse82wo8ZMEeJK0UkUtt2YRgVNa1dW3bd0qZKo81dBujnDQPES3qU5vdrR6OqsvX27rkt-8NdL1AKdhuYuG90RhOkCiUQpiJGYzAdLmSq8M3JKKShuGfwi9qVv9SLVQBWX6nXvupfoxk86YJIxIzByTxE6YM4bTFCMrsNCtBldqUCaOTspuNe9caBKPneyrettQCb_BV-Pmd1VRO045QmMQJ52lVt2afNo6yViv2I-npVnKSS3VzZ8tLV3F9iE5F7MjOf9z-k_lTh7ksR871k0dHyVxmMXBcZn26dM4lFpKmIDh72gyyedI8ptD8xidLoWdAN8ZaJX8L1Hx41l2JqxIzrM4cIB36xOcpykv0J369AqyrCn_JM2TFBzuts0Uuu9wu20rG2m7CeFk6w4E928XOTsxJkMH-2PZSRodmXB3xEZasLqBswQdtH6s65e2eQDVlnrOgZxpcThlzdgmCEgaDW2D3ZqKh5z7-Ih-Q5GppBPp7u-q6qhxVJ2Y05j72FEHu_URKUjApyKli8zhTGlafxdKaFfU9Gwlzgzm4xI8wFcpNHTRNzNvZSkJnMIYj6pCwpKM_aDWw67T2rs95hJwEmVRkjnTKw5HYmZpHn-vmHZDd0K4wfsjIuE0d-YEPK5bEubPhPegBFqVVKnvKKBXX76Y9bfk045zovk7KtcJLB8bYIKW4n-sYLusfixJRKHPfDdJxCOUMkjy81CaFuN7sJuncjwMf0RxDEnuKJ64JUMaYRLOFE5Mf6pu3ppSMOGusM_Kj2cswIaN7gL6fEqrL1-sAAacOc_51NA_W7jXcnq19lt_EvS35D8sD39tNc1LGCwlBwPvqVTAx27_ndw7IkutpchbDep3AV9PLg4IB0xCxxec8jHOGI8y_x0fOXi2rmvdsN-dHnTW9UsPa_0C1RnFltNoPN8Qfm-8d0LwwxJuvg5dMgaOqJNl45D2ToJ-P_EE5PNAxxTHUeY7QGcu0DTNi_SojoNiZK_DKD__C4j9OFJ9z49d8dAjN109mArZZJin_qRnT3UGXT_IC2cHyd0yj2mckAKO4vEoqnU5xHhZaJA7kN7DTO0p62l1zwfb9BTV2hB_WN7dfcq705V3a-pRyExaeuyVx606gyrzSQEOqsEI1SgvwqOKnzFVnALzO3Pu_wlSOeSFk0bdcwyDFKXJ2dGtqdSiWv8h9ObHHPDf1JzSxNGcjPIaDsKzNf-3tTzdY8xjdicmK_IgdJEIXR9IsoKeihYNsqLlLCL_hEaDNNNNFbMqUY4L6rp1NFIpDYP4qEpPdWOL-vdrmZkCzHT8SdZmnVzsNptntnV-tQe5d_aqyKO2QTI_AfMgDJxFEXG3QbOUYng_RdjD_ZmtmnMW7xkQDG4SdartCKc-iZzF-6003l7xZbfNat_dvAFrNcyfokSYZyRy1svEKeWiAGLKHUar7l6K7JIzA4fVcmKTdyTZLNoRJgXlrjBOuRORAEZo92wPMr3uYy49JvOs-0YkSUbQh05VgBmleRIgxoLnLRWVc1w-rNQ3dLAR21flzju8Qq-14POyYO6TPHG2C8NgJEsMHNAOhVXwZJ1qINHjlpbl78B0Le0G4pRgsbvqMDT61OksBbgUryAndwJD9wC-yDkuMqvdgG7R75E8SwuQbe1cc38Uw2hZ5pS9PBej47COd2_MVbCqt1ta8bGXHz99G5xNDfDZXbg5HIztBzw_s7e3IOg-5FQJ9qxs9x5Fp7N58awlFVrtmkfkaFka56zloN10GWzCLoc3eswPDp992ykta-MbGfqlzqdNQMZ3IHwaD9CfuunQb6u11SMtoPzmIHjcWjNXM0LOferkyzAceQbLMoL-P1t2Muv4QZRlxAEucoFLYu7u1jrA2fxG32X-HZpOMhwN3Np7b9OLiyNdx1vqs7qFBSu4uycbxmPdiiL5Xt1-qXM1r9gvdf5uB_BYVhyf0b_fOzqKRW_w8xEpCqfqCxMXkSwDls1xvx48OxPgxMw3h-S_iMh0qigKDCxzMEjHcxuJ-jPI3Uy7k8GG6LIPsNMz19TcyoqCRO7cmrn884RyjAzn6ck58Cl3Dlgif3TzKWL89B0xnDDu7PFEwZgMTyl6fjbDnpVZ5T3vhDpBmKfOrYoIjwAmGCLUkZzBiGE47HYP24d3fO17VPRlHmK9K3R3R-0VYgRvwpiEAwpIaHi1CtDlK9I1UgBIDOq2ITP0CtLeGw7Shb_w18LK-X03TRdmVMHigtIgCAhkfpwVYZBHke_z3I8CHPi08AFoGh4y8BOVa7D3at_S-DkOL9vqpaq_VpelqNq3y3XV9v02EihH25pDae8710q8dU222CxL4NdCDq4E560oufkrqklYq1qbmhrx_WUotFUm4tDOkH_jZ3CVu7_Nu3x6Wq5-Rk8_36DbTx8_fvrj7ref0O3dx5tH9PTJvv7w-Sf0cHP_6eHJ292hvZ-6jZsqE2uzN3L3HSQgO10CR1TvSZ6PAr7V28YAeBlFOfPTycvx30tDbX7MGP-USaZu5D9thEI2OoGjDW0aqES1tgElKntRuqFKI_21Rl8BXhSqJVL14oJfEZ6RjF7AVZD4kZ9iPwouNldZTgDzFDiDiANPoyIrfBLHSZLGAWP0QlxhH4d-EOAgiUI_WaQBB4I55JEfZcCYF_qwpaJcGF9e1HJ9YS9xXyVJFpGLkuZQKvuNHIwr-Ipso4exF11fyCsblHm7Vl7ol0JpdaCihS7h6ncqBeWCof6bKV7sj76XEpt0-qH_io5C_VcWPIz_g5ffPYwvWlle_fj9dovO_wYAAP__ZozfKg">