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