| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
| // expected-no-diagnostics |
| namespace std_example { |
| int i; |
| int f1(); |
| int&& f2(); |
| int &g(const int &); |
| float &g(const int &&); |
| int &j = g(i); |
| float &k = g(f1()); |
| float &l = g(f2()); |
| |
| int &g2(const int &); |
| float &g2(int &&); |
| int &j2 = g2(i); |
| float &k2 = g2(f1()); |
| float &l2 = g2(f2()); |
| |
| // FIXME: We don't support ref-qualifiers yet. |
| #if 0 |
| struct A { |
| A& operator<<(int); |
| void p() &; |
| void p() &&; |
| }; |
| |
| A& operator<<(A&&, char); |
| A() << 1; |
| A() << 'c'; |
| A a; |
| a << 1; |
| a << 'c'; |
| A().p(); |
| a.p(); |
| #endif |
| } |
| |
| template<typename T> |
| struct remove_reference { |
| typedef T type; |
| }; |
| |
| template<typename T> |
| struct remove_reference<T&> { |
| typedef T type; |
| }; |
| |
| template<typename T> |
| struct remove_reference<T&&> { |
| typedef T type; |
| }; |
| |
| namespace FunctionReferencesOverloading { |
| template<typename T> int &f(typename remove_reference<T>::type&); |
| template<typename T> float &f(typename remove_reference<T>::type&&); |
| |
| void test_f(int (&func_ref)(int)) { |
| int &ir = f<int (&)(int)>(func_ref); |
| } |
| } |