comparison gcc/testsuite/g++.dg/concepts/pr65681.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
comparison
equal deleted inserted replaced
131:84e7813d76e9 145:1830386684a0
1 // { dg-do compile { target c++17 } } 1 // { dg-do compile { target c++17_only } }
2 // { dg-options "-fconcepts" } 2 // { dg-options "-fconcepts" }
3 3
4 template<typename T> 4 template<typename T>
5 concept bool C() 5 concept bool C = requires (T t) { t.mf(); };
6 {
7 return requires (T t) { t.mf(); };
8 }
9 6
10 template<typename T> 7 template<typename T>
11 concept bool CA1() 8 concept bool CA1 = C<typename T::ca1_type>;
12 {
13 return C<typename T::ca1_type>();
14 }
15 9
16 template<typename T> 10 template<typename T>
17 concept bool CA2() 11 concept bool CA2 = CA1<T> && requires () { typename T::ca2_type; };
18 {
19 return CA1<T>() && requires () { typename T::ca2_type; };
20 }
21 12
22 template<typename T> 13 template<typename T>
23 concept bool CA3() 14 concept bool CA3 = CA2<T> && requires () { typename T::ca3_type; };
24 {
25 return CA2<T>() && requires () { typename T::ca3_type; };
26 }
27 15
28 template<typename T> 16 template<typename T>
29 concept bool CB1() 17 concept bool CB1 = requires () { typename T::cb1_type; };
30 {
31 return requires () { typename T::cb1_type; };
32 }
33 18
34 template<typename T> 19 template<typename T>
35 concept bool CB2() 20 concept bool CB2 = CB1<T> && requires () { typename T::cb2_type; };
36 {
37 return CB1<T>() && requires () { typename T::cb2_type; };
38 }
39 21
40 template<typename T> 22 template<typename T>
41 concept bool CB3() 23 concept bool CB3 = CB2<T> && requires () { typename T::cb3_type; };
42 {
43 return CB2<T>() && requires () { typename T::cb3_type; };
44 }
45 24
46 25
47 struct MC { void mf(); }; 26 struct MC { void mf(); };
48 static_assert(C<MC>(), ""); 27 static_assert(C<MC>, "");
49 28
50 29
51 struct MA1 { using ca1_type = MC; }; 30 struct MA1 { using ca1_type = MC; };
52 struct MA2 : MA1 { using ca2_type = int; }; 31 struct MA2 : MA1 { using ca2_type = int; };
53 struct MA3 : MA2 { using ca3_type = int; }; 32 struct MA3 : MA2 { using ca3_type = int; };
54 static_assert(CA1<MA1>(), ""); 33 static_assert(CA1<MA1>, "");
55 static_assert(CA2<MA2>(), ""); 34 static_assert(CA2<MA2>, "");
56 static_assert(CA3<MA3>(), ""); 35 static_assert(CA3<MA3>, "");
57 36
58 struct MB1 { using cb1_type = int; }; 37 struct MB1 { using cb1_type = int; };
59 struct MB2 : MB1 { using cb2_type = int; }; 38 struct MB2 : MB1 { using cb2_type = int; };
60 struct MB3 : MB2 { using cb3_type = int; }; 39 struct MB3 : MB2 { using cb3_type = int; };
61 static_assert(CB1<MB1>(), ""); 40 static_assert(CB1<MB1>, "");
62 static_assert(CB2<MB2>(), ""); 41 static_assert(CB2<MB2>, "");
63 static_assert(CB3<MB3>(), ""); 42 static_assert(CB3<MB3>, "");
64 43
65 44
66 template<typename T1, typename T2> 45 template<typename T1, typename T2>
67 struct S; 46 struct S;
68 47
71 { 50 {
72 static constexpr int value = 1; 51 static constexpr int value = 1;
73 }; 52 };
74 53
75 template<CA1 T1, CB2 T2> 54 template<CA1 T1, CB2 T2>
76 requires !CA2<T1>() 55 requires (!CA2<T1>)
77 struct S<T1, T2> // Specialization #2 56 struct S<T1, T2> // Specialization #2
78 { 57 {
79 static constexpr int value = 2; 58 static constexpr int value = 2;
80 }; 59 };
81 60
82 template<CA2 T1, CB3 T2> 61 template<CA2 T1, CB3 T2>
83 requires !CA3<T1>() 62 requires (!CA3<T1>)
84 struct S<T1, T2> // Specialization #3 63 struct S<T1, T2> // Specialization #3
85 { 64 {
86 static constexpr int value = 3; 65 static constexpr int value = 3;
87 }; 66 };
88
89 S<MA1,MB1> s11;
90 S<MA1,MB2> s12;
91 S<MA1,MB3> s13;
92 S<MA2,MB1> s21;
93 S<MA2,MB2> s22;
94 S<MA2,MB3> s23;
95 S<MA3,MB1> s31;
96 S<MA3,MB2> s32;
97 S<MA3,MB3> s33;
98 67
99 static_assert(S<MA1,MB1>::value == 1, ""); 68 static_assert(S<MA1,MB1>::value == 1, "");
100 static_assert(S<MA1,MB2>::value == 2, ""); 69 static_assert(S<MA1,MB2>::value == 2, "");
101 static_assert(S<MA1,MB3>::value == 2, ""); 70 static_assert(S<MA1,MB3>::value == 2, "");
102 static_assert(S<MA2,MB1>::value == 1, ""); 71 static_assert(S<MA2,MB1>::value == 1, "");