xref: /aosp_15_r20/external/clang/test/CXX/except/except.spec/p15.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -DUSE -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s
3*67e74705SXin Li 
4*67e74705SXin Li // Maybe force the implicit declaration of 'operator delete' and 'operator
5*67e74705SXin Li // delete[]'. This should make no difference to anything!
6*67e74705SXin Li #ifdef USE
f(int * p)7*67e74705SXin Li void f(int *p) {
8*67e74705SXin Li   delete p;
9*67e74705SXin Li   delete [] p;
10*67e74705SXin Li }
11*67e74705SXin Li #endif
12*67e74705SXin Li 
13*67e74705SXin Li // Deallocation functions are implicitly noexcept.
14*67e74705SXin Li // Thus, explicit specs aren't allowed to conflict.
15*67e74705SXin Li 
16*67e74705SXin Li void operator delete(void*); // expected-warning {{function previously declared with an explicit exception specification redeclared with an implicit exception specification}}
17*67e74705SXin Li void operator delete[](void*); // expected-warning {{function previously declared with an explicit exception specification redeclared with an implicit exception specification}}
18*67e74705SXin Li 
19*67e74705SXin Li static_assert(noexcept(operator delete(0)), "");
20*67e74705SXin Li static_assert(noexcept(operator delete[](0)), "");
21*67e74705SXin Li 
22*67e74705SXin Li // Same goes for explicit declarations.
23*67e74705SXin Li void operator delete(void*, float);
24*67e74705SXin Li void operator delete[](void*, float);
25*67e74705SXin Li 
26*67e74705SXin Li static_assert(noexcept(operator delete(0, 0.f)), "");
27*67e74705SXin Li static_assert(noexcept(operator delete[](0, 0.f)), "");
28*67e74705SXin Li 
29*67e74705SXin Li // But explicit specs stay.
30*67e74705SXin Li void operator delete(void*, double) throw(int); // expected-note {{previous}}
31*67e74705SXin Li static_assert(!noexcept(operator delete(0, 0.)), "");
32*67e74705SXin Li void operator delete(void*, double) noexcept; // expected-error {{does not match}}
33