Home | History | Annotate | Download | only in CodeGen
      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