Check for matching template-parameter-lists when merging template declarations.

llvm-svn: 184791
diff --git a/clang/test/Modules/cxx-templates.cpp b/clang/test/Modules/cxx-templates.cpp
index 7926812..7d500f4 100644
--- a/clang/test/Modules/cxx-templates.cpp
+++ b/clang/test/Modules/cxx-templates.cpp
@@ -6,6 +6,12 @@
 @import cxx_templates_a;
 @import cxx_templates_b;
 
+template<typename, char> struct Tmpl_T_C {};
+template<typename, int, int> struct Tmpl_T_I_I {};
+
+template<typename A, typename B, A> struct Tmpl_T_T_A {};
+template<typename A, typename B, B> struct Tmpl_T_T_B {};
+
 void g() {
   f(0);
   f<double>(1.0);
@@ -20,6 +26,26 @@
   N::f(); // expected-error {{no matching function}}
   // expected-note@Inputs/cxx-templates-a.h:4 {{couldn't infer template argument}}
   // expected-note@Inputs/cxx-templates-a.h:5 {{requires 1 argument, but 0 were provided}}
+
+  template_param_kinds_1<0>(); // ok, from cxx-templates-a.h
+  template_param_kinds_1<int>(); // ok, from cxx-templates-b.h
+
+  template_param_kinds_2<Tmpl_T_C>(); // expected-error {{no matching function}}
+  // expected-note@Inputs/cxx-templates-a.h:9 {{invalid explicitly-specified argument}}
+  // expected-note@Inputs/cxx-templates-b.h:9 {{invalid explicitly-specified argument}}
+
+  template_param_kinds_2<Tmpl_T_I_I>(); // expected-error {{ambiguous}}
+  // expected-note@Inputs/cxx-templates-a.h:9 {{candidate}}
+  // expected-note@Inputs/cxx-templates-b.h:9 {{candidate}}
+
+  // FIXME: This should be valid, but we incorrectly match the template template
+  // argument against both template template parameters.
+  template_param_kinds_3<Tmpl_T_T_A>(); // expected-error {{ambiguous}}
+  // expected-note@Inputs/cxx-templates-a.h:10 {{candidate}}
+  // expected-note@Inputs/cxx-templates-b.h:10 {{candidate}}
+  template_param_kinds_3<Tmpl_T_T_B>(); // expected-error {{ambiguous}}
+  // expected-note@Inputs/cxx-templates-a.h:10 {{candidate}}
+  // expected-note@Inputs/cxx-templates-b.h:10 {{candidate}}
 }
 
 // FIXME: There should only be two 'f's here.