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