summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-20 17:04:36 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-20 17:04:36 +0000
commit56d7eae8570f474a95d8feb54fe9307736c5f3f7 (patch)
tree60317591799af0d342e451ec6f77dd3e7aa18d4f
parent4d4b490fb7a375bdfa1cdf391ff084431ce9d813 (diff)
downloadbcm5719-llvm-56d7eae8570f474a95d8feb54fe9307736c5f3f7.tar.gz
bcm5719-llvm-56d7eae8570f474a95d8feb54fe9307736c5f3f7.zip
More tests for reference binding in the presence of rvalue
references. Note that we're currently failing reference binding to a function lvalue. llvm-svn: 123920
-rw-r--r--clang/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp
index 41741a98d8e..f8a13b7c2a7 100644
--- a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp
@@ -15,6 +15,11 @@ struct HasArray {
int f(int);
+template<typename T>
+struct ConvertsTo {
+ operator T();
+};
+
void test_rvalue_refs() {
// If the initializer expression...
@@ -35,6 +40,23 @@ void test_rvalue_refs() {
// function lvalue case
int (&&function0)(int) = f;
+
+ // - has a class type (i.e., T2 is a class type), where T1 is not
+ // reference-related to T2, and can be implicitly converted to
+ // an xvalue, class prvalue, or function lvalue of type "cv3
+ // T3", where "cv1 T1" is reference-compatible with "cv3 T3",
+
+ // xvalue
+ Base&& base4 = ConvertsTo<Base&&>();
+ Base&& base5 = ConvertsTo<Derived&&>();
+ int && int1 = ConvertsTo<int&&>();
+
+ // class prvalue
+ Base&& base6 = ConvertsTo<Base>();
+ Base&& base7 = ConvertsTo<Derived>();
+
+ // FIXME: function lvalue
+ // int (&&function1)(int) = ConvertsTo<int(&)(int)>();
}
class NonCopyable {
@@ -45,6 +67,7 @@ class NonCopyableDerived : public NonCopyable {
NonCopyableDerived(const NonCopyableDerived&);
};
+// Make sure we get direct bindings with no copies.
void test_direct_binding() {
NonCopyable &&nc0 = prvalue<NonCopyable>();
NonCopyable &&nc1 = prvalue<NonCopyableDerived>();
@@ -54,4 +77,8 @@ void test_direct_binding() {
const NonCopyable &nc5 = prvalue<NonCopyableDerived>();
const NonCopyable &nc6 = xvalue<NonCopyable>();
const NonCopyable &nc7 = xvalue<NonCopyableDerived>();
+ NonCopyable &&nc8 = ConvertsTo<NonCopyable&&>();
+ NonCopyable &&nc9 = ConvertsTo<NonCopyableDerived&&>();
+ const NonCopyable &nc10 = ConvertsTo<NonCopyable&&>();
+ const NonCopyable &nc11 = ConvertsTo<NonCopyableDerived&&>();
}
OpenPOWER on IntegriCloud