xref: /aosp_15_r20/external/clang/test/Analysis/new-with-exceptions.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store region -std=c++11 -fexceptions -fcxx-exceptions -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store region -std=c++11 -verify %s
3*67e74705SXin Li 
4*67e74705SXin Li void clang_analyzer_eval(bool);
5*67e74705SXin Li 
6*67e74705SXin Li typedef __typeof__(sizeof(int)) size_t;
7*67e74705SXin Li extern "C" void *malloc(size_t);
8*67e74705SXin Li 
9*67e74705SXin Li // This is the standard placement new.
operator new(size_t,void * __p)10*67e74705SXin Li inline void* operator new(size_t, void* __p) throw()
11*67e74705SXin Li {
12*67e74705SXin Li   return __p;
13*67e74705SXin Li }
14*67e74705SXin Li 
15*67e74705SXin Li struct NoThrow {
16*67e74705SXin Li   void *operator new(size_t) throw();
17*67e74705SXin Li };
18*67e74705SXin Li 
19*67e74705SXin Li struct NoExcept {
20*67e74705SXin Li   void *operator new(size_t) noexcept;
21*67e74705SXin Li };
22*67e74705SXin Li 
23*67e74705SXin Li struct DefaultThrow {
24*67e74705SXin Li   void *operator new(size_t);
25*67e74705SXin Li };
26*67e74705SXin Li 
27*67e74705SXin Li struct ExplicitThrow {
28*67e74705SXin Li   void *operator new(size_t) throw(int);
29*67e74705SXin Li };
30*67e74705SXin Li 
testNew()31*67e74705SXin Li void testNew() {
32*67e74705SXin Li   clang_analyzer_eval(new NoThrow); // expected-warning{{UNKNOWN}}
33*67e74705SXin Li   clang_analyzer_eval(new NoExcept); // expected-warning{{UNKNOWN}}
34*67e74705SXin Li 
35*67e74705SXin Li   clang_analyzer_eval(new DefaultThrow); // expected-warning{{TRUE}}
36*67e74705SXin Li   clang_analyzer_eval(new ExplicitThrow); // expected-warning{{TRUE}}
37*67e74705SXin Li }
38*67e74705SXin Li 
testNewArray()39*67e74705SXin Li void testNewArray() {
40*67e74705SXin Li   clang_analyzer_eval(new NoThrow[2]); // expected-warning{{TRUE}}
41*67e74705SXin Li   clang_analyzer_eval(new NoExcept[2]); // expected-warning{{TRUE}}
42*67e74705SXin Li   clang_analyzer_eval(new DefaultThrow[2]); // expected-warning{{TRUE}}
43*67e74705SXin Li   clang_analyzer_eval(new ExplicitThrow[2]); // expected-warning{{TRUE}}
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li extern void *operator new[](size_t, int) noexcept;
47*67e74705SXin Li 
testNewArrayNoThrow()48*67e74705SXin Li void testNewArrayNoThrow() {
49*67e74705SXin Li   clang_analyzer_eval(new (1) NoThrow[2]); // expected-warning{{UNKNOWN}}
50*67e74705SXin Li   clang_analyzer_eval(new (1) NoExcept[2]); // expected-warning{{UNKNOWN}}
51*67e74705SXin Li   clang_analyzer_eval(new (1) DefaultThrow[2]); // expected-warning{{UNKNOWN}}
52*67e74705SXin Li   clang_analyzer_eval(new (1) ExplicitThrow[2]); // expected-warning{{UNKNOWN}}
53*67e74705SXin Li }
54