2009-12-16 04:14:24 +08:00
|
|
|
// RUN: %clang_cc1 -emit-llvm -o - %s
|
2008-07-31 00:32:24 +08:00
|
|
|
// <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";
|
|
|
|
|
2022-02-13 21:02:46 +08:00
|
|
|
int foo(void) {
|
2008-07-31 00:32:24 +08:00
|
|
|
bar(0);
|
|
|
|
}
|