@@ -16,26 +16,26 @@ auto main() -> int;
16
16
17
17
#line 80 "pure2-function-type-id.cpp2"
18
18
// As non-local function parameter.
19
- auto g (cpp2::in<cpp2::fn_t <auto () -> void >> f) -> void;
20
- auto g (cpp2::fn_t <auto () -> void >* f) -> void;
21
- auto g (cpp2::fn_t <auto () -> cpp2::fn_t<auto () -> void>* >* f) -> void;
19
+ auto g (cpp2::in<cpp2::fn_t <void () >> f) -> void;
20
+ auto g (cpp2::fn_t <void () >* f) -> void;
21
+ auto g (cpp2::fn_t <cpp2::fn_t <void ()>*() >* f) -> void;
22
22
// As template parameter.
23
- template <cpp2::fn_t <auto () -> void >* V> auto g () -> void;
24
- template <cpp2::fn_t <auto () -> cpp2::fn_t <auto () -> void >* >* V> auto g () -> void;
23
+ template <cpp2::fn_t <void () >* V> auto g () -> void;
24
+ template <cpp2::fn_t <cpp2::fn_t <void ()>*() >* V> auto g () -> void;
25
25
26
26
// In non-local function return type.
27
- [[nodiscard]] auto g1 () -> cpp2::fn_t<auto () -> void >*;
28
- template <bool V> [[nodiscard]] auto g1 () -> cpp2::fn_t<auto () -> void >*;
29
- [[nodiscard]] auto g2 () -> cpp2::fn_t<auto () -> cpp2::fn_t<auto () -> void>* >*;
27
+ [[nodiscard]] auto g1 () -> cpp2::fn_t<void() >*;
28
+ template <bool V> [[nodiscard]] auto g1 () -> cpp2::fn_t<void() >*;
29
+ [[nodiscard]] auto g2 () -> cpp2::fn_t<cpp2::fn_t<void()>*() >*;
30
30
31
31
// clang-format off
32
32
// Test case from #343.
33
- [[nodiscard]] auto f2 () -> std::function<cpp2::fn_t<auto (cpp2::in<std::string>) -> std::string >>;
33
+ [[nodiscard]] auto f2 () -> std::function<cpp2::fn_t<std::string (cpp2::in<std::string>)>>;
34
34
35
35
36
36
#line 99 "pure2-function-type-id.cpp2"
37
37
// Adapted from <https://github.com/hsutter/cppfront/wiki/Design-note%3A-Postfix-operators>.
38
- [[nodiscard]] auto f (cpp2::in<cpp2::i32> x) -> cpp2::fn_t<auto (cpp2::in<cpp2::i32>) -> std::string >*;
38
+ [[nodiscard]] auto f (cpp2::in<cpp2::i32> x) -> cpp2::fn_t<std::string (cpp2::in<cpp2::i32>)>*;
39
39
auto postfix_operators () -> void;
40
40
41
41
@@ -46,19 +46,19 @@ auto main() -> int{
46
46
postfix_operators ();
47
47
48
48
// Variables with type of a mix of `*`/`const` to `() throws -> void`.
49
- cpp2::fn_t <auto () -> void >* f0 {[]() -> void {}};
50
- cpp2::fn_t <auto () -> void >* const f1 {f0};
51
- cpp2::fn_t <auto () -> void > const * f2 {f0};
52
- cpp2::fn_t <auto () -> void > const * const f3 {f0};
49
+ cpp2::fn_t <void () >* f0 {[]() -> void {}};
50
+ cpp2::fn_t <void () >* const f1 {f0};
51
+ cpp2::fn_t <void () > const * f2 {f0};
52
+ cpp2::fn_t <void () > const * const f3 {f0};
53
53
54
54
// Uninitialized.
55
- cpp2::deferred_init<cpp2::fn_t <auto () -> void >*> f4;
55
+ cpp2::deferred_init<cpp2::fn_t <void () >*> f4;
56
56
f4.construct (f0);
57
57
58
- cpp2::fn_t <auto () -> void >** f10 {&f0};
59
- cpp2::fn_t <auto () -> void >** const f11 {f10};
60
- cpp2::fn_t <auto () -> void >* const * f12 {f10};
61
- cpp2::fn_t <auto () -> void >* const * const f13 {f10};
58
+ cpp2::fn_t <void () >** f10 {&f0};
59
+ cpp2::fn_t <void () >** const f11 {f10};
60
+ cpp2::fn_t <void () >* const * f12 {f10};
61
+ cpp2::fn_t <void () >* const * const f13 {f10};
62
62
63
63
cpp2::i32 i {0 };
64
64
cpp2::i32* i0 {&i};
@@ -81,86 +81,86 @@ auto main() -> int{
81
81
(void ) std::move (i3);
82
82
83
83
// Variables with various kinds of parameter.
84
- cpp2::fn_t <auto (cpp2::in<cpp2::i32>) -> void >* f5 {[](cpp2::in<cpp2::i32> x) -> void {}};
85
- cpp2::fn_t <auto (cpp2::in<std::any>) -> void >* f6 {[](cpp2::in<std::any> x) -> void {}};
86
- cpp2::fn_t <auto (cpp2::i32&&) -> void >* f7 {[](cpp2::i32&& x) -> void {}};
87
- cpp2::fn_t <auto (cpp2::out<cpp2::i32>) -> void >* f8 {[](auto x) -> void {}};
84
+ cpp2::fn_t <void (cpp2::in<cpp2::i32>)>* f5 {[](cpp2::in<cpp2::i32> x) -> void {}};
85
+ cpp2::fn_t <void (cpp2::in<std::any>)>* f6 {[](cpp2::in<std::any> x) -> void {}};
86
+ cpp2::fn_t <void (cpp2::i32&&)>* f7 {[](cpp2::i32&& x) -> void {}};
87
+ cpp2::fn_t <void (cpp2::out<cpp2::i32>)>* f8 {[](auto x) -> void {}};
88
88
89
89
// In alternative.
90
90
cpp2::Default.expects ([&] () -> bool { auto && __expr = f0;
91
- if (cpp2::is<cpp2::fn_t <auto () noexcept -> void >>(__expr)) { if constexpr ( requires{std::terminate (), false ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((std::terminate (), false )),bool > ) return std::terminate (), false ; else return bool {}; else return bool {}; }
92
- else if (cpp2::is<cpp2::fn_t <auto () -> void >>(__expr)) { if constexpr ( requires{std::terminate (), false ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((std::terminate (), false )),bool > ) return std::terminate (), false ; else return bool {}; else return bool {}; }
93
- else if (cpp2::is<cpp2::fn_t <auto () -> void >*>(__expr)) { if constexpr ( requires{true ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((true )),bool > ) return true ; else return bool {}; else return bool {}; }
91
+ if (cpp2::is<cpp2::fn_t <void () noexcept >>(__expr)) { if constexpr ( requires{std::terminate (), false ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((std::terminate (), false )),bool > ) return std::terminate (), false ; else return bool {}; else return bool {}; }
92
+ else if (cpp2::is<cpp2::fn_t <void () >>(__expr)) { if constexpr ( requires{std::terminate (), false ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((std::terminate (), false )),bool > ) return std::terminate (), false ; else return bool {}; else return bool {}; }
93
+ else if (cpp2::is<cpp2::fn_t <void () >*>(__expr)) { if constexpr ( requires{true ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((true )),bool > ) return true ; else return bool {}; else return bool {}; }
94
94
else return false ; }
95
95
(), " " );
96
96
cpp2::Default.expects ([&] () -> bool { auto && __expr = *cpp2::assert_not_null (f0);
97
- if (cpp2::is<cpp2::fn_t <auto () -> void >>(__expr)) { if constexpr ( requires{true ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((true )),bool > ) return true ; else return bool {}; else return bool {}; }
97
+ if (cpp2::is<cpp2::fn_t <void () >>(__expr)) { if constexpr ( requires{true ;} ) if constexpr ( std::is_convertible_v<CPP2_TYPEOF ((true )),bool > ) return true ; else return bool {}; else return bool {}; }
98
98
else return false ; }
99
99
(), " " );
100
100
{
101
- cpp2::fn_t <auto () -> void >* f = f0;
101
+ cpp2::fn_t <void () >* f = f0;
102
102
103
103
// As block variable.
104
104
#line 58 "pure2-function-type-id.cpp2"
105
105
{}
106
106
}
107
107
{
108
- cpp2::in<cpp2::fn_t <auto () -> void >> f = *cpp2::assert_not_null (f0);
108
+ cpp2::in<cpp2::fn_t <void () >> f = *cpp2::assert_not_null (f0);
109
109
#line 59 "pure2-function-type-id.cpp2"
110
110
{ }
111
111
}
112
112
113
113
// As local function parameter.
114
114
#line 62 "pure2-function-type-id.cpp2"
115
- (void ) [](cpp2::in<cpp2::fn_t <auto () -> void >> f) -> void {};
116
- (void ) [](cpp2::fn_t <auto () -> void >* f) -> void {};
117
- (void ) [](cpp2::fn_t <auto () -> cpp2::fn_t <auto () -> void >* >* f) -> void {};
118
- (void ) [](cpp2::fn_t <auto () -> cpp2::fn_t <auto () -> cpp2::fn_t <auto () -> void >*>* >* f) -> void {};
115
+ (void ) [](cpp2::in<cpp2::fn_t <void () >> f) -> void {};
116
+ (void ) [](cpp2::fn_t <void () >* f) -> void {};
117
+ (void ) [](cpp2::fn_t <cpp2::fn_t <void ()>*() >* f) -> void {};
118
+ (void ) [](cpp2::fn_t <cpp2::fn_t <cpp2::fn_t <void ()>*()>*() >* f) -> void {};
119
119
120
120
// In local function return type.
121
- (void ) [_0 = f0]() -> cpp2::fn_t <auto () -> void >& { return *cpp2::assert_not_null (_0); };
122
- (void ) []() -> cpp2::fn_t <auto () -> void >* { return nullptr ; };
123
- (void ) []() -> cpp2::fn_t <auto () -> cpp2::fn_t <auto () -> void >* >* { return nullptr ; };
121
+ (void ) [_0 = f0]() -> cpp2::fn_t <void () >& { return *cpp2::assert_not_null (_0); };
122
+ (void ) []() -> cpp2::fn_t <void () >* { return nullptr ; };
123
+ (void ) []() -> cpp2::fn_t <cpp2::fn_t <void ()>*() >* { return nullptr ; };
124
124
125
125
// Without `throws`.
126
- (void ) std::type_identity_t <cpp2::fn_t <auto (std::string_view, CPP2_MESSAGE_PARAM) noexcept -> void >*>{cpp2::report_and_terminate};
126
+ (void ) std::type_identity_t <cpp2::fn_t <void (std::string_view, CPP2_MESSAGE_PARAM) noexcept >*>{cpp2::report_and_terminate};
127
127
128
128
// As template argument.
129
- (void ) std::type_identity_t <cpp2::fn_t <auto () -> void >*>{std::move (f0)};
130
- static_assert (std::is_function_v<cpp2::fn_t <auto () -> void >>);
129
+ (void ) std::type_identity_t <cpp2::fn_t <void () >*>{std::move (f0)};
130
+ static_assert (std::is_function_v<cpp2::fn_t <void () >>);
131
131
}
132
132
133
133
#line 81 "pure2-function-type-id.cpp2"
134
- auto g (cpp2::in<cpp2::fn_t <auto () -> void >> f) -> void{}
135
- auto g (cpp2::fn_t <auto () -> void >* f) -> void{}
136
- auto g (cpp2::fn_t <auto () -> cpp2::fn_t<auto () -> void>* >* f) -> void{}
134
+ auto g (cpp2::in<cpp2::fn_t <void () >> f) -> void{}
135
+ auto g (cpp2::fn_t <void () >* f) -> void{}
136
+ auto g (cpp2::fn_t <cpp2::fn_t <void ()>*() >* f) -> void{}
137
137
138
- template <cpp2::fn_t <auto () -> void >* V> auto g () -> void{}
139
- template <cpp2::fn_t <auto () -> cpp2::fn_t <auto () -> void >* >* V> auto g () -> void{}
138
+ template <cpp2::fn_t <void () >* V> auto g () -> void{}
139
+ template <cpp2::fn_t <cpp2::fn_t <void ()>*() >* V> auto g () -> void{}
140
140
141
141
#line 89 "pure2-function-type-id.cpp2"
142
- [[nodiscard]] auto g1 () -> cpp2::fn_t<auto () -> void >* { return nullptr ; }
143
- template <bool V> [[nodiscard]] auto g1 () -> cpp2::fn_t<auto () -> void >*
142
+ [[nodiscard]] auto g1 () -> cpp2::fn_t<void() >* { return nullptr ; }
143
+ template <bool V> [[nodiscard]] auto g1 () -> cpp2::fn_t<void() >*
144
144
requires (V)
145
145
#line 90 "pure2-function-type-id.cpp2"
146
146
{return nullptr ; }
147
- [[nodiscard]] auto g2 () -> cpp2::fn_t<auto () -> cpp2::fn_t<auto () -> void>* >* { return nullptr ; }
147
+ [[nodiscard]] auto g2 () -> cpp2::fn_t<cpp2::fn_t<void()>*() >* { return nullptr ; }
148
148
149
149
#line 95 "pure2-function-type-id.cpp2"
150
- [[nodiscard]] auto f2 () -> std::function<cpp2::fn_t<auto (cpp2::in<std::string>) -> std::string >>{
150
+ [[nodiscard]] auto f2 () -> std::function<cpp2::fn_t<std::string (cpp2::in<std::string>)>>{
151
151
return [](cpp2::in<std::string> s) -> std::string{return s + " World!" ; };
152
152
}
153
153
154
154
#line 100 "pure2-function-type-id.cpp2"
155
- [[nodiscard]] auto f (cpp2::in<cpp2::i32> x) -> cpp2::fn_t<auto (cpp2::in<cpp2::i32>) -> std::string >* { return +[](cpp2::in<cpp2::i32> x) -> std::string { return " " ; }; }
155
+ [[nodiscard]] auto f (cpp2::in<cpp2::i32> x) -> cpp2::fn_t<std::string (cpp2::in<cpp2::i32>)>* { return +[](cpp2::in<cpp2::i32> x) -> std::string { return " " ; }; }
156
156
auto postfix_operators () -> void{
157
- cpp2::Default.expects (cpp2::is<cpp2::fn_t <auto (cpp2::in<cpp2::i32>) -> cpp2:: fn_t < auto (cpp2::in<cpp2::i32>) -> std::string>* >>(f), " " );
157
+ cpp2::Default.expects (cpp2::is<cpp2::fn_t <cpp2:: fn_t < std::string (cpp2::in<cpp2::i32>)>* (cpp2::in<cpp2::i32>)>>(f), " " );
158
158
// / | |
159
159
// / | |
160
- cpp2::Default.expects (cpp2::is<cpp2::fn_t <auto (cpp2::in<cpp2::i32>) -> std::string >*>(f (42 )), " " );
160
+ cpp2::Default.expects (cpp2::is<cpp2::fn_t <std::string (cpp2::in<cpp2::i32>)>*>(f (42 )), " " );
161
161
// ________________/ |
162
162
// / |
163
- cpp2::Default.expects (cpp2::is<cpp2::fn_t <auto (cpp2::in<cpp2::i32>) -> std::string >>(*cpp2::assert_not_null (f (42 ))), " " );
163
+ cpp2::Default.expects (cpp2::is<cpp2::fn_t <std::string (cpp2::in<cpp2::i32>)>>(*cpp2::assert_not_null (f (42 ))), " " );
164
164
// _______________/
165
165
// /
166
166
cpp2::Default.expects (cpp2::is<std::string>((*cpp2::assert_not_null (f (42 )))(1 )), " " );
0 commit comments