1 | // RUN: %clang_cc1 -emit-llvm -o - %s |
2 | // <rdar://problem/6108358> |
3 | |
4 | /* For posterity, the issue here begins initial "char []" decl for |
5 | * s. This is a tentative definition and so a global was being |
6 | * emitted, however the mapping in GlobalDeclMap referred to a bitcast |
7 | * of this global. |
8 | * |
9 | * The problem was that later when the correct definition for s is |
10 | * emitted we were doing a RAUW on the old global which was destroying |
11 | * the bitcast in the GlobalDeclMap (since it cannot be replaced |
12 | * properly), leaving a dangling pointer. |
13 | * |
14 | * The purpose of bar is just to trigger a use of the old decl |
15 | * sometime after the dangling pointer has been introduced. |
16 | */ |
17 | |
18 | char s[]; |
19 | |
20 | static void bar(void *db) { |
21 | eek(s); |
22 | } |
23 | |
24 | char s[5] = "hi"; |
25 | |
26 | int foo() { |
27 | bar(0); |
28 | } |
29 | |