15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected-no-diagnostics 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace std_example { 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int f1(); 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int&& f2(); 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int &g(const int &); 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float &g(const int &&); 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int &j = g(i); 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float &k = g(f1()); 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float &l = g(f2()); 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int &g2(const int &); 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float &g2(int &&); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int &j2 = g2(i); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float &k2 = g2(f1()); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float &l2 = g2(f2()); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME: We don't support ref-qualifiers yet. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct A { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A& operator<<(int); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void p() &; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void p() &&; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A& operator<<(A&&, char); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A() << 1; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A() << 'c'; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A a; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a << 1; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a << 'c'; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A().p(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a.p(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct remove_reference { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef T type; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename T> 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct remove_reference<T&> { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef T type; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename T> 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct remove_reference<T&&> { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef T type; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace FunctionReferencesOverloading { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename T> int &f(typename remove_reference<T>::type&); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename T> float &f(typename remove_reference<T>::type&&); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void test_f(int (&func_ref)(int)) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int &ir = f<int (&)(int)>(func_ref); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)