annotate gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // { dg-do compile { target c++11 } }
kono
parents:
diff changeset
2 template<typename _Tp>
kono
parents:
diff changeset
3 _Tp&& declval() noexcept;
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 template<bool b>
kono
parents:
diff changeset
6 struct bt {
kono
parents:
diff changeset
7 static constexpr bool value = b;
kono
parents:
diff changeset
8 };
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 template <typename To_, typename... From_>
kono
parents:
diff changeset
11 class my_is_convertible_many {
kono
parents:
diff changeset
12 private:
kono
parents:
diff changeset
13 template <typename To>
kono
parents:
diff changeset
14 struct indirector {
kono
parents:
diff changeset
15 indirector(To);
kono
parents:
diff changeset
16 };
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 template <typename To, typename... From>
kono
parents:
diff changeset
19 struct tag {};
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 template <typename To, typename... From>
kono
parents:
diff changeset
22 static auto test(tag<To, From...>)
kono
parents:
diff changeset
23 -> decltype(indirector<To>({declval<From>()...}), bt<true>());
kono
parents:
diff changeset
24 static auto test(...)
kono
parents:
diff changeset
25 -> bt<false>;
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 public:
kono
parents:
diff changeset
28 static constexpr bool value = decltype(test(tag<To_, From_...>()))::value;
kono
parents:
diff changeset
29 };
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 struct A {};
kono
parents:
diff changeset
32 struct B {};
kono
parents:
diff changeset
33 struct C {};
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 struct Test {
kono
parents:
diff changeset
36 Test(A, A);
kono
parents:
diff changeset
37 //Test(B, B);
kono
parents:
diff changeset
38 explicit Test(C, C);
kono
parents:
diff changeset
39 };
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 int main() {
kono
parents:
diff changeset
42 static_assert(my_is_convertible_many<Test, A, A>::value,""); // true, correct
kono
parents:
diff changeset
43 static_assert(!my_is_convertible_many<Test, B, B>::value,""); // false, correct
kono
parents:
diff changeset
44 static_assert(!my_is_convertible_many<Test, C, C>::value,""); // error
kono
parents:
diff changeset
45 return 0;
kono
parents:
diff changeset
46 }