annotate gcc/testsuite/g++.dg/template/sfinae4.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 // DR 339
kono
parents:
diff changeset
2 //
kono
parents:
diff changeset
3 // Test of the use of free functions with SFINAE
kono
parents:
diff changeset
4 void foo(int) { }
kono
parents:
diff changeset
5 template<typename T> void foo(T*) { }
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 typedef char yes_type;
kono
parents:
diff changeset
8 struct no_type { char data[2]; };
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 template<typename T> T create_a();
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 template<bool, typename T = void> struct enable_if { typedef T type; };
kono
parents:
diff changeset
13 template<typename T> struct enable_if<false, T> { };
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 template<typename T>
kono
parents:
diff changeset
16 typename enable_if<(sizeof(foo(create_a<T const&>()), 1) > 0),
kono
parents:
diff changeset
17 yes_type>::type
kono
parents:
diff changeset
18 check_has_foo(const volatile T&);
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 no_type check_has_foo(...);
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 template<typename T>
kono
parents:
diff changeset
23 struct has_foo
kono
parents:
diff changeset
24 {
kono
parents:
diff changeset
25 static const bool value =
kono
parents:
diff changeset
26 (sizeof(check_has_foo(create_a<T const&>())) == sizeof(yes_type));
kono
parents:
diff changeset
27 };
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 struct X { };
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 int a1[has_foo<int>::value? 1 : -1];
kono
parents:
diff changeset
32 int a2[has_foo<long>::value? 1 : -1];
kono
parents:
diff changeset
33 int a3[has_foo<int*>::value? 1 : -1];
kono
parents:
diff changeset
34 int a4[has_foo<X>::value? -1 : 1];
kono
parents:
diff changeset
35 int a5[has_foo<int X::*>::value? -1 : 1];