166 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify 2 3struct A {4 int &f(int*);5 float &f(int*) const noexcept;6 7 int *ptr;8 auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(this->ptr));9 auto g2() const noexcept(noexcept(f((*this).ptr))) -> decltype(f(ptr));10};11 12void testA(A &a) {13 int &ir = a.g1();14 float &fr = a.g2();15 static_assert(!noexcept(a.g1()), "exception-specification failure");16 static_assert(noexcept(a.g2()), "exception-specification failure");17}18 19struct B {20 char g();21 template<class T> auto f(T t) -> decltype(t + g())22 { return t + g(); }23};24 25template auto B::f(int t) -> decltype(t + g());26 27template<typename T>28struct C {29 int &f(T*);30 float &f(T*) const noexcept;31 32 T* ptr;33 auto g1() noexcept(noexcept(f(ptr))) -> decltype(f(ptr));34 auto g2() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(ptr));35 auto g3() noexcept(noexcept(f(this->ptr))) -> decltype(f((*this).ptr));36 auto g4() const noexcept(noexcept(f(((this))->ptr))) -> decltype(f(this->ptr));37 auto g5() noexcept(noexcept(this->f(ptr))) -> decltype(this->f(ptr));38 auto g6() const noexcept(noexcept(this->f(((this))->ptr))) -> decltype(this->f(ptr));39 auto g7() noexcept(noexcept(this->f(this->ptr))) -> decltype(this->f((*this).ptr));40 auto g8() const noexcept(noexcept(this->f(((this))->ptr))) -> decltype(this->f(this->ptr));41};42 43void test_C(C<int> ci) {44 int &ir = ci.g1();45 float &fr = ci.g2();46 int &ir2 = ci.g3();47 float &fr2 = ci.g4();48 int &ir3 = ci.g5();49 float &fr3 = ci.g6();50 int &ir4 = ci.g7();51 float &fr4 = ci.g8();52 static_assert(!noexcept(ci.g1()), "exception-specification failure");53 static_assert(noexcept(ci.g2()), "exception-specification failure");54 static_assert(!noexcept(ci.g3()), "exception-specification failure");55 static_assert(noexcept(ci.g4()), "exception-specification failure");56 static_assert(!noexcept(ci.g5()), "exception-specification failure");57 static_assert(noexcept(ci.g6()), "exception-specification failure");58 static_assert(!noexcept(ci.g7()), "exception-specification failure");59 static_assert(noexcept(ci.g8()), "exception-specification failure");60}61 62namespace PR14263 {63 template<typename T> struct X {64 void f();65 T f() const;66 67 auto g() -> decltype(this->f()) { return f(); }68 auto g() const -> decltype(this->f()) { return f(); }69 };70 template struct X<int>;71}72 73namespace PR10036 {74 template <class I>75 void76 iter_swap(I x, I y) noexcept;77 78 template <class T>79 class A80 {81 T t_;82 public:83 void swap(A& a) noexcept(noexcept(iter_swap(&t_, &a.t_)));84 };85 86 void test() {87 A<int> i, j;88 i.swap(j);89 }90}91 92namespace PR15290 {93 template<typename T>94 class A {95 T v_;96 friend int add_to_v(A &t) noexcept(noexcept(v_ + 42))97 {98 return t.v_ + 42;99 }100 };101 void f()102 {103 A<int> t;104 add_to_v(t);105 }106}107 108namespace Static {109 struct X1 {110 int m;111 // FIXME: This should be accepted.112 static auto f() -> decltype(m); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}113 static auto g() -> decltype(this->m); // expected-error{{'this' cannot be used in a static member function declaration}}114 115 static int h();116 117 static int i() noexcept(noexcept(m + 2)); // expected-error{{'this' cannot be implicitly used in a static member function declaration}}118 };119 120 auto X1::h() -> decltype(m) { return 0; } // expected-error{{'this' cannot be implicitly used in a static member function declaration}}121 122 template<typename T>123 struct X2 {124 int m;125 126 T f(T*);127 static T f(int);128 129 auto g(T x) -> decltype(f(x)) { return 0; }130 };131 132 void test_X2() {133 X2<int>().g(0);134 }135}136 137namespace PR12564 {138 struct Base {139 void bar(Base&) {}140 };141 142 struct Derived : Base {143 void foo(Derived& d) noexcept(noexcept(d.bar(d))) {}144 };145}146 147namespace rdar13473493 {148 template <typename F>149 class wrap150 {151 public:152 template <typename... Args>153 auto operator()(Args&&... args) const -> decltype(wrapped(args...)) // expected-note{{candidate template ignored: substitution failure [with Args = <int>]: member 'wrapped' used before its declaration}}154 {155 return wrapped(args...);156 }157 158 private:159 F wrapped;160 };161 162 void test(wrap<int (*)(int)> w) {163 w(5); // expected-error{{no matching function for call to object of type 'wrap<int (*)(int)>'}}164 }165}166