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