diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2007-09-04 08:27:38 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2007-09-04 08:27:38 -0400 |
commit | d950f2be3733d1bc35901297014f2deaa76d9f8e (patch) | |
tree | bcd0227188c7cf0e9ee1e2ed4b241a9316312f54 | |
parent | dc28490d05f5ef25c5ff24ef946f48f402a20be8 (diff) | |
download | gcc-d950f2be3733d1bc35901297014f2deaa76d9f8e.zip gcc-d950f2be3733d1bc35901297014f2deaa76d9f8e.tar.gz gcc-d950f2be3733d1bc35901297014f2deaa76d9f8e.tar.bz2 |
re PR c++/14032 (Specialization of inner template using outer template argument doesn't work)
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
-rw-r--r-- | gcc/testsuite/g++.dg/template/mem-partial1.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/mem-partial2.C | 29 |
2 files changed, 44 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/template/mem-partial1.C b/gcc/testsuite/g++.dg/template/mem-partial1.C new file mode 100644 index 0000000..60cb36a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/mem-partial1.C @@ -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 index 0000000..fba3255 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/mem-partial2.C @@ -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; +} |