annotate gcc/testsuite/g++.dg/concepts/template-template-parm1.C @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // PR c++/66937
kono
parents:
diff changeset
2 // { dg-options "-std=c++17 -fconcepts" }
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 #include <tuple>
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 namespace detail
kono
parents:
diff changeset
7 {
kono
parents:
diff changeset
8 template<typename T, template<typename...> class Sink>
kono
parents:
diff changeset
9 struct copy_tuple_args_impl;
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 template<typename... Args, template<typename...> class Sink>
kono
parents:
diff changeset
12 struct copy_tuple_args_impl<std::tuple<Args...>, Sink>
kono
parents:
diff changeset
13 {
kono
parents:
diff changeset
14 using type = Sink<Args...>;
kono
parents:
diff changeset
15 };
kono
parents:
diff changeset
16 }
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 // copy_tuple_args copies the template arguments of a tuple into another template
kono
parents:
diff changeset
19 // copy_tuple_args does not care about constraints whatsoever.
kono
parents:
diff changeset
20 template<typename Tuple, template<typename...> class Sink>
kono
parents:
diff changeset
21 using copy_tuple_args = typename detail::copy_tuple_args_impl<Tuple, Sink>::type;
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 // A concept of a column
kono
parents:
diff changeset
24 template <typename T>
kono
parents:
diff changeset
25 concept bool Column()
kono
parents:
diff changeset
26 {
kono
parents:
diff changeset
27 return requires()
kono
parents:
diff changeset
28 {
kono
parents:
diff changeset
29 typename T::_name_t;
kono
parents:
diff changeset
30 };
kono
parents:
diff changeset
31 }
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 // column_list is constrained to Column arguments
kono
parents:
diff changeset
34 template<Column... C>
kono
parents:
diff changeset
35 struct column_list
kono
parents:
diff changeset
36 {
kono
parents:
diff changeset
37 };
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 // Here are some columns
kono
parents:
diff changeset
40 struct A
kono
parents:
diff changeset
41 {
kono
parents:
diff changeset
42 using _name_t = int;
kono
parents:
diff changeset
43 };
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 struct B
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 using _name_t = int;
kono
parents:
diff changeset
48 };
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 int main()
kono
parents:
diff changeset
52 {
kono
parents:
diff changeset
53 using ColumnTuple = std::tuple<A, B>;
kono
parents:
diff changeset
54 using ColumnList = copy_tuple_args<ColumnTuple, column_list>; // This fails, but should not
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56