// 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(); 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() { 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(); }