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)