re PR c++/14032 (Specialization of inner template using outer template argument doesn...
authorJason Merrill <jason@gcc.gnu.org>
Tue, 4 Sep 2007 12:27:38 +0000 (08:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 4 Sep 2007 12:27:38 +0000 (08:27 -0400)
        PR c++/14032
        * pt.c (most_specialized_class): Substitute outer template
        arguments into the arguments of a member template partial
        specialization.
        (strip_innermost_template_args): New fn.

From-SVN: r128077

gcc/testsuite/g++.dg/template/mem-partial1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/mem-partial2.C [new file with mode: 0644]

diff --git a/gcc/testsuite/g++.dg/template/mem-partial1.C b/gcc/testsuite/g++.dg/template/mem-partial1.C
new file mode 100644 (file)
index 0000000..60cb36a
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/14032
+
+template <typename T> struct outer {
+  template <typename T2, typename U>
+  struct inner {
+    static int f() { return inner<T,int>::N; };
+  };
+
+  template <typename U>
+  struct inner<T,U> {
+    static const int N = 1;
+  };
+};
+
+int i = outer<int>::inner<double,int>::f();
diff --git a/gcc/testsuite/g++.dg/template/mem-partial2.C b/gcc/testsuite/g++.dg/template/mem-partial2.C
new file mode 100644 (file)
index 0000000..fba3255
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/14032
+// { dg-do run }
+
+template <bool compare>
+struct outer
+{
+  template <bool compare_with,bool second>
+  struct inner           // unspecialized compare != compare_with
+  {
+    static inline bool test()
+    {
+      return false;
+    }
+  };
+  template <bool second> // specialization compare == compare_with
+  struct inner<compare,second>
+  {
+    static inline bool test()
+    {
+      return true;
+    }
+  };
+};
+int main ()
+{
+  bool b = outer<true>::inner<true,false>::test();
+
+  return b != true;
+}