1*1ec1cdcfSFred Tingaud // RUN: %clang_analyze_cc1 -analyzer-checker=debug.AnalysisOrder -analyzer-config c++-allocator-inlining=true,debug.AnalysisOrder:PreStmtCXXNewExpr=true,debug.AnalysisOrder:PostStmtCXXNewExpr=true,debug.AnalysisOrder:PreCall=true,debug.AnalysisOrder:PostCall=true,debug.AnalysisOrder:NewAllocator=true %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-INLINE
2*1ec1cdcfSFred Tingaud // RUN: %clang_analyze_cc1 -analyzer-checker=debug.AnalysisOrder -analyzer-config c++-allocator-inlining=false,debug.AnalysisOrder:PreStmtCXXNewExpr=true,debug.AnalysisOrder:PostStmtCXXNewExpr=true,debug.AnalysisOrder:PreCall=true,debug.AnalysisOrder:PostCall=true,debug.AnalysisOrder:NewAllocator=true %s 2>&1 | FileCheck %s  --check-prefixes=CHECK,CHECK-NO-INLINE
3*1ec1cdcfSFred Tingaud 
4*1ec1cdcfSFred Tingaud #include "Inputs/system-header-simulator-cxx.h"
5*1ec1cdcfSFred Tingaud 
6*1ec1cdcfSFred Tingaud namespace std {
7*1ec1cdcfSFred Tingaud void *malloc(size_t);
8*1ec1cdcfSFred Tingaud void free(void *);
9*1ec1cdcfSFred Tingaud } // namespace std
10*1ec1cdcfSFred Tingaud 
operator new(size_t size)11*1ec1cdcfSFred Tingaud void *operator new(size_t size) { return std::malloc(size); }
operator delete(void * ptr)12*1ec1cdcfSFred Tingaud void operator delete(void *ptr) { std::free(ptr); }
13*1ec1cdcfSFred Tingaud 
14*1ec1cdcfSFred Tingaud struct S {
SS15*1ec1cdcfSFred Tingaud   S() {}
~SS16*1ec1cdcfSFred Tingaud   ~S() {}
17*1ec1cdcfSFred Tingaud };
18*1ec1cdcfSFred Tingaud 
19*1ec1cdcfSFred Tingaud void foo();
20*1ec1cdcfSFred Tingaud 
test()21*1ec1cdcfSFred Tingaud void test() {
22*1ec1cdcfSFred Tingaud   S *s = new S();
23*1ec1cdcfSFred Tingaud   foo();
24*1ec1cdcfSFred Tingaud   delete s;
25*1ec1cdcfSFred Tingaud }
26*1ec1cdcfSFred Tingaud 
27*1ec1cdcfSFred Tingaud /*
28*1ec1cdcfSFred Tingaud void test() {
29*1ec1cdcfSFred Tingaud   S *s = new S();
30*1ec1cdcfSFred Tingaud // CHECK-INLINE:      PreCall (operator new)
31*1ec1cdcfSFred Tingaud // CHECK-INLINE-NEXT: PreCall (std::malloc)
32*1ec1cdcfSFred Tingaud // CHECK-INLINE-NEXT: PostCall (std::malloc)
33*1ec1cdcfSFred Tingaud // CHECK-INLINE-NEXT: PostCall (operator new)
34*1ec1cdcfSFred Tingaud // CHECK-INLINE-NEXT: NewAllocator
35*1ec1cdcfSFred Tingaud // CHECK-NO-INLINE: PreCall (S::S)
36*1ec1cdcfSFred Tingaud // CHECK-INLINE-NEXT: PreCall (S::S)
37*1ec1cdcfSFred Tingaud // CHECK-NEXT: PostCall (S::S)
38*1ec1cdcfSFred Tingaud // CHECK-NEXT: PreStmt<CXXNewExpr>
39*1ec1cdcfSFred Tingaud // CHECK-NEXT: PostStmt<CXXNewExpr>
40*1ec1cdcfSFred Tingaud   foo();
41*1ec1cdcfSFred Tingaud // CHECK-NEXT: PreCall (foo)
42*1ec1cdcfSFred Tingaud // CHECK-NEXT: PostCall (foo)
43*1ec1cdcfSFred Tingaud   delete s;
44*1ec1cdcfSFred Tingaud // CHECK-NEXT: PreCall (S::~S)
45*1ec1cdcfSFred Tingaud // CHECK-NEXT: PostCall (S::~S)
46*1ec1cdcfSFred Tingaud // CHECK-NEXT: PreCall (operator delete)
47*1ec1cdcfSFred Tingaud // CHECK-INLINE-NEXT: PreCall (std::free)
48*1ec1cdcfSFred Tingaud // CHECK-INLINE-NEXT: PostCall (std::free)
49*1ec1cdcfSFred Tingaud // CHECK-NEXT: PostCall (operator delete)
50*1ec1cdcfSFred Tingaud }
51*1ec1cdcfSFred Tingaud 
52*1ec1cdcfSFred Tingaud void operator delete(void *ptr) {
53*1ec1cdcfSFred Tingaud   std::free(ptr);
54*1ec1cdcfSFred Tingaud // CHECK-NO-INLINE-NEXT: PreCall (std::free)
55*1ec1cdcfSFred Tingaud // CHECK-NO-INLINE-NEXT: PostCall (std::free)
56*1ec1cdcfSFred Tingaud }
57*1ec1cdcfSFred Tingaud 
58*1ec1cdcfSFred Tingaud void *operator new(size_t size) {
59*1ec1cdcfSFred Tingaud   return std::malloc(size);
60*1ec1cdcfSFred Tingaud // CHECK-NO-INLINE-NEXT: PreCall (std::malloc)
61*1ec1cdcfSFred Tingaud // CHECK-NO-INLINE-NEXT: PostCall (std::malloc)
62*1ec1cdcfSFred Tingaud }
63*1ec1cdcfSFred Tingaud */
64