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