p3-0x.cpp revision e79ce292d93f955c1219c3977c02199bd3dc6544
1cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
2cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
3cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregorstruct A {
4cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  int &f(int*);
5cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  float &f(int*) const noexcept;
6cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
7cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  int *ptr;
8cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(this->ptr));
9cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  auto g2() const noexcept(noexcept(f((*this).ptr))) -> decltype(f(ptr));
10cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor};
11cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
12cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregorvoid testA(A &a) {
13cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  int &ir = a.g1();
14cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  float &fr = a.g2();
15cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  static_assert(!noexcept(a.g1()), "exception-specification failure");
16cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  static_assert(noexcept(a.g2()), "exception-specification failure");
17cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor}
18cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
19cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregorstruct B {
20cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  char g();
21cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  template<class T> auto f(T t) -> decltype(t + g())
22cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  { return t + g(); }
23cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor};
24cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
25cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregortemplate auto B::f(int t) -> decltype(t + g());
26cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
27cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregortemplate<typename T>
28cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregorstruct C {
29cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  int &f(T*);
30cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  float &f(T*) const noexcept;
31cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
32cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  T* ptr;
33cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  auto g1() noexcept(noexcept(f(ptr))) -> decltype(f((*this).ptr));
34cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  auto g2() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(ptr));
35cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor};
36cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
37cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregorvoid test_C(C<int> ci) {
38cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  int *p = 0;
39cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  int &ir = ci.g1();
40cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  float &fr = ci.g2();
41cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  static_assert(!noexcept(ci.g1()), "exception-specification failure");
42cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  static_assert(noexcept(ci.g2()), "exception-specification failure");
43cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor}
44cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
45cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregornamespace PR10036 {
46cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  template <class I>
47cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  void
48cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  iter_swap(I x, I y) noexcept;
49cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
50cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  template <class T>
51cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  class A
52cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  {
53cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    T t_;
54cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  public:
55cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    void swap(A& a) noexcept(noexcept(iter_swap(&t_, &a.t_)));
56cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  };
57cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
58cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  void test() {
59cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    A<int> i, j;
60cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    i.swap(j);
61cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  }
62cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor}
63cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
64d92277928eefcf958080707ed6e154f406a5d054Richard Smithnamespace PR15290 {
65d92277928eefcf958080707ed6e154f406a5d054Richard Smith  template<typename T>
66d92277928eefcf958080707ed6e154f406a5d054Richard Smith  class A {
67d92277928eefcf958080707ed6e154f406a5d054Richard Smith    T v_;
68d92277928eefcf958080707ed6e154f406a5d054Richard Smith    friend int add_to_v(A &t) noexcept(noexcept(v_ + 42))
69d92277928eefcf958080707ed6e154f406a5d054Richard Smith    {
70d92277928eefcf958080707ed6e154f406a5d054Richard Smith      return t.v_ + 42;
71d92277928eefcf958080707ed6e154f406a5d054Richard Smith    }
72d92277928eefcf958080707ed6e154f406a5d054Richard Smith  };
73d92277928eefcf958080707ed6e154f406a5d054Richard Smith  void f()
74d92277928eefcf958080707ed6e154f406a5d054Richard Smith  {
75d92277928eefcf958080707ed6e154f406a5d054Richard Smith    A<int> t;
76d92277928eefcf958080707ed6e154f406a5d054Richard Smith    add_to_v(t);
77d92277928eefcf958080707ed6e154f406a5d054Richard Smith  }
78d92277928eefcf958080707ed6e154f406a5d054Richard Smith}
79d92277928eefcf958080707ed6e154f406a5d054Richard Smith
80cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregornamespace Static {
81cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  struct X1 {
82cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    int m;
83d92277928eefcf958080707ed6e154f406a5d054Richard Smith    // FIXME: This should be accepted.
84cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    static auto f() -> decltype(m); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
85cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    static auto g() -> decltype(this->m); // expected-error{{'this' cannot be used in a static member function declaration}}
86cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
87cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    static int h();
88cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
89cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    static int i() noexcept(noexcept(m + 2)); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
90cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  };
91cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
92cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  auto X1::h() -> decltype(m) { return 0; } // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
93cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
94cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  template<typename T>
95cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  struct X2 {
96cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    int m;
97cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
98cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    T f(T*);
99cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    static T f(int);
100cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
101cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    auto g(T x) -> decltype(f(x)) { return 0; }
102cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  };
103cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor
104cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  void test_X2() {
105cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor    X2<int>().g(0);
106cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor  }
107cefc3afac14d29de5aba7810cc8fe6c858949e9dDouglas Gregor}
10874e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor
10974e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregornamespace PR12564 {
11074e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor  struct Base {
1114a529d26d6ccfc9b3d11031f1256f4f87055c562Andy Gibbs    void bar(Base&) {} // FIXME: expected-note {{here}}
11274e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor  };
11374e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor
11474e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor  struct Derived : Base {
1156deb820a1d2f98e8eda7df1da057cecce8655289Richard Smith    // FIXME: This should be accepted.
1164a529d26d6ccfc9b3d11031f1256f4f87055c562Andy Gibbs    void foo(Derived& d) noexcept(noexcept(d.bar(d))) {} // expected-error {{cannot bind to a value of unrelated type}}
11774e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor  };
11874e2fc332e07c76d4e69ccbd0e9e47a0bafd3908Douglas Gregor}
119e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor
120e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregornamespace rdar13473493 {
121e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  template <typename F>
122e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  class wrap
123e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  {
124e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  public:
125e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor    template <typename... Args>
126e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor    auto operator()(Args&&... args) const -> decltype(wrapped(args...)) // expected-note{{candidate template ignored: substitution failure [with Args = <int>]: use of undeclared identifier 'wrapped'}}
127e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor    {
128e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor      return wrapped(args...);
129e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor    }
130e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor
131e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  private:
132e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor    F wrapped;
133e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  };
134e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor
135e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  void test(wrap<int (*)(int)> w) {
136e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor    w(5); // expected-error{{no matching function for call to object of type 'wrap<int (*)(int)>'}}
137e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor  }
138e79ce292d93f955c1219c3977c02199bd3dc6544Douglas Gregor}
139