34 lines
		
	
	
		
			840 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			840 B
		
	
	
	
		
			C++
		
	
	
	
// 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);
 | 
						|
}
 |