1 // PR c++/86476 - noexcept-specifier is a complete-class context 2 // { dg-do compile { target c++11 } } 3 4 #define SA(X) static_assert(X, #X) 5 6 struct S { f1S7 void f1() noexcept(noexcept(i)) { } f2S8 void f2() noexcept(noexcept(fn())) { } f3S9 void f3() noexcept(noexcept(fnx())) { } 10 void f4() noexcept(noexcept(i)); 11 void f5() noexcept(noexcept(fn())); 12 void f6() noexcept(noexcept(fnx())); 13 14 void f7() noexcept(1); 15 void f8() noexcept(0); 16 void f9() noexcept(b); 17 void f10() noexcept(!b); 18 19 int i; 20 static constexpr auto b = true; 21 void fny() noexcept(noexcept(fn())); 22 void fn(); 23 void fnx() noexcept; 24 }; 25 26 S s; 27 SA(noexcept(s.f1())); 28 SA(!noexcept(s.f2())); 29 SA(noexcept(s.f3())); 30 SA(noexcept(s.f4())); 31 SA(!noexcept(s.f5())); 32 SA(noexcept(s.f6())); 33 SA(noexcept(s.f7())); 34 SA(!noexcept(s.f8())); 35 SA(noexcept(s.f9())); 36 SA(!noexcept(s.f10())); 37 38 struct S2 { 39 struct V { 40 void f1() noexcept(noexcept(fn())); 41 void f2() noexcept(noexcept(fnx())); f3S2::V42 void f3() noexcept(noexcept(fn())) { } f4S2::V43 void f4() noexcept(noexcept(fnx())) { } 44 void fn(); 45 void fnx() noexcept; 46 } v; 47 void fn(); 48 void fnx(); 49 }; 50 51 S2 s2; 52 SA(!noexcept(s2.v.f1())); 53 SA(noexcept(s2.v.f2())); 54 SA(!noexcept(s2.v.f3())); 55 SA(noexcept(s2.v.f4())); 56 57 struct S3 { 58 void f1() noexcept(noexcept(fn())); 59 void f2() noexcept(noexcept(fnx())); 60 void fn(); 61 void fnx() noexcept; 62 }; 63 64 void f1()65S3::f1() noexcept(noexcept(fn())) 66 { 67 } 68 69 void f2()70S3::f2() noexcept(noexcept(fnx())) 71 { 72 } 73 74 struct S4 { f1S475 int f1 (int p) noexcept(noexcept(p)) { return p; } 76 int f2 (int p) noexcept(noexcept(p)); 77 int f3 (int p = 10) noexcept(noexcept(p)); 78 int f4 () noexcept(noexcept(S4{})); 79 }; 80 81 S4 s4; 82 SA(noexcept(s4.f1(1))); 83 SA(noexcept(s4.f2(1))); 84 SA(noexcept(s4.f3())); 85 SA(noexcept(s4.f4())); 86 87 template<typename T> 88 struct S5 { f1S589 void f1() noexcept(noexcept(i)) { } f2S590 void f2() noexcept(noexcept(fn())) { } f3S591 void f3() noexcept(noexcept(fnx())) { } 92 void f4() noexcept(noexcept(i)); 93 void f5() noexcept(noexcept(fn())); 94 void f6() noexcept(noexcept(fnx())); 95 96 int i; 97 void fny() noexcept(noexcept(fn())); 98 void fn(); 99 void fnx() noexcept; 100 }; 101 102 S5<int> s5; 103 SA(noexcept(s5.f1())); 104 SA(!noexcept(s5.f2())); 105 SA(noexcept(s5.f3())); 106 SA(noexcept(s5.f4())); 107 SA(!noexcept(s5.f5())); 108 SA(noexcept(s5.f6())); 109 110 template<typename T> 111 struct S6 { 112 void f1() noexcept(noexcept(x)); 113 T x; 114 }; 115 116 struct S7 { 117 template<typename U> f1S7118 void f1 () noexcept(noexcept(U(1))) { } 119 120 template<int N> 121 void f2() noexcept(noexcept(N)); 122 123 template <typename _Up> 124 void f3(_Up __p) noexcept(noexcept(__p)); 125 }; 126 127 void glob(); 128 void globx() noexcept; 129 struct S8 { 130 void f1 () noexcept(noexcept(glob())); 131 void f2 () noexcept(noexcept(globx())); 132 }; 133 134 S8 s8; 135 SA(!noexcept(s8.f1())); 136 SA(noexcept(s8.f2())); 137 138 struct W { 139 constexpr operator bool(); 140 }; 141 142 template<typename T> 143 struct S9 { noexceptS9144 S9() noexcept(noexcept(w)) { } 145 S9 &operator=(S9 &&) noexcept(T::X); 146 W w; 147 }; 148