summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/stack-frame-context-revision.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Analysis/stack-frame-context-revision.cpp')
-rw-r--r--clang/test/Analysis/stack-frame-context-revision.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/clang/test/Analysis/stack-frame-context-revision.cpp b/clang/test/Analysis/stack-frame-context-revision.cpp
new file mode 100644
index 00000000000..8c119f50c14
--- /dev/null
+++ b/clang/test/Analysis/stack-frame-context-revision.cpp
@@ -0,0 +1,37 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDelete -verify %s
+
+// expected-no-diagnostics:
+// From now the profile of the 'StackFrameContext' also contains the
+// 'NodeBuilderContext::blockCount()'. With this addition we can distinguish
+// between the 'StackArgumentsSpaceRegion' of the 'P' arguments being different
+// on every iteration.
+
+typedef __INTPTR_TYPE__ intptr_t;
+
+template <typename PointerTy>
+struct SmarterPointer {
+ PointerTy getFromVoidPointer(void *P) const {
+ return static_cast<PointerTy>(P);
+ }
+
+ PointerTy getPointer() const {
+ return getFromVoidPointer(reinterpret_cast<void *>(Value));
+ }
+
+ intptr_t Value = 13;
+};
+
+struct Node {
+ SmarterPointer<Node *> Pred;
+};
+
+void test(Node *N) {
+ while (N) {
+ SmarterPointer<Node *> Next = N->Pred;
+ delete N;
+
+ N = Next.getPointer();
+ // no-warning: 'Use of memory after it is freed' was here as the same
+ // 'StackArgumentsSpaceRegion' purged out twice as 'P'.
+ }
+}
OpenPOWER on IntegriCloud