p3-0x.cpp revision 48a4ce7d484a448490edfe9e1d47b806cee85f30
1// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
2namespace std_example {
3  int i;
4  int f1();
5  int&& f2();
6  int &g(const int &);
7  float &g(const int &&);
8  int &j = g(i);
9  float &k = g(f1());
10  float &l = g(f2());
11
12  int &g2(const int &);
13  float &g2(int &&);
14  int &j2 = g2(i);
15  float &k2 = g2(f1());
16  float &l2 = g2(f2());
17
18  // FIXME: We don't support ref-qualifiers yet.
19#if 0
20  struct A {
21    A& operator<<(int);
22    void p() &;
23    void p() &&;
24  };
25
26  A& operator<<(A&&, char);
27  A() << 1;
28  A() << 'c';
29  A a;
30  a << 1;
31  a << 'c';
32  A().p();
33  a.p();
34#endif
35}
36
37template<typename T>
38struct remove_reference {
39  typedef T type;
40};
41
42template<typename T>
43struct remove_reference<T&> {
44  typedef T type;
45};
46
47template<typename T>
48struct remove_reference<T&&> {
49  typedef T type;
50};
51
52namespace FunctionReferencesOverloading {
53  template<typename T> int &f(typename remove_reference<T>::type&); // expected-note{{candidate function [with T = int (&)(int)]}}
54  template<typename T> float &f(typename remove_reference<T>::type&&); // expected-note{{candidate function [with T = int (&)(int)]}}
55
56  void test_f(int (&func_ref)(int)) {
57    f<int (&)(int)>(func_ref); // expected-error{{call to 'f' is ambiguous}}
58  }
59}
60