// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s template T &lvalue(); template T &&xvalue(); template T prvalue(); struct X0 { int &f() &; float &f() &&; template int &ft(T) &; template float &ft(T) &&; typedef int &(*func_int_ref)(); typedef float &(*func_float_ref)(); operator func_int_ref() &; operator func_float_ref() &&; void g(); void c() const; // expected-note {{'c' declared here}} void v() volatile; // expected-note {{'v' declared here}} void r() __restrict__; // expected-note {{'r' declared here}} void cr() const __restrict__; // expected-note {{'cr' declared here}} void cv() const volatile; void vr() volatile __restrict__; // expected-note {{'vr' declared here}} void cvr() const volatile __restrict__; void lvalue() &; // expected-note 2 {{'lvalue' declared here}} void const_lvalue() const&; void rvalue() &&; // expected-note {{'rvalue' declared here}} int &operator+(const X0&) &; float &operator+(const X0&) &&; template int &operator+(const T&) &; template float &operator+(const T&) &&; int &h() const&; float &h() &&; int &h2() const&; float &h2() const&&; }; void X0::g() { // expected-note {{'g' declared here}} int &ir1 = f(); int &ir2 = X0::f(); } void test_ref_qualifier_binding() { int &ir1 = lvalue().f(); float &fr1 = xvalue().f(); float &fr2 = prvalue().f(); int &ir2 = lvalue().ft(1); float &fr3 = xvalue().ft(2); float &fr4 = prvalue().ft(3); } void test_ref_qualifier_binding_with_surrogates() { int &ir1 = lvalue()(); float &fr1 = xvalue()(); float &fr2 = prvalue()(); } void test_ref_qualifier_binding_operators() { int &ir1 = lvalue() + prvalue(); float &fr1 = xvalue() + prvalue(); float &fr2 = prvalue() + prvalue(); int &ir2 = lvalue() + 1; float &fr3 = xvalue() + 2; float &fr4 = prvalue() + 3; } void test_ref_qualifier_overloading() { int &ir1 = lvalue().h(); float &fr1 = xvalue().h(); float &fr2 = prvalue().h(); int &ir2 = lvalue().h2(); float &fr3 = xvalue().h2(); float &fr4 = prvalue().h2(); } void test_diagnostics(const volatile X0 &__restrict__ cvr) { cvr.g(); // expected-error {{'this' argument to member function 'g' has type 'const volatile X0', but function is not marked const or volatile}} cvr.c(); // expected-error {{not marked volatile}} cvr.v(); // expected-error {{not marked const}} cvr.r(); // expected-error {{not marked const or volatile}} cvr.cr(); // expected-error {{not marked volatile}} cvr.cv(); cvr.vr(); // expected-error {{not marked const}} cvr.cvr(); lvalue().lvalue(); lvalue().const_lvalue(); lvalue().rvalue(); // expected-error {{'this' argument to member function 'rvalue' is an lvalue, but function has rvalue ref-qualifier}} xvalue().lvalue(); // expected-error {{'this' argument to member function 'lvalue' is an rvalue, but function has non-const lvalue ref-qualifier}} xvalue().const_lvalue(); xvalue().rvalue(); prvalue().lvalue(); // expected-error {{'this' argument to member function 'lvalue' is an rvalue, but function has non-const lvalue ref-qualifier}} prvalue().const_lvalue(); prvalue().rvalue(); }