1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 namespace std_example { 3 int i; 4 int f1(); 5 int&& f2(); 6 int &g(const int &); 7 float &g(const int &&); 8 int &j = g(i); 9 float &k = g(f1()); 10 float &l = g(f2()); 11 12 int &g2(const int &); 13 float &g2(int &&); 14 int &j2 = g2(i); 15 float &k2 = g2(f1()); 16 float &l2 = g2(f2()); 17 18 // FIXME: We don't support ref-qualifiers yet. 19 #if 0 20 struct A { 21 A& operator<<(int); 22 void p() &; 23 void p() &&; 24 }; 25 26 A& operator<<(A&&, char); 27 A() << 1; 28 A() << 'c'; 29 A a; 30 a << 1; 31 a << 'c'; 32 A().p(); 33 a.p(); 34 #endif 35 } 36 37 template<typename T> 38 struct remove_reference { 39 typedef T type; 40 }; 41 42 template<typename T> 43 struct remove_reference<T&> { 44 typedef T type; 45 }; 46 47 template<typename T> 48 struct remove_reference<T&&> { 49 typedef T type; 50 }; 51 52 namespace FunctionReferencesOverloading { 53 template<typename T> int &f(typename remove_reference<T>::type&); 54 template<typename T> float &f(typename remove_reference<T>::type&&); 55 56 void test_f(int (&func_ref)(int)) { 57 int &ir = f<int (&)(int)>(func_ref); 58 } 59 } 60