blob: 4eeda3d428675799e9bac218b35673636b0ff8ff [file] [log] [blame]
John McCall3030eb82010-11-06 09:44:32 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
Anders Carlsson3bb92692010-01-26 17:43:42 +00002
John McCall3030eb82010-11-06 09:44:32 +00003// CHECK: @_ZN5test11A1aE = constant i32 10, align 4
4// CHECK: @_ZN5test212_GLOBAL__N_11AIiE1xE = internal global i32 0, align 4
John McCall99ace162011-04-12 01:46:54 +00005// CHECK: @_ZN5test31AIiE1xE = weak_odr global i32 0, align 4
6// CHECK: @_ZGVN5test31AIiE1xE = weak_odr global i64 0
Anders Carlsson3bb92692010-01-26 17:43:42 +00007
8// PR5564.
John McCall3030eb82010-11-06 09:44:32 +00009namespace test1 {
10 struct A {
11 static const int a = 10;
12 };
Anders Carlsson3bb92692010-01-26 17:43:42 +000013
John McCall3030eb82010-11-06 09:44:32 +000014 const int A::a;
Anders Carlsson3bb92692010-01-26 17:43:42 +000015
John McCall3030eb82010-11-06 09:44:32 +000016 struct S {
17 static int i;
18 };
Anders Carlssona0d4b632009-09-02 21:01:21 +000019
John McCall3030eb82010-11-06 09:44:32 +000020 void f() {
21 int a = S::i;
22 }
23}
24
25// Test that we don't use guards for initializing template static data
26// members with internal linkage.
27namespace test2 {
28 int foo();
29
30 namespace {
31 template <class T> struct A {
32 static int x;
33 };
34
35 template <class T> int A<T>::x = foo();
36 template struct A<int>;
37 }
38
39 // CHECK: define internal void @__cxx_global_var_init()
40 // CHECK: [[TMP:%.*]] = call i32 @_ZN5test23fooEv()
41 // CHECK-NEXT: store i32 [[TMP]], i32* @_ZN5test212_GLOBAL__N_11AIiE1xE, align 4
42 // CHECK-NEXT: ret void
43}
44
45// Test that we don't use threadsafe statics when initializing
46// template static data members.
47namespace test3 {
48 int foo();
49
50 template <class T> struct A {
51 static int x;
52 };
53
54 template <class T> int A<T>::x = foo();
55 template struct A<int>;
56
57 // CHECK: define internal void @__cxx_global_var_init1()
58 // CHECK: [[GUARDBYTE:%.*]] = load i8* bitcast (i64* @_ZGVN5test31AIiE1xE to i8*)
59 // CHECK-NEXT: [[UNINITIALIZED:%.*]] = icmp eq i8 [[GUARDBYTE]], 0
60 // CHECK-NEXT: br i1 [[UNINITIALIZED]]
61 // CHECK: [[TMP:%.*]] = call i32 @_ZN5test33fooEv()
62 // CHECK-NEXT: store i32 [[TMP]], i32* @_ZN5test31AIiE1xE, align 4
63 // CHECK-NEXT: store i64 1, i64* @_ZGVN5test31AIiE1xE
64 // CHECK-NEXT: br label
65 // CHECK: ret void
Anders Carlssona0d4b632009-09-02 21:01:21 +000066}
Richard Smithc49bd112011-10-28 17:51:58 +000067
68// Test that we can fold member lookup expressions which resolve to static data
69// members.
70namespace test4 {
71 struct A {
72 static const int n = 76;
73 };
74
75 int f(A *a) {
76 // CHECK: define i32 @_ZN5test41fEPNS_1AE
77 // CHECK: ret i32 76
78 return a->n;
79 }
80}