| // RUN: %clang_analyze_cc1 -std=c++14 -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 released' was here as the same | |
| // 'StackArgumentsSpaceRegion' purged out twice as 'P'. | |
| } | |
| } |