1 #if __has_include(<coroutine>)
2 
3 #include <coroutine>
4 
5 namespace coro = std;
6 
7 #elif __has_include(<experimental/coroutine>)
8 
9 #include <experimental/coroutine>
10 
11 namespace coro = std::experimental;
12 
13 #else
14 
15 #warning "no installed coroutine headers found, using test-suite local one"
16 
17 /* Dummy version to allow tests without an installed header.  */
18 #  ifndef __TESTSUITE_CORO_H_n4835
19 #  define __TESTSUITE_CORO_H_n4835
20 
21 // Fragments (with short-cuts) to mimic enough of the library header to
22 // make some progress.
23 
24 #  if __cpp_impl_coroutine
25 
26 namespace std {
27 inline namespace __n4861 {
28 
29 // 21.11.1 coroutine traits
30 template<typename _R, typename...> struct coroutine_traits {
31   using promise_type = typename _R::promise_type;
32 };
33 
34 // 21.11.2  coroutine handle
35 template <typename Promise = void> struct coroutine_handle;
36 
37 template <>
38 struct coroutine_handle<void> {
39   public:
40       // 21.11.2.1 construct/reset
41   constexpr coroutine_handle () noexcept
42     : __fr_ptr (0) {}
43   constexpr coroutine_handle (decltype(nullptr) __h) noexcept
44     : __fr_ptr (__h) {}
45   coroutine_handle &operator= (decltype(nullptr)) noexcept {
46     __fr_ptr = nullptr;
47     return *this;
48   }
49 
50   public:
51     // 21.11.2.2 export/import
52     constexpr void *address () const noexcept { return __fr_ptr; }
53     constexpr static coroutine_handle from_address (void *__a) noexcept {
54       coroutine_handle __self;
55       __self.__fr_ptr = __a;
56       return __self;
57     }
58   public:
59       // 21.11.2.3 observers
60     constexpr explicit operator bool () const noexcept {
61       return bool (__fr_ptr);
62     }
63     bool done () const noexcept {
64       return __builtin_coro_done (__fr_ptr);
65     }
66       // 21.11.2.4 resumption
67     void operator () () const { resume (); }
68     void resume () const {
69       __builtin_coro_resume (__fr_ptr);
70     }
71     void destroy () const {
72       __builtin_coro_destroy (__fr_ptr);
73     }
74   protected:
75     void *__fr_ptr;
76 };
77 
78 template <class _Promise>
79 struct coroutine_handle : coroutine_handle<> {
80   // 21.11.2.1 construct/reset
81   using coroutine_handle<>::coroutine_handle;
82   static coroutine_handle from_promise(_Promise &p) {
83     coroutine_handle __self;
84     __self.__fr_ptr =
85       __builtin_coro_promise((char *)&p,  __alignof(_Promise), true);
86     return __self;
87   }
88   coroutine_handle& operator=(decltype(nullptr)) noexcept {
89     coroutine_handle<>::operator=(nullptr);
90     return *this;
91   }
92   // 21.11.2.2 export/import
93   constexpr static coroutine_handle from_address(void* __a){
94     coroutine_handle __self;
95     __self.__fr_ptr = __a;
96     return __self;
97   }
98   // 21.11.2.5 promise access
99   _Promise& promise() const {
100     void * __t = __builtin_coro_promise(this->__fr_ptr,
101 					__alignof(_Promise), false);
102     return *static_cast<_Promise*>(__t);
103   }
104 };
105 
106 // n4760 - 21.11.5 trivial awaitables
107 
108 struct suspend_always {
109   bool await_ready() { return false; }
110   void await_suspend(coroutine_handle<>) {}
111   void await_resume() {}
112 };
113 
114 struct suspend_never {
115   bool await_ready() { return true; }
116   void await_suspend(coroutine_handle<>) {}
117   void await_resume() {}
118 };
119 
120 } // namespace __n4861
121 } // namespace std
122 
123 namespace coro = std;
124 
125 #  else
126 #    error "coro.h requires support for coroutines, add -fcoroutines"
127 #  endif
128 #  endif // __TESTSUITE_CORO_H_n4835
129 
130 #endif // __has_include(<experimental/coroutine>)
131 
132 /* just to avoid cluttering dump files. */
133 extern "C" int puts (const char *);
134 extern "C" int printf (const char *, ...);
135 
136 #include <cstdlib> /* for abort () */
137 
138 #include <utility> /* for std::forward */
139 
140 #ifndef OUTPUT
141 #  define PRINT(X)
142 #  define PRINTF (void)
143 #else
144 #  define PRINT(X) puts(X)
145 #  define PRINTF printf
146 #endif
147