1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 // expected-no-diagnostics 3 4 template<typename T> T &lvalue(); 5 template<typename T> T &&xvalue(); 6 template<typename T> T prvalue(); 7 8 struct X0 { 9 int &f() &; 10 float &f() &&; 11 12 template<typename T> int &ft(T) &; 13 template<typename T> float &ft(T) &&; 14 15 typedef int &(*func_int_ref)(); 16 typedef float &(*func_float_ref)(); 17 18 operator func_int_ref() &; 19 operator func_float_ref() &&; 20 21 void g(); 22 23 int &operator+(const X0&) &; 24 float &operator+(const X0&) &&; 25 26 template<typename T> int &operator+(const T&) &; 27 template<typename T> float &operator+(const T&) &&; 28 29 int &h() const&; 30 float &h() &&; 31 int &h2() const&; 32 float &h2() const&&; 33 }; 34 35 void X0::g() { 36 int &ir1 = f(); 37 int &ir2 = X0::f(); 38 } 39 40 void test_ref_qualifier_binding() { 41 int &ir1 = lvalue<X0>().f(); 42 float &fr1 = xvalue<X0>().f(); 43 float &fr2 = prvalue<X0>().f(); 44 int &ir2 = lvalue<X0>().ft(1); 45 float &fr3 = xvalue<X0>().ft(2); 46 float &fr4 = prvalue<X0>().ft(3); 47 } 48 49 void test_ref_qualifier_binding_with_surrogates() { 50 int &ir1 = lvalue<X0>()(); 51 float &fr1 = xvalue<X0>()(); 52 float &fr2 = prvalue<X0>()(); 53 } 54 55 void test_ref_qualifier_binding_operators() { 56 int &ir1 = lvalue<X0>() + prvalue<X0>(); 57 float &fr1 = xvalue<X0>() + prvalue<X0>(); 58 float &fr2 = prvalue<X0>() + prvalue<X0>(); 59 int &ir2 = lvalue<X0>() + 1; 60 float &fr3 = xvalue<X0>() + 2; 61 float &fr4 = prvalue<X0>() + 3; 62 } 63 64 void test_ref_qualifier_overloading() { 65 int &ir1 = lvalue<X0>().h(); 66 float &fr1 = xvalue<X0>().h(); 67 float &fr2 = prvalue<X0>().h(); 68 int &ir2 = lvalue<X0>().h2(); 69 float &fr3 = xvalue<X0>().h2(); 70 float &fr4 = prvalue<X0>().h2(); 71 } 72