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