]> granicus.if.org Git - clang/commitdiff
More tests for reference binding in the presence of rvalue
authorDouglas Gregor <dgregor@apple.com>
Thu, 20 Jan 2011 17:04:36 +0000 (17:04 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 20 Jan 2011 17:04:36 +0000 (17:04 +0000)
references. Note that we're currently failing reference binding to a
function lvalue.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123920 91177308-0d34-0410-b5e6-96231b3b80d8

test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp

index 41741a98d8e7afdc6f7fcdc33756acfbe9d4a9ff..f8a13b7c2a7348f9a90c97b3b5687087ca1d0354 100644 (file)
@@ -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&&>();
 }