annotate gcc/testsuite/g++.dg/cpp0x/sfinae66.C @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // PR c++/95143
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 // { dg-do compile { target c++11 } }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4 struct false_type {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 static constexpr bool value = false;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 struct true_type{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 static constexpr bool value = true;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 template<class T>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 T&& declval() noexcept;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 template<typename T, typename U, typename = U>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 struct is_static_castable : false_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 {};
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 template<typename T, typename U>
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 struct is_static_castable<T, U, decltype(static_cast<U>(declval<T>()))> : true_type
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 {};
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 class Base { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 struct A { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 class B: public Base { };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 int main()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 constexpr auto canCast = is_static_castable<A, B>::value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 static_assert(!canCast, "");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 constexpr auto canCast2 = is_static_castable<A, A>::value;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 static_assert(canCast2, "");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 }