p3-0x.cpp revision 74e2fc332e07c76d4e69ccbd0e9e47a0bafd3908
187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantzstruct A {
487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  int &f(int*);
587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  float &f(int*) const noexcept;
687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  int *ptr;
887ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(this->ptr));
987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  auto g2() const noexcept(noexcept(f((*this).ptr))) -> decltype(f(ptr));
1087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz};
1187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
1287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantzvoid testA(A &a) {
1387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  int &ir = a.g1();
1487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  float &fr = a.g2();
1587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  static_assert(!noexcept(a.g1()), "exception-specification failure");
1687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  static_assert(noexcept(a.g2()), "exception-specification failure");
1787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz}
1887ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
1987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantzstruct B {
2087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  char g();
2187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  template<class T> auto f(T t) -> decltype(t + g())
2287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  { return t + g(); }
2387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz};
2487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
2587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantztemplate auto B::f(int t) -> decltype(t + g());
2687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
2787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantztemplate<typename T>
2887ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantzstruct C {
2987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  int &f(T*);
3087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  float &f(T*) const noexcept;
3187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
3287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  T* ptr;
3387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  auto g1() noexcept(noexcept(f(ptr))) -> decltype(f((*this).ptr));
3487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  auto g2() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(ptr));
3587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz};
3687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
3787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantzvoid test_C(C<int> ci) {
3887ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  int *p = 0;
3987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  int &ir = ci.g1();
4087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  float &fr = ci.g2();
4187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  static_assert(!noexcept(ci.g1()), "exception-specification failure");
4287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  static_assert(noexcept(ci.g2()), "exception-specification failure");
4387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz}
4487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
4587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantznamespace PR10036 {
4687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  template <class I>
4787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  void
4887ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  iter_swap(I x, I y) noexcept;
4987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
5087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  template <class T>
5187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  class A
5287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  {
5387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    T t_;
5487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  public:
5587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    void swap(A& a) noexcept(noexcept(iter_swap(&t_, &a.t_)));
5687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  };
5787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
5866f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez  void test() {
5966f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez    A<int> i, j;
6087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    i.swap(j);
6187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  }
6287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz}
6366f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez
6487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantznamespace Static {
6587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  struct X1 {
6687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    int m;
6787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    static auto f() -> decltype(m); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
6887ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    static auto g() -> decltype(this->m); // expected-error{{'this' cannot be used in a static member function declaration}}
6987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
7087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    static int h();
7187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
7287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    static int i() noexcept(noexcept(m + 2)); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
7387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  };
7487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
7587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  auto X1::h() -> decltype(m) { return 0; } // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
7687ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
7787ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  template<typename T>
786dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie  struct X2 {
7987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    int m;
803e3d6864da093a99bad282e78945a1b1c4503ca4Jakob Bornecrantz
813e3d6864da093a99bad282e78945a1b1c4503ca4Jakob Bornecrantz    T f(T*);
8287ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    static T f(int);
8387ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz
8487ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    auto g(T x) -> decltype(f(x)) { return 0; }
8587ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  };
864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
8766f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez  void test_X2() {
8866f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez    X2<int>().g(0);
8966f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez  }
9066f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez}
9166f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez
9266f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jereznamespace PR12564 {
9366f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez  struct Base {
9466f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez    void bar(Base&) {}
9566f7fd99fa1d8c8e3b09fadd5624db9968b67506Francisco Jerez  };
96ed5ce78b8146a485f418a3ca06e545ab297f6f93Jakob Bornecrantz
97ed5ce78b8146a485f418a3ca06e545ab297f6f93Jakob Bornecrantz  struct Derived : Base {
9887ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz    void foo(Derived& d) noexcept(noexcept(d.bar(d))) {}
9987ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz  };
10087ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz}
10187ac117d6717cca0b4d1452a7519a1baa962ebc1Jakob Bornecrantz