1// A global constructor from a non-instrumented part calls a function
2// in an instrumented part.
3// Regression test for https://code.google.com/p/address-sanitizer/issues/detail?id=363.
4
5// RUN: %clangxx      -DINSTRUMENTED_PART=0 -c %s -o %t-uninst.o
6// RUN: %clangxx_asan -DINSTRUMENTED_PART=1 -c %s -o %t-inst.o
7// RUN: %clangxx_asan %t-uninst.o %t-inst.o -o %t
8
9// RUN: %run %t 2>&1 | FileCheck %s
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14
15void func(char *ptr);
16
17#if INSTRUMENTED_PART == 1
18
19void func(char *ptr) {
20  *ptr = 'X';
21}
22
23#else // INSTRUMENTED_PART == 1
24
25struct C1 {
26  C1() {
27    printf("Hello ");
28    char buffer[10] = "world";
29    func(buffer);
30    printf("%s\n", buffer);
31  }
32};
33
34C1 *obj = new C1();
35
36int main(int argc, const char *argv[]) {
37  return 0;
38}
39
40#endif // INSTRUMENTED_PART == 1
41
42// CHECK: Hello Xorld
43