29 lines
		
	
	
		
			761 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			29 lines
		
	
	
		
			761 B
		
	
	
	
		
			C
		
	
	
	
// RUN: %clang_cc1 -emit-llvm -o - %s
 | 
						|
// <rdar://problem/6108358>
 | 
						|
 | 
						|
/* For posterity, the issue here begins initial "char []" decl for
 | 
						|
 * s. This is a tentative definition and so a global was being
 | 
						|
 * emitted, however the mapping in GlobalDeclMap referred to a bitcast
 | 
						|
 * of this global.
 | 
						|
 *
 | 
						|
 * The problem was that later when the correct definition for s is
 | 
						|
 * emitted we were doing a RAUW on the old global which was destroying
 | 
						|
 * the bitcast in the GlobalDeclMap (since it cannot be replaced
 | 
						|
 * properly), leaving a dangling pointer.
 | 
						|
 *
 | 
						|
 * The purpose of bar is just to trigger a use of the old decl
 | 
						|
 * sometime after the dangling pointer has been introduced.
 | 
						|
 */
 | 
						|
 | 
						|
char s[];
 | 
						|
 | 
						|
static void bar(void *db) {
 | 
						|
  eek(s);
 | 
						|
}
 | 
						|
 | 
						|
char s[5] = "hi";
 | 
						|
 | 
						|
int foo() {
 | 
						|
  bar(0);
 | 
						|
}
 |