diff options
Diffstat (limited to 'test/SemaCXX/decltype.cpp')
-rw-r--r-- | test/SemaCXX/decltype.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/test/SemaCXX/decltype.cpp b/test/SemaCXX/decltype.cpp index d6e85d285dd1..f1900b2b830f 100644 --- a/test/SemaCXX/decltype.cpp +++ b/test/SemaCXX/decltype.cpp @@ -16,6 +16,27 @@ void test_f2() { float &fr = f2(AC().a); } +template <class T> +struct Future { + explicit Future(T v); + + template <class F> + auto call(F&& fn) -> decltype(fn(T())) { + return fn(T()); + } + + template <class B, class F> + auto then(F&& fn) -> decltype(call(fn)) + { + return fn(T()); + } +}; + +void rdar16527205() { + Future<int> f1(42); + f1.call([](int){ return Future<float>(0); }); +} + namespace pr10154 { class A{ A(decltype(nullptr) param); @@ -45,6 +66,16 @@ namespace PR16529 { U &r = S<int>::f(); } +namespace PR18876 { + struct A { ~A() = delete; }; // expected-note +{{here}} + A f(); + decltype(f()) *a; // ok, function call + decltype(A()) *b; // expected-error {{attempt to use a deleted function}} + decltype(0, f()) *c; // ok, function call on RHS of comma + decltype(0, A()) *d; // expected-error {{attempt to use a deleted function}} + decltype(f(), 0) *e; // expected-error {{attempt to use a deleted function}} +} + template<typename> class conditional { }; |