1 // RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify 2 3 struct 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 12 void 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 19 struct B { 20 char g(); 21 template<class T> auto f(T t) -> decltype(t + g()) 22 { return t + g(); } 23 }; 24 25 template auto B::f(int t) -> decltype(t + g()); 26 27 template<typename T> 28 struct 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 43 void 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 62 namespace 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 73 namespace PR10036 { 74 template <class I> 75 void 76 iter_swap(I x, I y) noexcept; 77 78 template <class T> 79 class A 80 { 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 92 namespace 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 108 namespace 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 137 namespace 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 147 namespace rdar13473493 { 148 template <typename F> 149 class wrap 150 { 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>]: use of undeclared identifier 'wrapped'}} 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