1*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===// 2*7a6aaf9bSLouis Dionne // 3*7a6aaf9bSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*7a6aaf9bSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*7a6aaf9bSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*7a6aaf9bSLouis Dionne // 7*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===// 8*7a6aaf9bSLouis Dionne 9*7a6aaf9bSLouis Dionne // <functional> 10*7a6aaf9bSLouis Dionne 11*7a6aaf9bSLouis Dionne // reference_wrapper 12*7a6aaf9bSLouis Dionne 13*7a6aaf9bSLouis Dionne // template <class... ArgTypes> 14*7a6aaf9bSLouis Dionne // requires Callable<T, ArgTypes&&...> 15*7a6aaf9bSLouis Dionne // Callable<T, ArgTypes&&...>::result_type 16*7a6aaf9bSLouis Dionne // operator()(ArgTypes&&... args) const; 17*7a6aaf9bSLouis Dionne 18*7a6aaf9bSLouis Dionne #include <functional> 19*7a6aaf9bSLouis Dionne #include <cassert> 20*7a6aaf9bSLouis Dionne 21*7a6aaf9bSLouis Dionne // member data pointer: cv qualifiers should transfer from argument to return type 22*7a6aaf9bSLouis Dionne 23*7a6aaf9bSLouis Dionne struct A_int_1 24*7a6aaf9bSLouis Dionne { A_int_1A_int_125*7a6aaf9bSLouis Dionne A_int_1() : data_(5) {} 26*7a6aaf9bSLouis Dionne 27*7a6aaf9bSLouis Dionne int data_; 28*7a6aaf9bSLouis Dionne }; 29*7a6aaf9bSLouis Dionne 30*7a6aaf9bSLouis Dionne void test_int_1()31*7a6aaf9bSLouis Dionnetest_int_1() 32*7a6aaf9bSLouis Dionne { 33*7a6aaf9bSLouis Dionne // member data pointer 34*7a6aaf9bSLouis Dionne { 35*7a6aaf9bSLouis Dionne int A_int_1::*fp = &A_int_1::data_; 36*7a6aaf9bSLouis Dionne std::reference_wrapper<int A_int_1::*> r1(fp); 37*7a6aaf9bSLouis Dionne A_int_1 a; 38*7a6aaf9bSLouis Dionne assert(r1(a) == 5); 39*7a6aaf9bSLouis Dionne r1(a) = 6; 40*7a6aaf9bSLouis Dionne assert(r1(a) == 6); 41*7a6aaf9bSLouis Dionne const A_int_1* ap = &a; 42*7a6aaf9bSLouis Dionne assert(r1(ap) == 6); 43*7a6aaf9bSLouis Dionne r1(ap) = 7; 44*7a6aaf9bSLouis Dionne assert(r1(ap) == 7); 45*7a6aaf9bSLouis Dionne } 46*7a6aaf9bSLouis Dionne } 47*7a6aaf9bSLouis Dionne main(int,char **)48*7a6aaf9bSLouis Dionneint main(int, char**) 49*7a6aaf9bSLouis Dionne { 50*7a6aaf9bSLouis Dionne test_int_1(); 51*7a6aaf9bSLouis Dionne 52*7a6aaf9bSLouis Dionne return 0; 53*7a6aaf9bSLouis Dionne } 54