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