13030eb82593097502469a8b3fc26112c79c75605John McCall// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
23bb92693c3332c1e99870a4e45afff3892e1c6aeAnders Carlsson
33030eb82593097502469a8b3fc26112c79c75605John McCall// CHECK: @_ZN5test11A1aE = constant i32 10, align 4
43030eb82593097502469a8b3fc26112c79c75605John McCall// CHECK: @_ZN5test212_GLOBAL__N_11AIiE1xE = internal global i32 0, align 4
599ace16bc6962f1fc3dc45bbbdf2eb74e555a8adJohn McCall// CHECK: @_ZN5test31AIiE1xE = weak_odr global i32 0, align 4
699ace16bc6962f1fc3dc45bbbdf2eb74e555a8adJohn McCall// CHECK: @_ZGVN5test31AIiE1xE = weak_odr global i64 0
73bb92693c3332c1e99870a4e45afff3892e1c6aeAnders Carlsson
8b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith// CHECK: _ZN5test51U2k0E = global i32 0
9b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith// CHECK: _ZN5test51U2k1E = global i32 0
10b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith// CHECK: _ZN5test51U2k2E = constant i32 76
11b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith// CHECK-NOT: test51U2k3E
12b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith// CHECK-NOT: test51U2k4E
13b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith
143bb92693c3332c1e99870a4e45afff3892e1c6aeAnders Carlsson// PR5564.
153030eb82593097502469a8b3fc26112c79c75605John McCallnamespace test1 {
163030eb82593097502469a8b3fc26112c79c75605John McCall  struct A {
173030eb82593097502469a8b3fc26112c79c75605John McCall    static const int a = 10;
183030eb82593097502469a8b3fc26112c79c75605John McCall  };
193bb92693c3332c1e99870a4e45afff3892e1c6aeAnders Carlsson
203030eb82593097502469a8b3fc26112c79c75605John McCall  const int A::a;
213bb92693c3332c1e99870a4e45afff3892e1c6aeAnders Carlsson
223030eb82593097502469a8b3fc26112c79c75605John McCall  struct S {
233030eb82593097502469a8b3fc26112c79c75605John McCall    static int i;
243030eb82593097502469a8b3fc26112c79c75605John McCall  };
25a0d4b63d15138ca00e12df3c0573954b07ea40a8Anders Carlsson
263030eb82593097502469a8b3fc26112c79c75605John McCall  void f() {
273030eb82593097502469a8b3fc26112c79c75605John McCall    int a = S::i;
283030eb82593097502469a8b3fc26112c79c75605John McCall  }
293030eb82593097502469a8b3fc26112c79c75605John McCall}
303030eb82593097502469a8b3fc26112c79c75605John McCall
313030eb82593097502469a8b3fc26112c79c75605John McCall// Test that we don't use guards for initializing template static data
323030eb82593097502469a8b3fc26112c79c75605John McCall// members with internal linkage.
333030eb82593097502469a8b3fc26112c79c75605John McCallnamespace test2 {
343030eb82593097502469a8b3fc26112c79c75605John McCall  int foo();
353030eb82593097502469a8b3fc26112c79c75605John McCall
363030eb82593097502469a8b3fc26112c79c75605John McCall  namespace {
373030eb82593097502469a8b3fc26112c79c75605John McCall    template <class T> struct A {
383030eb82593097502469a8b3fc26112c79c75605John McCall      static int x;
393030eb82593097502469a8b3fc26112c79c75605John McCall    };
403030eb82593097502469a8b3fc26112c79c75605John McCall
413030eb82593097502469a8b3fc26112c79c75605John McCall    template <class T> int A<T>::x = foo();
423030eb82593097502469a8b3fc26112c79c75605John McCall    template struct A<int>;
433030eb82593097502469a8b3fc26112c79c75605John McCall  }
443030eb82593097502469a8b3fc26112c79c75605John McCall
4593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @__cxx_global_var_init()
463030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK:      [[TMP:%.*]] = call i32 @_ZN5test23fooEv()
473030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK-NEXT: store i32 [[TMP]], i32* @_ZN5test212_GLOBAL__N_11AIiE1xE, align 4
483030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK-NEXT: ret void
493030eb82593097502469a8b3fc26112c79c75605John McCall}
503030eb82593097502469a8b3fc26112c79c75605John McCall
513030eb82593097502469a8b3fc26112c79c75605John McCall// Test that we don't use threadsafe statics when initializing
523030eb82593097502469a8b3fc26112c79c75605John McCall// template static data members.
533030eb82593097502469a8b3fc26112c79c75605John McCallnamespace test3 {
543030eb82593097502469a8b3fc26112c79c75605John McCall  int foo();
553030eb82593097502469a8b3fc26112c79c75605John McCall
563030eb82593097502469a8b3fc26112c79c75605John McCall  template <class T> struct A {
573030eb82593097502469a8b3fc26112c79c75605John McCall    static int x;
583030eb82593097502469a8b3fc26112c79c75605John McCall  };
593030eb82593097502469a8b3fc26112c79c75605John McCall
603030eb82593097502469a8b3fc26112c79c75605John McCall  template <class T> int A<T>::x = foo();
613030eb82593097502469a8b3fc26112c79c75605John McCall  template struct A<int>;
623030eb82593097502469a8b3fc26112c79c75605John McCall
6393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @__cxx_global_var_init1()
643030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK:      [[GUARDBYTE:%.*]] = load i8* bitcast (i64* @_ZGVN5test31AIiE1xE to i8*)
653030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK-NEXT: [[UNINITIALIZED:%.*]] = icmp eq i8 [[GUARDBYTE]], 0
663030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK-NEXT: br i1 [[UNINITIALIZED]]
673030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK:      [[TMP:%.*]] = call i32 @_ZN5test33fooEv()
683030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK-NEXT: store i32 [[TMP]], i32* @_ZN5test31AIiE1xE, align 4
693030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK-NEXT: store i64 1, i64* @_ZGVN5test31AIiE1xE
703030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK-NEXT: br label
713030eb82593097502469a8b3fc26112c79c75605John McCall  // CHECK:      ret void
72a0d4b63d15138ca00e12df3c0573954b07ea40a8Anders Carlsson}
73c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
74c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// Test that we can fold member lookup expressions which resolve to static data
75c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith// members.
76c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smithnamespace test4 {
77c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  struct A {
78c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    static const int n = 76;
79c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  };
80c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith
81c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  int f(A *a) {
8293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define i32 @_ZN5test41fEPNS_1AE
83c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    // CHECK: ret i32 76
84c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith    return a->n;
85c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith  }
86c49bd11f96c2378969822f1f1b814ffa8f2bfee4Richard Smith}
87b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith
88b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith// Test that static data members in unions behave properly.
89b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smithnamespace test5 {
90b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  union U {
91b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith    static int k0;
92b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith    static const int k1;
93b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith    static const int k2 = 76;
94b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith    static const int k3;
95b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith    static const int k4 = 81;
96b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  };
97b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  int U::k0;
98b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  const int U::k1 = (k0 = 9, 42);
99b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  const int U::k2;
100b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith
101b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  // CHECK: store i32 9, i32* @_ZN5test51U2k0E
102b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  // CHECK: store i32 {{.*}}, i32* @_ZN5test51U2k1E
103b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith  // CHECK-NOT: store {{.*}} i32* @_ZN5test51U2k2E
104b9c64d84ea3edd5e2fffb0a2e85ca1308be4f429Richard Smith}
105