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)