p3-0x.cpp revision cafeb948e6067b8dc897c441da522367917b06f9
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct A {
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int &f(int*);
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float &f(int*) const noexcept;
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int *ptr;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(this->ptr));
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g2() const noexcept(noexcept(f((*this).ptr))) -> decltype(f(ptr));
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void testA(A &a) {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int &ir = a.g1();
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float &fr = a.g2();
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(!noexcept(a.g1()), "exception-specification failure");
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(noexcept(a.g2()), "exception-specification failure");
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)struct B {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char g();
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template<class T> auto f(T t) -> decltype(t + g())
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  { return t + g(); }
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template auto B::f(int t) -> decltype(t + g());
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename T>
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct C {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int &f(T*);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float &f(T*) const noexcept;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  T* ptr;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(ptr));
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g2() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(ptr));
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g3() noexcept(noexcept(f(this->ptr))) -> decltype(f((*this).ptr));
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g4() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(this->ptr));
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g5() noexcept(noexcept(this->f(ptr))) -> decltype(this->f(ptr));
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g6() const noexcept(noexcept(this->f(((this))->ptr))) -> decltype(this->f(ptr));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g7() noexcept(noexcept(this->f(this->ptr))) -> decltype(this->f((*this).ptr));
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto g8() const noexcept(noexcept(this->f(((this))->ptr))) -> decltype(this->f(this->ptr));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void test_C(C<int> ci) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int &ir = ci.g1();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float &fr = ci.g2();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int &ir2 = ci.g3();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float &fr2 = ci.g4();
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int &ir3 = ci.g5();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float &fr3 = ci.g6();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int &ir4 = ci.g7();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float &fr4 = ci.g8();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(!noexcept(ci.g1()), "exception-specification failure");
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(noexcept(ci.g2()), "exception-specification failure");
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(!noexcept(ci.g3()), "exception-specification failure");
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(noexcept(ci.g4()), "exception-specification failure");
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static_assert(!noexcept(ci.g5()), "exception-specification failure");
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(noexcept(ci.g6()), "exception-specification failure");
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(!noexcept(ci.g7()), "exception-specification failure");
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static_assert(noexcept(ci.g8()), "exception-specification failure");
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace PR14263 {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template<typename T> struct X {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void f();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    T f() const;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    auto g()       -> decltype(this->f()) { return f(); }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    auto g() const -> decltype(this->f()) { return f(); }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template struct X<int>;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace PR10036 {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template <class I>
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  iter_swap(I x, I y) noexcept;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template <class T>
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class A
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    T t_;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void swap(A& a) noexcept(noexcept(iter_swap(&t_, &a.t_)));
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void test() {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    A<int> i, j;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    i.swap(j);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace PR15290 {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template<typename T>
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class A {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    T v_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    friend int add_to_v(A &t) noexcept(noexcept(v_ + 42))
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return t.v_ + 42;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void f()
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    A<int> t;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    add_to_v(t);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace Static {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct X1 {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // FIXME: This should be accepted.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static auto f() -> decltype(m); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static auto g() -> decltype(this->m); // expected-error{{'this' cannot be used in a static member function declaration}}
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static int h();
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static int i() noexcept(noexcept(m + 2)); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  auto X1::h() -> decltype(m) { return 0; } // expected-error{{'this' cannot be implicitly used in a static member function declaration}}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template<typename T>
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct X2 {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    T f(T*);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static T f(int);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    auto g(T x) -> decltype(f(x)) { return 0; }
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void test_X2() {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    X2<int>().g(0);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace PR12564 {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Base {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void bar(Base&) {} // FIXME: expected-note {{here}}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Derived : Base {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // FIXME: This should be accepted.
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void foo(Derived& d) noexcept(noexcept(d.bar(d))) {} // expected-error {{cannot bind to a value of unrelated type}}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace rdar13473493 {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  template <typename F>
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class wrap
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public:
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    template <typename... Args>
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    auto operator()(Args&&... args) const -> decltype(wrapped(args...)) // expected-note{{candidate template ignored: substitution failure [with Args = <int>]: use of undeclared identifier 'wrapped'}}
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return wrapped(args...);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  private:
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    F wrapped;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void test(wrap<int (*)(int)> w) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    w(5); // expected-error{{no matching function for call to object of type 'wrap<int (*)(int)>'}}
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)