summaryrefslogtreecommitdiff
path: root/test/Analysis/end-function-return-stmt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/end-function-return-stmt.cpp')
-rw-r--r--test/Analysis/end-function-return-stmt.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/test/Analysis/end-function-return-stmt.cpp b/test/Analysis/end-function-return-stmt.cpp
new file mode 100644
index 0000000000000..036ccba3aa932
--- /dev/null
+++ b/test/Analysis/end-function-return-stmt.cpp
@@ -0,0 +1,34 @@
+//RUN: %clang_analyze_cc1 -analyzer-checker=debug.AnalysisOrder -analyzer-config debug.AnalysisOrder:EndFunction=true %s 2>&1 | FileCheck %s
+
+// At the end of a function, we can only obtain a ReturnStmt if the last
+// CFGElement in the CFGBlock is either a CFGStmt or a CFGAutomaticObjDtor.
+
+void noReturnStmt() {}
+
+struct S {
+ S();
+ ~S();
+};
+
+int dtorAfterReturnStmt() {
+ S s;
+ return 0;
+}
+
+S endsWithReturnStmt() {
+ return S();
+}
+
+// endsWithReturnStmt()
+// CHECK: EndFunction
+// CHECK-NEXT: ReturnStmt: yes
+// CHECK-NEXT: CFGElement: CFGStmt
+
+// dtorAfterReturnStmt()
+// CHECK: EndFunction
+// CHECK-NEXT: ReturnStmt: yes
+// CHECK-NEXT: CFGElement: CFGAutomaticObjDtor
+
+// noReturnStmt()
+// CHECK: EndFunction
+// CHECK-NEXT: ReturnStmt: no