diff options
Diffstat (limited to 'test/CodeGenCXX/global-init.cpp')
| -rw-r--r-- | test/CodeGenCXX/global-init.cpp | 48 | 
1 files changed, 48 insertions, 0 deletions
diff --git a/test/CodeGenCXX/global-init.cpp b/test/CodeGenCXX/global-init.cpp index 8ee087e29d11..6ff9598afce1 100644 --- a/test/CodeGenCXX/global-init.cpp +++ b/test/CodeGenCXX/global-init.cpp @@ -14,6 +14,9 @@ struct D { ~D(); };  // CHECK: @c = global %struct.C zeroinitializer, align 8 +// It's okay if we ever implement the IR-generation optimization to remove this. +// CHECK: @_ZN5test3L3varE = internal constant i8* getelementptr inbounds ([7 x i8]*  +  // CHECK: call void @_ZN1AC1Ev(%struct.A* @a)  // CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.A*)* @_ZN1AD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.A* @a, i32 0, i32 0), i8* bitcast (i8** @__dso_handle to i8*))  A a; @@ -29,7 +32,52 @@ C c;  // CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.A*)* @_ZN1DD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.A* @d, i32 0, i32 0), i8* bitcast (i8** @__dso_handle to i8*))  D d; +// <rdar://problem/7458115> +namespace test1 { +  int f(); +  const int x = f();   // This has side-effects and gets emitted immediately. +  const int y = x - 1; // This gets deferred. +  const int z = ~y;    // This also gets deferred, but gets "undeferred" before y. +  int test() { return z; } +// CHECK:      define i32 @_ZN5test14testEv() + +  // All of these initializers end up delayed, so we check them later. +} + +// <rdar://problem/8246444> +namespace test2 { +  struct allocator { allocator(); ~allocator(); }; +  struct A { A(const allocator &a = allocator()); ~A(); }; + +  A a; +// CHECK: call void @_ZN5test29allocatorC1Ev( +// CHECK: invoke void @_ZN5test21AC1ERKNS_9allocatorE( +// CHECK: call void @_ZN5test29allocatorD1Ev( +// CHECK: call i32 @__cxa_atexit({{.*}} @_ZN5test21AD1Ev {{.*}} @_ZN5test21aE +} + +namespace test3 { +  // Tested at the beginning of the file. +  const char * const var = "string"; +  extern const char * const var; + +  const char *test() { return var; } +} + +// CHECK:      define internal void [[TEST1_Z_INIT:@.*]]() +// CHECK:        load i32* @_ZN5test1L1yE +// CHECK-NEXT:   xor +// CHECK-NEXT:   store i32 {{.*}}, i32* @_ZN5test1L1zE +// CHECK:      define internal void [[TEST1_Y_INIT:@.*]]() +// CHECK:        load i32* @_ZN5test1L1xE +// CHECK-NEXT:   sub +// CHECK-NEXT:   store i32 {{.*}}, i32* @_ZN5test1L1yE + +// At the end of the file, we check that y is initialized before z. +  // CHECK: define internal void @_GLOBAL__I_a() section "__TEXT,__StaticInit,regular,pure_instructions" { +// CHECK:   call void [[TEST1_Y_INIT]] +// CHECK:   call void [[TEST1_Z_INIT]]  // rdar://problem/8090834: this should be nounwind  // CHECK-NOEXC: define internal void @_GLOBAL__I_a() nounwind section "__TEXT,__StaticInit,regular,pure_instructions" {  | 
