diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-20 17:04:36 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-20 17:04:36 +0000 |
commit | 35e99fa40f1245cc554d8a26373e0486eb9c28f2 (patch) | |
tree | 029e2ca668376e98104cf9c34f5a9ed6652c515f | |
parent | c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0e (diff) |
More tests for reference binding in the presence of rvalue
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
-rw-r--r-- | test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp b/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp index 41741a98d8..f8a13b7c2a 100644 --- a/test/CXX/dcl.decl/dcl.init/dcl.init.ref/p5-0x.cpp +++ b/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&&>(); } |