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 | 56d7eae8570f474a95d8feb54fe9307736c5f3f7 (patch) | |
| tree | 60317591799af0d342e451ec6f77dd3e7aa18d4f | |
| parent | 4d4b490fb7a375bdfa1cdf391ff084431ce9d813 (diff) | |
| download | bcm5719-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.cpp | 27 |
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&&>(); } |

