1beb6efb4SLouis Dionne //===----------------------------------------------------------------------===//
2beb6efb4SLouis Dionne //
3beb6efb4SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4beb6efb4SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5beb6efb4SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6beb6efb4SLouis Dionne //
7beb6efb4SLouis Dionne //===----------------------------------------------------------------------===//
8beb6efb4SLouis Dionne 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10beb6efb4SLouis Dionne 
11beb6efb4SLouis Dionne // <functional>
12beb6efb4SLouis Dionne //
13beb6efb4SLouis Dionne // reference_wrapper<T>
14beb6efb4SLouis Dionne //
15beb6efb4SLouis Dionne //  where T is an incomplete type (since C++20)
16beb6efb4SLouis Dionne 
17beb6efb4SLouis Dionne 
18beb6efb4SLouis Dionne #include <functional>
19beb6efb4SLouis Dionne #include <cassert>
20beb6efb4SLouis Dionne 
217fc6a556SMarshall Clow #include "test_macros.h"
227fc6a556SMarshall Clow 
23beb6efb4SLouis Dionne 
24beb6efb4SLouis Dionne struct Foo;
25beb6efb4SLouis Dionne 
26beb6efb4SLouis Dionne Foo& get_foo();
27beb6efb4SLouis Dionne 
test()28beb6efb4SLouis Dionne void test() {
29beb6efb4SLouis Dionne     Foo& foo = get_foo();
30beb6efb4SLouis Dionne     std::reference_wrapper<Foo> ref{foo};
31beb6efb4SLouis Dionne     assert(&ref.get() == &foo);
32beb6efb4SLouis Dionne }
33beb6efb4SLouis Dionne 
34beb6efb4SLouis Dionne struct Foo { };
35beb6efb4SLouis Dionne 
get_foo()36beb6efb4SLouis Dionne Foo& get_foo() {
37beb6efb4SLouis Dionne     static Foo foo;
38beb6efb4SLouis Dionne     return foo;
39beb6efb4SLouis Dionne }
40beb6efb4SLouis Dionne 
main(int,char **)41*504bc07dSLouis Dionne int main(int, char**) {
42beb6efb4SLouis Dionne     test();
43*504bc07dSLouis Dionne     return 0;
44beb6efb4SLouis Dionne }
45