| // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx -analyzer-output=text -verify %s | |
| // expected-no-diagnostics | |
| typedef void *CFTypeRef; | |
| typedef struct _CFURLCacheRef *CFURLCacheRef; | |
| CFTypeRef CustomCFRetain(CFTypeRef); | |
| void invalidate(void *); | |
| struct S1 { | |
| CFTypeRef s; | |
| CFTypeRef returnFieldAtPlus0() { | |
| return s; | |
| } | |
| }; | |
| struct S2 { | |
| S1 *s1; | |
| }; | |
| void foo(S1 *s1) { | |
| invalidate(s1); | |
| S2 s2; | |
| s2.s1 = s1; | |
| CustomCFRetain(s1->returnFieldAtPlus0()); | |
| // Definitely no leak end-of-path note here. The retained pointer | |
| // is still accessible through s1 and s2. | |
| ((void) 0); // no-warning | |
| // FIXME: Ideally we need to warn after this invalidate(). The per-function | |
| // retain-release contract is violated: the programmer should release | |
| // the symbol after it was retained, within the same function. | |
| invalidate(&s2); | |
| } |