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