annotate gcc/testsuite/g++.dg/concepts/template-template-parm1.C @ 145:1830386684a0

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