diff options
Diffstat (limited to 'clang/test/Analysis/stack-frame-context-revision.cpp')
-rw-r--r-- | clang/test/Analysis/stack-frame-context-revision.cpp | 37 |
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'. + } +} |