Index: clang/lib/AST/ODRHash.cpp =================================================================== --- clang/lib/AST/ODRHash.cpp +++ clang/lib/AST/ODRHash.cpp @@ -139,23 +139,8 @@ } void ODRHash::AddTemplateName(TemplateName Name) { - auto Kind = Name.getKind(); - ID.AddInteger(Kind); - - switch (Kind) { - case TemplateName::Template: - AddDecl(Name.getAsTemplateDecl()); - break; - // TODO: Support these cases. - case TemplateName::OverloadedTemplate: - case TemplateName::AssumedTemplate: - case TemplateName::QualifiedTemplate: - case TemplateName::DependentTemplate: - case TemplateName::SubstTemplateTemplateParm: - case TemplateName::SubstTemplateTemplateParmPack: - case TemplateName::UsingTemplate: - break; - } + if (auto *TD = Name.getAsTemplateDecl()) + AddDecl(TD); } void ODRHash::AddTemplateArgument(TemplateArgument TA) { Index: clang/test/Modules/merge-template-template-parameters.cppm =================================================================== --- /dev/null +++ clang/test/Modules/merge-template-template-parameters.cppm @@ -0,0 +1,44 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 -emit-module-interface -I%t %t/module1.cppm -o %t/module1.pcm +// RUN: %clang_cc1 -std=c++20 -emit-module-interface -I%t %t/module2.cppm -o %t/module2.pcm +// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/merge.cpp -verify -fsyntax-only + +//--- header.h +namespace NS { +template +class A { +}; + +template