p5-0x.cpp revision 35e99fa40f1245cc554d8a26373e0486eb9c28f2
1// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify -pedantic %s 2 3// Test the C++0x-specific reference initialization rules, e.g., the 4// rules for rvalue references. 5template<typename T> T prvalue(); 6template<typename T> T&& xvalue(); 7template<typename T> T& lvalue(); 8 9struct Base { }; 10struct Derived : Base { }; 11 12struct HasArray { 13 int array[5]; 14}; 15 16int f(int); 17 18template<typename T> 19struct ConvertsTo { 20 operator T(); 21}; 22 23void test_rvalue_refs() { 24 // If the initializer expression... 25 26 // - is an xvalue, class prvalue, array prvalue or function lvalue 27 // and "cv1 T1" is reference-compatible with "cv2 T2", or 28 29 // xvalue case 30 Base&& base0 = xvalue<Base>(); 31 Base&& base1 = xvalue<Derived>(); 32 int&& int0 = xvalue<int>(); 33 34 // class prvalue case 35 Base&& base2 = prvalue<Base>(); 36 Base&& base3 = prvalue<Derived>(); 37 38 // array prvalue case 39 int (&&array0)[5] = HasArray().array; 40 41 // function lvalue case 42 int (&&function0)(int) = f; 43 44 // - has a class type (i.e., T2 is a class type), where T1 is not 45 // reference-related to T2, and can be implicitly converted to 46 // an xvalue, class prvalue, or function lvalue of type "cv3 47 // T3", where "cv1 T1" is reference-compatible with "cv3 T3", 48 49 // xvalue 50 Base&& base4 = ConvertsTo<Base&&>(); 51 Base&& base5 = ConvertsTo<Derived&&>(); 52 int && int1 = ConvertsTo<int&&>(); 53 54 // class prvalue 55 Base&& base6 = ConvertsTo<Base>(); 56 Base&& base7 = ConvertsTo<Derived>(); 57 58 // FIXME: function lvalue 59 // int (&&function1)(int) = ConvertsTo<int(&)(int)>(); 60} 61 62class NonCopyable { 63 NonCopyable(const NonCopyable&); 64}; 65 66class NonCopyableDerived : public NonCopyable { 67 NonCopyableDerived(const NonCopyableDerived&); 68}; 69 70// Make sure we get direct bindings with no copies. 71void test_direct_binding() { 72 NonCopyable &&nc0 = prvalue<NonCopyable>(); 73 NonCopyable &&nc1 = prvalue<NonCopyableDerived>(); 74 NonCopyable &&nc2 = xvalue<NonCopyable>(); 75 NonCopyable &&nc3 = xvalue<NonCopyableDerived>(); 76 const NonCopyable &nc4 = prvalue<NonCopyable>(); 77 const NonCopyable &nc5 = prvalue<NonCopyableDerived>(); 78 const NonCopyable &nc6 = xvalue<NonCopyable>(); 79 const NonCopyable &nc7 = xvalue<NonCopyableDerived>(); 80 NonCopyable &&nc8 = ConvertsTo<NonCopyable&&>(); 81 NonCopyable &&nc9 = ConvertsTo<NonCopyableDerived&&>(); 82 const NonCopyable &nc10 = ConvertsTo<NonCopyable&&>(); 83 const NonCopyable &nc11 = ConvertsTo<NonCopyableDerived&&>(); 84} 85