static-init.cpp revision 93013b235680b184be3cda150bcd6456944415f4
1// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
2
3// CHECK: @_ZZ1hvE1i = internal global i32 0, align 4
4
5// CHECK: @_ZZN5test1L6getvarEiE3var = internal constant [4 x i32] [i32 1, i32 0, i32 2, i32 4], align 16
6// CHECK: @_ZZ2h2vE1i = linkonce_odr global i32 0
7// CHECK: @_ZGVZ2h2vE1i = linkonce_odr global i64 0
8
9struct A {
10  A();
11  ~A();
12};
13
14void f() {
15  // CHECK: load atomic i8* bitcast (i64* @_ZGVZ1fvE1a to i8*) acquire, align 1
16  // CHECK: call i32 @__cxa_guard_acquire
17  // CHECK: call void @_ZN1AC1Ev
18  // CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.A*)* @_ZN1AD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.A* @_ZZ1fvE1a, i32 0, i32 0), i8* bitcast (i8** @__dso_handle to i8*))
19  // CHECK: call void @__cxa_guard_release
20  static A a;
21}
22
23void g() {
24  // CHECK: call noalias i8* @_Znwm(i64 1)
25  // CHECK: call void @_ZN1AC1Ev(
26  static A& a = *new A;
27}
28
29int a();
30void h() {
31  static const int i = a();
32}
33
34inline void h2() {
35  static int i = a();
36}
37
38void h3() {
39  h2();
40}
41
42// PR6980: this shouldn't crash
43namespace test0 {
44  struct A { A(); };
45  __attribute__((noreturn)) int throw_exception();
46
47  void test() {
48    throw_exception();
49    static A r;
50  }
51}
52
53namespace test1 {
54  // CHECK: define internal i32 @_ZN5test1L6getvarEi(
55  static inline int getvar(int index) {
56    static const int var[] = { 1, 0, 2, 4 };
57    return var[index];
58  }
59
60  void test() { (void) getvar(2); }
61}
62