invoke_lvalue.pass.cpp 5.6 KB

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