p3-0x.cpp revision b7cd135215501a154eb4f68159f3af020783099e
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace std_example { 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant int i; 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int f1(); 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant int&& f2(); 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant int &g(const int &); 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant float &g(const int &&); 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int &j = g(i); 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant float &k = g(f1()); 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant float &l = g(f2()); 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int &g2(const int &); 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant float &g2(int &&); 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int &j2 = g2(i); 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant float &k2 = g2(f1()); 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant float &l2 = g2(f2()); 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant // FIXME: We don't support ref-qualifiers yet. 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#if 0 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant struct A { 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A& operator<<(int); 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void p() &; 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void p() &&; 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant }; 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A& operator<<(A&&, char); 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A() << 1; 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A() << 'c'; 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A a; 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant a << 1; 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant a << 'c'; 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A().p(); 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant a.p(); 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<typename T> 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct remove_reference { 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef T type; 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<typename T> 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct remove_reference<T&> { 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef T type; 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<typename T> 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct remove_reference<T&&> { 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef T type; 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 51 52namespace 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