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()65 S3::f1() noexcept(noexcept(fn()))
66 {
67 }
68 
69 void
f2()70 S3::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