1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
5 // A glvalue of type "cv1 T1" can be cast to type "rvalue reference to
6 // cv2 T2" if "cv2 T2" is reference-compatible with "cv1 T1" (8.5.3).
8 // Otherwise, an expression e can be explicitly converted to a type T using a
9 // static_cast of the form static_cast<T>(e) if the declaration T t(e); is
10 // well-formed, for some invented temporary variable t (8.5). [...]
14 struct C
{ explicit operator A
&&(); };
15 struct D
{ operator B(); };
17 template<typename T
> T
& lvalue();
18 template<typename T
> T
&& xvalue();
19 template <typename T
> T
prvalue();
21 void test(A
&a
, B
&b
) {
22 A
&&ar0
= static_cast<A
&&>(prvalue
<A
>());
23 A
&&ar1
= static_cast<A
&&>(prvalue
<B
>());
24 A
&&ar2
= static_cast<A
&&>(lvalue
<C
>());
25 A
&&ar3
= static_cast<A
&&>(xvalue
<C
>());
26 A
&&ar4
= static_cast<A
&&>(prvalue
<C
>());
27 A
&&ar5
= static_cast<A
&&>(lvalue
<D
>());
28 A
&&ar6
= static_cast<A
&&>(xvalue
<D
>());
29 A
&&ar7
= static_cast<A
&&>(prvalue
<D
>());
31 A
&&ar8
= static_cast<A
&&>(prvalue
<const A
>()); // expected-error {{binding reference of type 'A' to value of type 'const A' drops 'const' qualifier}}
32 A
&&ar9
= static_cast<A
&&>(lvalue
<const A
>()); // expected-error {{cannot cast from lvalue of type 'const A'}}
33 A
&&ar10
= static_cast<A
&&>(xvalue
<const A
>()); // expected-error {{cannot cast from rvalue of type 'const A'}}
35 const A
&&ar11
= static_cast<const A
&&>(prvalue
<A
>());
36 const A
&&ar12
= static_cast<const A
&&>(prvalue
<B
>());
37 const A
&&ar13
= static_cast<const A
&&>(lvalue
<C
>());
38 const A
&&ar14
= static_cast<const A
&&>(xvalue
<C
>());
39 const A
&&ar15
= static_cast<const A
&&>(prvalue
<C
>());
40 const A
&&ar16
= static_cast<const A
&&>(lvalue
<D
>());
42 const A
&&ar17
= static_cast<const A
&&>(prvalue
<A
const volatile>()); // expected-error {{binding reference of type 'const A' to value of type 'const volatile A' drops 'volatile' qualifier}}