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