17a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===// 27a6aaf9bSLouis Dionne // 37a6aaf9bSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47a6aaf9bSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 57a6aaf9bSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67a6aaf9bSLouis Dionne // 77a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===// 87a6aaf9bSLouis Dionne 931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17 107a6aaf9bSLouis Dionne 117a6aaf9bSLouis Dionne // <functional> 127a6aaf9bSLouis Dionne // 137a6aaf9bSLouis Dionne // reference_wrapper 147a6aaf9bSLouis Dionne // 157a6aaf9bSLouis Dionne // template <class... ArgTypes> 167a6aaf9bSLouis Dionne // std::invoke_result_t<T&, ArgTypes...> 177a6aaf9bSLouis Dionne // operator()(ArgTypes&&... args) const; 187a6aaf9bSLouis Dionne // 197a6aaf9bSLouis Dionne // Requires T to be a complete type (since C++20). 207a6aaf9bSLouis Dionne 217a6aaf9bSLouis Dionne #include <functional> 227a6aaf9bSLouis Dionne 237a6aaf9bSLouis Dionne 247a6aaf9bSLouis Dionne struct Foo; 257a6aaf9bSLouis Dionne Foo& get_foo(); 267a6aaf9bSLouis Dionne test()277a6aaf9bSLouis Dionnevoid test() { 287a6aaf9bSLouis Dionne std::reference_wrapper<Foo> ref = get_foo(); 297a6aaf9bSLouis Dionne ref(0); // incomplete at the point of call 307a6aaf9bSLouis Dionne } 317a6aaf9bSLouis Dionne operator ()Foo327a6aaf9bSLouis Dionnestruct Foo { void operator()(int) const { } }; get_foo()337a6aaf9bSLouis DionneFoo& get_foo() { static Foo foo; return foo; } 347a6aaf9bSLouis Dionne main(int,char **)35*504bc07dSLouis Dionneint main(int, char**) { 367a6aaf9bSLouis Dionne test(); 37*504bc07dSLouis Dionne return 0; 387a6aaf9bSLouis Dionne } 39