aboutsummaryrefslogtreecommitdiff
path: root/test/SemaCXX/decltype.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaCXX/decltype.cpp')
-rw-r--r--test/SemaCXX/decltype.cpp31
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 {
};