xref: /llvm-project/clang/test/Analysis/end-function-return-stmt.cpp (revision 38679fd63025bb2939e12c86f85f699dd60e866d)
1*38679fd6SReka Kovacs //RUN: %clang_analyze_cc1 -analyzer-checker=debug.AnalysisOrder -analyzer-config debug.AnalysisOrder:EndFunction=true %s 2>&1 | FileCheck %s
2*38679fd6SReka Kovacs 
3*38679fd6SReka Kovacs // At the end of a function, we can only obtain a ReturnStmt if the last
4*38679fd6SReka Kovacs // CFGElement in the CFGBlock is either a CFGStmt or a CFGAutomaticObjDtor.
5*38679fd6SReka Kovacs 
noReturnStmt()6*38679fd6SReka Kovacs void noReturnStmt() {}
7*38679fd6SReka Kovacs 
8*38679fd6SReka Kovacs struct S {
9*38679fd6SReka Kovacs   S();
10*38679fd6SReka Kovacs   ~S();
11*38679fd6SReka Kovacs };
12*38679fd6SReka Kovacs 
dtorAfterReturnStmt()13*38679fd6SReka Kovacs int dtorAfterReturnStmt() {
14*38679fd6SReka Kovacs   S s;
15*38679fd6SReka Kovacs   return 0;
16*38679fd6SReka Kovacs }
17*38679fd6SReka Kovacs 
endsWithReturnStmt()18*38679fd6SReka Kovacs S endsWithReturnStmt() {
19*38679fd6SReka Kovacs   return S();
20*38679fd6SReka Kovacs }
21*38679fd6SReka Kovacs 
22*38679fd6SReka Kovacs // endsWithReturnStmt()
23*38679fd6SReka Kovacs // CHECK:      EndFunction
24*38679fd6SReka Kovacs // CHECK-NEXT: ReturnStmt: yes
25*38679fd6SReka Kovacs // CHECK-NEXT: CFGElement: CFGStmt
26*38679fd6SReka Kovacs 
27*38679fd6SReka Kovacs // dtorAfterReturnStmt()
28*38679fd6SReka Kovacs // CHECK:      EndFunction
29*38679fd6SReka Kovacs // CHECK-NEXT: ReturnStmt: yes
30*38679fd6SReka Kovacs // CHECK-NEXT: CFGElement: CFGAutomaticObjDtor
31*38679fd6SReka Kovacs 
32*38679fd6SReka Kovacs // noReturnStmt()
33*38679fd6SReka Kovacs // CHECK:      EndFunction
34*38679fd6SReka Kovacs // CHECK-NEXT: ReturnStmt: no
35