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 Dionne void 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 Dionne struct Foo { void operator()(int) const { } };
get_foo()337a6aaf9bSLouis Dionne Foo& get_foo() { static Foo foo; return foo; }
347a6aaf9bSLouis Dionne 
main(int,char **)35*504bc07dSLouis Dionne int main(int, char**) {
367a6aaf9bSLouis Dionne     test();
37*504bc07dSLouis Dionne     return 0;
387a6aaf9bSLouis Dionne }
39