1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
3 // The result of the expression const_cast<T>(v) is of type T. If T is
4 // an lvalue reference to object type, the result is an lvalue; if T
5 // is an rvalue reference to object type, the result is an xvalue;.
11 template<typename T
> T
& lvalue();
12 template<typename T
> T
&& xvalue();
13 template<typename T
> T
prvalue();
15 void test_classification(const int *ptr
, X x
) {
16 int *&&ptr0
= const_cast<int *&&>(ptr
);
17 int *&&ptr1
= const_cast<int *&&>(xvalue
<const int*>());
18 int *&&ptr2
= const_cast<int *&&>(prvalue
<const int*>()); // expected-error {{const_cast from rvalue to reference type 'int *&&'}}
19 X
&&ptr3
= const_cast<X
&&>(x
);
20 X
&&ptr4
= const_cast<X
&&>(xvalue
<X
>());
21 X
&&ptr5
= const_cast<X
&&>(prvalue
<X
>());
23 int *&ptr6
= const_cast<int *&>(ptr
);
24 int *&ptr7
= const_cast<int *&>(xvalue
<const int*>()); // expected-error {{const_cast from rvalue to reference type 'int *&'}}
25 int *&ptr8
= const_cast<int *&>(prvalue
<const int*>()); // expected-error {{const_cast from rvalue to reference type 'int *&'}}
26 X
&ptr9
= const_cast<X
&>(x
);
27 X
&ptrA
= const_cast<X
&>(xvalue
<X
>()); // expected-error {{const_cast from rvalue to reference type 'X &'}}
28 X
&ptrB
= const_cast<X
&>(prvalue
<X
>()); // expected-error {{const_cast from rvalue to reference type 'X &'}}
32 volatile unsigned ubf
: 4;
40 unsigned &t0
= const_cast<unsigned&>(a
.ubf
); // expected-error {{const_cast from bit-field lvalue to reference type}}
41 unsigned &t1
= const_cast<unsigned&>(a
.foo(), a
.ubf
); // expected-error {{const_cast from bit-field lvalue to reference type}}
42 unsigned &t2
= const_cast<unsigned&>(a
.pred() ? a
.ubf
: a
.ubf
); // expected-error {{const_cast from bit-field lvalue to reference type}}
43 unsigned &t3
= const_cast<unsigned&>(a
.pred() ? a
.ubf
: a
.uv
); // expected-error {{const_cast from bit-field lvalue to reference type}}
44 unsigned &t4
= const_cast<unsigned&>(a
.pred() ? a
.ubf
: a
.sv
); // expected-error {{const_cast from rvalue to reference type}}