| // 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); |
| } |