invoke_lvalue.pass.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // UNSUPPORTED: c++98, c++03
  10. // <functional>
  11. // template<CopyConstructible Fn, CopyConstructible... Types>
  12. // unspecified bind(Fn, Types...);
  13. // template<Returnable R, CopyConstructible Fn, CopyConstructible... Types>
  14. // unspecified bind(Fn, Types...);
  15. #include <stdio.h>
  16. #include <functional>
  17. #include <cassert>
  18. int count = 0;
  19. // 1 arg, return void
  20. void f_void_1(int i)
  21. {
  22. count += i;
  23. }
  24. struct A_void_1
  25. {
  26. void operator()(int i)
  27. {
  28. count += i;
  29. }
  30. void mem1() {++count;}
  31. void mem2() const {count += 2;}
  32. };
  33. void
  34. test_void_1()
  35. {
  36. using namespace std::placeholders;
  37. int save_count = count;
  38. // function
  39. {
  40. int i = 2;
  41. std::bind(f_void_1, _1)(i);
  42. assert(count == save_count + 2);
  43. save_count = count;
  44. }
  45. {
  46. int i = 2;
  47. std::bind(f_void_1, i)();
  48. assert(count == save_count + 2);
  49. save_count = count;
  50. }
  51. // function pointer
  52. {
  53. void (*fp)(int) = f_void_1;
  54. int i = 3;
  55. std::bind(fp, _1)(i);
  56. assert(count == save_count+3);
  57. save_count = count;
  58. }
  59. {
  60. void (*fp)(int) = f_void_1;
  61. int i = 3;
  62. std::bind(fp, i)();
  63. assert(count == save_count+3);
  64. save_count = count;
  65. }
  66. // functor
  67. {
  68. A_void_1 a0;
  69. int i = 4;
  70. std::bind(a0, _1)(i);
  71. assert(count == save_count+4);
  72. save_count = count;
  73. }
  74. {
  75. A_void_1 a0;
  76. int i = 4;
  77. std::bind(a0, i)();
  78. assert(count == save_count+4);
  79. save_count = count;
  80. }
  81. // member function pointer
  82. {
  83. void (A_void_1::*fp)() = &A_void_1::mem1;
  84. A_void_1 a;
  85. std::bind(fp, _1)(a);
  86. assert(count == save_count+1);
  87. save_count = count;
  88. A_void_1* ap = &a;
  89. std::bind(fp, _1)(ap);
  90. assert(count == save_count+1);
  91. save_count = count;
  92. }
  93. {
  94. void (A_void_1::*fp)() = &A_void_1::mem1;
  95. A_void_1 a;
  96. std::bind(fp, a)();
  97. assert(count == save_count+1);
  98. save_count = count;
  99. A_void_1* ap = &a;
  100. std::bind(fp, ap)();
  101. assert(count == save_count+1);
  102. save_count = count;
  103. }
  104. // const member function pointer
  105. {
  106. void (A_void_1::*fp)() const = &A_void_1::mem2;
  107. A_void_1 a;
  108. std::bind(fp, _1)(a);
  109. assert(count == save_count+2);
  110. save_count = count;
  111. A_void_1* ap = &a;
  112. std::bind(fp, _1)(ap);
  113. assert(count == save_count+2);
  114. save_count = count;
  115. }
  116. {
  117. void (A_void_1::*fp)() const = &A_void_1::mem2;
  118. A_void_1 a;
  119. std::bind(fp, a)();
  120. assert(count == save_count+2);
  121. save_count = count;
  122. A_void_1* ap = &a;
  123. std::bind(fp, ap)();
  124. assert(count == save_count+2);
  125. save_count = count;
  126. }
  127. }
  128. // 1 arg, return int
  129. int f_int_1(int i)
  130. {
  131. return i + 1;
  132. }
  133. struct A_int_1
  134. {
  135. A_int_1() : data_(5) {}
  136. int operator()(int i)
  137. {
  138. return i - 1;
  139. }
  140. int mem1() {return 3;}
  141. int mem2() const {return 4;}
  142. int data_;
  143. };
  144. void
  145. test_int_1()
  146. {
  147. using namespace std::placeholders;
  148. // function
  149. {
  150. int i = 2;
  151. assert(std::bind(f_int_1, _1)(i) == 3);
  152. assert(std::bind(f_int_1, i)() == 3);
  153. }
  154. // function pointer
  155. {
  156. int (*fp)(int) = f_int_1;
  157. int i = 3;
  158. assert(std::bind(fp, _1)(i) == 4);
  159. assert(std::bind(fp, i)() == 4);
  160. }
  161. // functor
  162. {
  163. int i = 4;
  164. assert(std::bind(A_int_1(), _1)(i) == 3);
  165. assert(std::bind(A_int_1(), i)() == 3);
  166. }
  167. // member function pointer
  168. {
  169. A_int_1 a;
  170. assert(std::bind(&A_int_1::mem1, _1)(a) == 3);
  171. assert(std::bind(&A_int_1::mem1, a)() == 3);
  172. A_int_1* ap = &a;
  173. assert(std::bind(&A_int_1::mem1, _1)(ap) == 3);
  174. assert(std::bind(&A_int_1::mem1, ap)() == 3);
  175. }
  176. // const member function pointer
  177. {
  178. A_int_1 a;
  179. assert(std::bind(&A_int_1::mem2, _1)(A_int_1()) == 4);
  180. assert(std::bind(&A_int_1::mem2, A_int_1())() == 4);
  181. A_int_1* ap = &a;
  182. assert(std::bind(&A_int_1::mem2, _1)(ap) == 4);
  183. assert(std::bind(&A_int_1::mem2, ap)() == 4);
  184. }
  185. // member data pointer
  186. {
  187. A_int_1 a;
  188. assert(std::bind(&A_int_1::data_, _1)(a) == 5);
  189. assert(std::bind(&A_int_1::data_, a)() == 5);
  190. A_int_1* ap = &a;
  191. assert(std::bind(&A_int_1::data_, _1)(a) == 5);
  192. std::bind(&A_int_1::data_, _1)(a) = 6;
  193. assert(std::bind(&A_int_1::data_, _1)(a) == 6);
  194. assert(std::bind(&A_int_1::data_, _1)(ap) == 6);
  195. std::bind(&A_int_1::data_, _1)(ap) = 7;
  196. assert(std::bind(&A_int_1::data_, _1)(ap) == 7);
  197. }
  198. }
  199. // 2 arg, return void
  200. void f_void_2(int i, int j)
  201. {
  202. count += i+j;
  203. }
  204. struct A_void_2
  205. {
  206. void operator()(int i, int j)
  207. {
  208. count += i+j;
  209. }
  210. void mem1(int i) {count += i;}
  211. void mem2(int i) const {count += i;}
  212. };
  213. void
  214. test_void_2()
  215. {
  216. using namespace std::placeholders;
  217. int save_count = count;
  218. // function
  219. {
  220. int i = 2;
  221. int j = 3;
  222. std::bind(f_void_2, _1, _2)(i, j);
  223. assert(count == save_count+5);
  224. save_count = count;
  225. std::bind(f_void_2, i, _1)(j);
  226. assert(count == save_count+5);
  227. save_count = count;
  228. std::bind(f_void_2, i, j)();
  229. assert(count == save_count+5);
  230. save_count = count;
  231. }
  232. // member function pointer
  233. {
  234. int j = 3;
  235. std::bind(&A_void_2::mem1, _1, _2)(A_void_2(), j);
  236. assert(count == save_count+3);
  237. save_count = count;
  238. std::bind(&A_void_2::mem1, _2, _1)(j, A_void_2());
  239. assert(count == save_count+3);
  240. save_count = count;
  241. }
  242. }
  243. struct TFENode
  244. {
  245. bool foo(unsigned long long) const
  246. {
  247. return true;
  248. }
  249. };
  250. void
  251. test3()
  252. {
  253. using namespace std;
  254. using namespace std::placeholders;
  255. const auto f = bind(&TFENode::foo, _1, 0UL);
  256. const TFENode n = TFENode{};
  257. bool b = f(n);
  258. assert(b);
  259. }
  260. int main()
  261. {
  262. test_void_1();
  263. test_int_1();
  264. test_void_2();
  265. }