summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/template/array21.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/template/array21.C')
-rw-r--r--gcc/testsuite/g++.dg/template/array21.C50
1 files changed, 50 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/template/array21.C b/gcc/testsuite/g++.dg/template/array21.C
new file mode 100644
index 000000000..5c5f2f65d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/array21.C
@@ -0,0 +1,50 @@
+// PR c++/42447
+
+template<int>
+ void* get(int);
+
+template<typename>
+ struct unique_ptr;
+
+template<typename _Tp>
+ struct unique_ptr<_Tp[]>
+ {
+ typedef int __tuple_type;
+
+ void*
+ get() const
+ { return ::get<0>(_M_t); }
+
+ __tuple_type _M_t;
+ };
+
+template <typename T> class dynamic_dispatch;
+
+template <typename TC>
+ struct dynamic_dispatch<void (TC::*)(int&)>
+ {
+ struct entry { };
+ unique_ptr<entry[]> m_Start;
+
+ template <typename UC>
+ void attach_handler(void (UC::*m)(int&))
+ {
+ entry* p = 0;
+ do {
+ } while(--p != m_Start.get());
+ }
+ };
+
+template <typename TC>
+ class request_dispatcher
+ : private dynamic_dispatch<void (TC::*)(int&)>
+ { request_dispatcher(); };
+
+struct file_reader
+{
+ void execute_command(int&);
+};
+
+template <>
+ request_dispatcher<file_reader>::request_dispatcher()
+ { this->attach_handler(&file_reader::execute_command); }